Разработка простых игр средствами Python

Раздел: Разработка на 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} попыток')
        break

Python игры задачи (игровые задачи на 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('Вы не сделали выбор и остались в пещере навсегда.')
Вы просыпаетесь в темной пещере.
Пойти налево или направо? лево
Вы нашли сундук с золотом. Победа!

В расширенном варианте можно использовать словари для состояний и цикл, позволяющий возвращаться к предыдущим шагам. Такой подход развивает навыки работы со структурами данных и логикой конечных автоматов.

Игровые задачи на Python - comments

En
Python игры задачи (python)