Примеры кода игр на Python: от «Угадай число» до графических проектов

Раздел: Python -> Проекты

Создание игры на Python: основные подходы

Наиболее эффективный способ освоить программирование игр на Python - начать с простой консольной игры, например «Угадай число». Этот проект охватывает циклы, условные операторы и случайные числа. Код минимален, но позволяет понять структуру игрового цикла.

import random

secret = random.randint(1, 100)
attempt = 0

while True:
    guess = input("Угадай число от 1 до 100: ")
    if not guess.isdigit():
        print("Введите число!")
        continue
    guess = int(guess)
    attempt += 1
    if guess < secret:
        print("Загаданное число больше.")
    elif guess > secret:
        print("Загаданное число меньше.")
    else:
        print(f"Поздравляю! Угадал за {attempt} попыток.")
        break

код игры на python (код игры на python)

Пояснение шагов: 1) Импорт random для генерации числа. 2) Бесконечный цикл while True - основной игровой цикл. 3) Проверка ввода через isdigit() предотвращает ошибки преобразования. 4) Сравнение числа с секретным и вывод подсказок. 5) Выход из цикла при правильном ответе.

Типичные ошибки и их решение:

  • Забыли про continue при нечисловом вводе - программа падает. Всегда проверяйте ввод.
  • Бесконечный цикл, если не обновлять secret - случайное число генерируется один раз, это правильно.
  • Ошибка отступа - все строки внутри while должны иметь одинаковый отступ.

Как сделать игру с выбором из нескольких вариантов?

Игра «Камень, ножницы, бумага» добавляет комбинаторику. Пользователь вводит один из трёх вариантов, компьютер выбирает случайно. Результат определяется по правилам.

import random

options = ["камень", "ножницы", "бумага"]
while True:
    user = input("Выбирай: камень, ножницы, бумага (или стоп): ").lower()
    if user == "стоп":
        break
    if user not in options:
        print("Неправильный выбор!")
        continue
    comp = random.choice(options)
    print(f"Компьютер: {comp}")
    if user == comp:
        print("Ничья")
    elif (user == "камень" and comp == "ножницы") or \
         (user == "ножницы" and comp == "бумага") or \
         (user == "бумага" and comp == "камень"):
        print("Ты победил!")
    else:
        print("Компьютер победил!")

Пояснения: Используется список options для проверки ввода. Компьютер выбирает через random.choice(). Условия победы записаны через логические комбинации. Цикл прерывается по команде «стоп».

Типичные проблемы: Игрок вводит с заглавной буквы - решается .lower(). Путаница в условиях победы - помогает таблица правил.

Как реализовать игру со строками и попытками?

Игра «Виселица» тренирует работу со строками, множествами и счётчиком ошибок. Слово выбирается из списка, пользователь отгадывает буквы.

import random

words = ["python", "программа", "игра", "алгоритм"]
secret = random.choice(words)
guessed = set()
tries = 6

while tries > 0:
    display = "".join(c if c in guessed else " _" for c in secret)
    print(display)
    if "_" not in display:
        print("Ты выиграл!")
        break
    letter = input("Введи букву: ").lower()
    if len(letter) != 1 or not letter.isalpha():
        print("Введи одну букву!")
        continue
    if letter in guessed:
        print("Уже была.")
        continue
    guessed.add(letter)
    if letter not in secret:
        tries -= 1
        print(f"Осталось попыток: {tries}")
else:
    print(f"Проиграл. Слово было: {secret}")

Пояснения: Множество guessed хранит отгаданные буквы. Списочное выражение формирует текущее состояние слова. Цикл while-else вызывает блок else только если цикл завершился без break (то есть попытки кончились).

Типичные ошибки: Учёт кириллицы - .isalpha() работает корректно. Многократный ввод одной буквы - проверка через guessed. Бесконечный цикл, если не уменьшать tries.

Как создать простую 2D игру с графикой?

Использование Pygame позволяет вывести на экран движущийся квадрат. Это основа для более сложных игр.

import pygame

pygame.init()
size = (700, 500)
screen = pygame.display.set_mode(size)
clock = pygame.time.Clock()

x, y = 50, 50
speed = 5

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
    keys = pygame.key.get_pressed()
    if keys[pygame.K_LEFT]:
        x -= speed
    if keys[pygame.K_RIGHT]:
        x += speed
    if keys[pygame.K_UP]:
        y -= speed
    if keys[pygame.K_DOWN]:
        y += speed

    screen.fill((0, 0, 0))
    pygame.draw.rect(screen, (255, 0, 0), (x, y, 50, 50))
    pygame.display.flip()
    clock.tick(60)

pygame.quit()

Пояснения: Инициализация Pygame, создание окна, главный цикл обработки событий. Клавиши опрашиваются через pygame.key.get_pressed(). Квадрат рисуется функцией draw.rect. clock.tick(60) фиксирует 60 кадров в секунду.

Типичные ошибки: Не установлен pygame - установка через pip install pygame. Квадрат выходит за границы - нужно добавить проверки. Тормозит без clock.tick.

Как построить игру с ветвлением сюжета?

Текстовый квест на словарях и функциях - удобный способ создать многосценарную игру без графики.

scenes = {
    "start": {
        "text": "Ты в тёмном лесу. Куда пойти?",
        "choices": {"1": "Налево", "2": "Направо"},
        "next": {"1": "left_path", "2": "right_path"}
    },
    "left_path": {
        "text": "Ты нашел сундук. Открыть?",
        "choices": {"1": "Да", "2": "Нет"},
        "next": {"1": "treasure", "2": "end"}
    },
    "right_path": {
        "text": "Избушка на курьих ножках. Войти?",
        "choices": {"1": "Войти", "2": "Убежать"},
        "next": {"1": "babayaga", "2": "end"}
    },
    "treasure": {
        "text": "Ты нашёл золото! Победа!",
        "choices": {},
        "next": {}
    },
    "babayaga": {
        "text": "Баба-Яга угостила чаем. Конец.",
        "choices": {},
        "next": {}
    },
    "end": {
        "text": "Игра окончена.",
        "choices": {},
        "next": {}
    }
}

current = "start"
while current in scenes:
    scene = scenes[current]
    print(scene["text"])
    if not scene["choices"]:
        break
    for key, desc in scene["choices"].items():
        print(f"{key}. {desc}")
    choice = input("Выбери номер: ")
    current = scene["next"].get(choice, current)

Пояснения: Словарь scenes содержит сцены. Каждая сцена - текст, варианты выбора и указатели на следующую сцену. Цикл переходит по ключам. При пустом словаре choices игра завершается.

Типичные ошибки: Рекурсия вместо цикла - лучше использовать while. Сложность добавления новых сцен - структура словаря легко расширяется. Неверный ввод номера - проверка через get с запасным вариантом (текущая сцена).

Расширенные примеры кода игр на Python

Пример 1: Змейка на Pygame

Полноценная игра «Змейка» с управлением стрелками, ростом при съедании еды и условием проигрыша при столкновении с границей или собой.

Пример
import pygame
import random

pygame.init()
WIDTH, HEIGHT = 600, 400
CELL_SIZE = 20
screen = pygame.display.set_mode((WIDTH, HEIGHT))
clock = pygame.time.Clock()

# Цвета
BLACK = (0, 0, 0)
GREEN = (0, 255, 0)
RED = (255, 0, 0)

# Начальное положение змейки
snake = [(100, 100)]
snake_dir = (CELL_SIZE, 0)  # движение вправо

# Еда
food = (random.randrange(0, WIDTH, CELL_SIZE),
        random.randrange(0, HEIGHT, CELL_SIZE))

score = 0
running = True

while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_UP and snake_dir != (0, CELL_SIZE):
                snake_dir = (0, -CELL_SIZE)
            if event.key == pygame.K_DOWN and snake_dir != (0, -CELL_SIZE):
                snake_dir = (0, CELL_SIZE)
            if event.key == pygame.K_LEFT and snake_dir != (CELL_SIZE, 0):
                snake_dir = (-CELL_SIZE, 0)
            if event.key == pygame.K_RIGHT and snake_dir != (-CELL_SIZE, 0):
                snake_dir = (CELL_SIZE, 0)

    # Движение змейки
    head_x, head_y = snake[0]
    new_head = (head_x + snake_dir[0], head_y + snake_dir[1])

    # Границы
    if (new_head[0] < 0 or new_head[0] >= WIDTH or
        new_head[1] < 0 or new_head[1] >= HEIGHT):
        running = False
        break

    # Столкновение с собой
    if new_head in snake:
        running = False
        break

    snake.insert(0, new_head)

    # Съели еду
    if new_head == food:
        score += 1
        food = (random.randrange(0, WIDTH, CELL_SIZE),
                random.randrange(0, HEIGHT, CELL_SIZE))
    else:
        snake.pop()

    # Отрисовка
    screen.fill(BLACK)
    for segment in snake:
        pygame.draw.rect(screen, GREEN, (*segment, CELL_SIZE, CELL_SIZE))
    pygame.draw.rect(screen, RED, (*food, CELL_SIZE, CELL_SIZE))
    pygame.display.set_caption(f"Змейка | Очки: {score}")
    pygame.display.flip()
    clock.tick(10)

pygame.quit()
Результат: на экране отображается змейка, движущаяся по полю. При съедении красной еды змейка увеличивается, очки растут. При касании границы или собственного тела игра завершается. Окно закрывается.

Пример 2: Крестики-нолики с минимаксом (ИИ)

Реализация игры с искусственным интеллектом, использующим алгоритм минимакс для поиска оптимального хода. Поле 3x3, ИИ играет за 'O', игрок за 'X'.

Пример
import math

board = [" "] * 9
def print_board():
    for i in range(0, 9, 3):
        print("|" + "|".join(board[i:i+3]) + "|")

def check_winner(board, player):
    win_patterns = [(0,1,2),(3,4,5),(6,7,8),(0,3,6),(1,4,7),(2,5,8),(0,4,8),(2,4,6)]
    for a,b,c in win_patterns:
        if board[a]==board[b]==board[c]==player:
            return True
    return False

def get_available(board):
    return [i for i, val in enumerate(board) if val == " "]

def minimax(board, depth, is_max):
    if check_winner(board, "O"):
        return 10 - depth
    if check_winner(board, "X"):
        return depth - 10
    if not get_available(board):
        return 0
    if is_max:
        best = -math.inf
        for move in get_available(board):
            board[move] = "O"
            score = minimax(board, depth+1, False)
            board[move] = " "
            best = max(best, score)
        return best
    else:
        best = math.inf
        for move in get_available(board):
            board[move] = "X"
            score = minimax(board, depth+1, True)
            board[move] = " "
            best = min(best, score)
        return best

def ai_move():
    best_score = -math.inf
    best_move = None
    for move in get_available(board):
        board[move] = "O"
        score = minimax(board, 0, False)
        board[move] = " "
        if score > best_score:
            best_score = score
            best_move = move
    return best_move

# Игровой цикл
while True:
    print_board()
    if not get_available(board):
        print("Ничья!")
        break
    # Ход игрока
    try:
        move = int(input("Твой ход (0-8): "))
        if move not in get_available(board):
            print("Клетка занята!")
            continue
    except ValueError:
        print("Введи число!")
        continue
    board[move] = "X"
    if check_winner(board, "X"):
        print_board()
        print("Ты выиграл!")
        break
    # Ход ИИ
    if get_available(board):
        ai = ai_move()
        board[ai] = "O"
        print(f"ИИ походил на {ai}")
        if check_winner(board, "O"):
            print_board()
            print("ИИ выиграл!")
            break
Результат: консольная игра, где игрок вводит номер клетки (0-8), ИИ отвечает оптимальным ходом. При победе одной из сторон или заполнении поля выводится соответствующее сообщение.

Код игры на Python - comments

En
код игры на python (python)