Разработка простых игр средствами Python
Основные подходы к созданию игровых задач на Python
Игровые задачи позволяют освоить основы программирования на практике. Разберем несколько распространенных вариантов от простых к более сложным. Главное преимущество такого подхода - немедленная обратная связь и видимый результат работы программы.
Базовое решение: игра «Угадай число»
Как реализовать игру, в которой компьютер загадывает число, а пользователь пытается его отгадать?
Компьютер выбирает случайное число в заданном диапазоне, а игрок вводит свои догадки. После каждой попытки программа сообщает, больше или меньше загаданное число. Когда число угадано, игра завершается.
import random
start = 1
end = 100
secret = random.randint(start, end)
attempts = 0
print('Угадайте число от', start, 'до', end)
while True:
guess = input('Ваш вариант: ')
if not guess.isdigit():
print('Введите целое число')
continue
guess = int(guess)
attempts += 1
if guess < secret:
print('Больше')
elif guess > secret:
print('Меньше')
else:
print(f'Поздравляю! Вы угадали за {attempts} попыток')
breakPython игры задачи (игровые задачи на python)
Типичные ошибки:
- Забывают проверить, что пользователь ввел именно число - если ввести текст, программа упадет. В примере используется
isdigit(). - Бесконечный цикл, если не предусмотреть выход при угадывании - здесь
breakрешает проблему. - Неправильный импорт модуля
random- нужно писатьimport random.
Цель базового решения - продемонстрировать использование генерации случайных чисел, циклов и условных операторов. Применяется как первый проект для новичков.
Варианты решений
Как ограничить количество попыток?
Добавляем счетчик попыток и условие досрочного завершения.
max_attempts = 7
while attempts < max_attempts:
# ... тот же код ...
else:
print(f'Вы исчерпали попытки. Загадано {secret}')Такой вариант учит работать с условиями и ограничениями. Полезен для игр с соревновательным элементом.
Как позволить пользователю задать диапазон?
Просим ввести минимальное и максимальное значение перед началом игры.
start = int(input('Нижняя граница: '))
end = int(input('Верхняя граница: '))
secret = random.randint(start, end)Здесь важно проверить, что start < end, иначе программа вызовет ошибку. Можно добавить проверку if start >= end: .... Случай использования - настройка сложности.
Как сделать игру «Камень-ножницы-бумага»?
Принцип: пользователь и компьютер выбирают один из трех вариантов, программа определяет победителя.
import random
options = ['камень', 'ножницы', 'бумага']
user_choice = input('Ваш выбор: ').lower()
if user_choice not in options:
print('Неверный вариант')
else:
comp_choice = random.choice(options)
print('Компьютер:', comp_choice)
# логика определения победителя
if user_choice == comp_choice:
print('Ничья')
elif (user_choice == 'камень' and comp_choice == 'ножницы') or \
(user_choice == 'ножницы' and comp_choice == 'бумага') or \
(user_choice == 'бумага' and comp_choice == 'камень'):
print('Вы победили!')
else:
print('Победил компьютер')Частая ошибка: пользователь вводит «Камень» с заглавной буквы. Преобразование .lower() решает проблему. Если не учесть регистр, сравнение не сработает.
Этот вариант учит работе со списками, случайным выбором и сложными условиями. Подходит для отработки логических операторов.
Как создать консольную «Виселицу»?
Игрок отгадывает слово по буквам. Компьютер выбирает слово из списка, отображает маску с угаданными буквами.
import random
words = ['python', 'программа', 'игра']
word = random.choice(words)
letters = set(word)
used = set()
tries = 6
while tries > 0 and letters:
# отображаем текущее состояние
display = [ch if ch in used else '_' for ch in word]
print(' '.join(display))
guess = input('Буква: ').lower()
if guess in used:
continue
used.add(guess)
if guess in letters:
letters.remove(guess)
else:
tries -= 1
print(f'Осталось попыток: {tries}')
if not letters:
print(f'Вы отгадали слово: {word}')
else:
print(f'Вы проиграли. Слово: {word}')Этот пример знакомит с множествами, генераторами списков и управлением состоянием. Идеально для изучения строк и структур данных.
Общие проблемы и их решения
- Бесконечный цикл - всегда предусматривайте условие выхода (break или счетчик).
- Некорректный ввод - используйте проверку типа данных (isdigit, try/except).
- Игнорирование регистра - приводите ввод к нижнему или верхнему регистру через
.lower()или.upper(). - Случайность - не забывайте импортировать
random.
Дополнительные примеры игровых задач
Игра «Крестики-нолики» (текстовый вариант)
Полная реализация игры для двух игроков на поле 3x3. Пользователи по очереди ставят X и O.
def print_board(board):
for row in board:
print('|'.join(row))
print('-' * 5)
def check_win(board, player):
# проверка строк, столбцов и диагоналей
for i in range(3):
if all(board[i][j] == player for j in range(3)): return True
if all(board[j][i] == player for j in range(3)): return True
if all(board[i][i] == player for i in range(3)): return True
if all(board[i][2-i] == player for i in range(3)): return True
return False
board = [[' ']*3 for _ in range(3)]
current = 'X'
moves = 0
while moves < 9:
print_board(board)
try:
row, col = map(int, input(f'Игрок {current}, введите строку и столбец (0-2): ').split())
if board[row][col] != ' ':
print('Клетка занята')
continue
except (ValueError, IndexError):
print('Некорректный ввод')
continue
board[row][col] = current
moves += 1
if check_win(board, current):
print_board(board)
print(f'Игрок {current} победил!')
break
current = 'O' if current == 'X' else 'X'
else:
print_board(board)
print('Ничья')Пример вывода (фрагмент): X|O|X ----- O|X| ----- | |O Игрок X победил!
Пояснение: функция check_win проверяет все возможные комбинации. Обработка исключений ловит некорректный ввод. Игра заканчивается победой или ничьей после 9 ходов.
Симуляция броска двух кубиков с накоплением статистики
Программа многократно «бросает» два кубика и выводит частоту сумм.
import random
from collections import Counter
def dice_simulation(rolls=10000):
outcomes = Counter()
for _ in range(rolls):
d1 = random.randint(1, 6)
d2 = random.randint(1, 6)
outcomes[d1 + d2] += 1
return outcomes
result = dice_simulation(10000)
for s in range(2, 13):
print(f'Сумма {s}: {result[s]} раз ({result[s]/100:.2f}%)')Сумма 2: 277 раз (2.77%) Сумма 3: 550 раз (5.50%) ... Сумма 7: 1666 раз (16.66%) ... Сумма 12: 285 раз (2.85%)
Демонстрирует работу модуля collections.Counter, циклов и генерации случайных чисел. Полезно для понимания распределения вероятностей.
Текстовый квест с ветвлением
Пользователь выбирает варианты действий, от которых зависит сюжет. Пример линейного сценария с двумя выборами.
print('Вы просыпаетесь в темной пещере.')
choice = input('Пойти (н)алево или (н)аправо? ').lower()
if choice == 'лево':
print('Вы нашли сундук с золотом. Победа!')
elif choice == 'право':
print('На вас напал дракон. Игра окончена.')
else:
print('Вы не сделали выбор и остались в пещере навсегда.')Вы просыпаетесь в темной пещере. Пойти налево или направо? лево Вы нашли сундук с золотом. Победа!
В расширенном варианте можно использовать словари для состояний и цикл, позволяющий возвращаться к предыдущим шагам. Такой подход развивает навыки работы со структурами данных и логикой конечных автоматов.