Примеры игровых проектов на Python с исходным кодом

Раздел: Разработка на Python -> Игровая разработка

Коды для создания игр на Python: практическое руководство

Разработка игр на Python охватывает широкий спектр подходов: от простых консольных сценариев до полноценных 2D и 3D приложений с графикой и звуком. В этой статье собраны примеры кода для разных ситуаций, от базового движения спрайта до реализации сетевого взаимодействия. Каждый вариант сопровождается пояснениями шагов, указанием типичных ошибок и способами их устранения.

Как создать игру с графикой, звуком и управлением с помощью Pygame?

Pygame - самая популярная библиотека для 2D игр на Python. Она предоставляет готовые модули для работы с экраном, спрайтами, звуком и событиями. Пример ниже создаёт окно, загружает изображение персонажа и позволяет двигать его стрелками.

import pygame
import sys

pygame.init()
screen = pygame.display.set_mode((800, 600))
clock = pygame.time.Clock()

player = pygame.image.load('player.png')
player_rect = player.get_rect()
player_rect.center = (400, 300)

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()

    keys = pygame.key.get_pressed()
    if keys[pygame.K_LEFT]:
        player_rect.x -= 5
    if keys[pygame.K_RIGHT]:
        player_rect.x += 5
    if keys[pygame.K_UP]:
        player_rect.y -= 5
    if keys[pygame.K_DOWN]:
        player_rect.y += 5

    screen.fill((0, 0, 0))
    screen.blit(player, player_rect)
    pygame.display.flip()
    clock.tick(60)

игры на python примеры (примеры игр на python)

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

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

  • pygame.error: Unable to open file - файл не найден. Решение: проверьте путь или используйте os.path.join.
  • Игра зависает или вылетает - отсутствует clock.tick, что приводит к бесконечному циклу без паузы.
  • Изображение не отображается - проверьте, что screen.fill выполняется до blit, иначе спрайт будет закрашен.

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

Консольные игры отлично подходят для текстовых квестов, головоломок или тренировки логики. Пример - игра «Угадай число» с подсказками.

import random

number = random.randint(1, 100)
attempts = 0

print('Загадано число от 1 до 100. Попробуйте угадать!')
while True:
    try:
        guess = int(input('Ваше число: '))
        attempts += 1
        if guess < number:
            print('Больше')
        elif guess > number:
            print('Меньше')
        else:
            print(f'Поздравляю! Угадано за {attempts} попыток.')
            break
    except ValueError:
        print('Введите целое число.')

Python game codes (коды для игр на python)

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

Как создать игру с графическим интерфейсом без сторонних библиотек с Tkinter?

Tkinter входит в стандартную поставку Python и позволяет создавать простые 2D игры с использованием Canvas. Пример - анимация шарика, отскакивающего от стен.

import tkinter as tk
import random

root = tk.Tk()
root.title('Отскоки')
canvas = tk.Canvas(root, width=500, height=400, bg='white')
canvas.pack()

ball = canvas.create_oval(10, 10, 50, 50, fill='red')
dx = random.choice([-3, 3])
dy = random.choice([-3, 3])

def move():
    global dx, dy
    canvas.move(ball, dx, dy)
    pos = canvas.coords(ball)
    if pos[0] <= 0 or pos[2] >= 500:
        dx = -dx
    if pos[1] <= 0 or pos[3] >= 400:
        dy = -dy
    root.after(20, move)

move()
root.mainloop()

создание игры на python (создание игры на python)

Ошибки: использование after без рекурсивного вызова приведёт к однократному движению. Необходимо вызывать функцию внутри самой себя. Также координаты canvas.coords возвращают список [x1,y1,x2,y2].

Как использовать библиотеку Arcade для создания игры с анимацией?

Arcade - современная библиотека, построенная поверх Pygame, с более дружественным API. Пример - прыгающий квадрат.

import arcade

SCREEN_WIDTH = 600
SCREEN_HEIGHT = 400

class MyGame(arcade.Window):
    def __init__(self):
        super().__init__(SCREEN_WIDTH, SCREEN_HEIGHT, 'Arcade Jump')
        self.player_x = 100
        self.player_y = 100
        self.dy = 0
        self.on_ground = True

    def on_draw(self):
        arcade.start_render()
        arcade.draw_rectangle_filled(self.player_x, self.player_y, 40, 40, arcade.color.BLUE)

    def update(self, delta_time):
        self.dy -= 0.5  # гравитация
        self.player_y += self.dy
        if self.player_y <= 20:
            self.player_y = 20
            self.dy = 0
            self.on_ground = True

    def on_key_press(self, key, modifiers):
        if key == arcade.key.SPACE and self.on_ground:
            self.dy = 10
            self.on_ground = False

MyGame()
arcade.run()

Проблемы: отсутствие on_update может привести к зависанию, нужно обязательно вызывать arcade.run(). Гравитация не должна превышать скорость платформы, иначе персонаж проваливается.

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

Pyglet даёт полный контроль над OpenGL контекстом. Пример - простой треугольник с вращением.

import pyglet
from pyglet.gl import *

window = pyglet.window.Window(400, 300, 'Pyglet Triangle')
rotation = 0

@window.event
def on_draw():
    global rotation
    glClear(GL_COLOR_BUFFER_BIT)
    glLoadIdentity()
    glRotatef(rotation, 0, 0, 1)
    glBegin(GL_TRIANGLES)
    glVertex2f(-0.5, -0.5)
    glVertex2f(0.5, -0.5)
    glVertex2f(0.0, 0.5)
    glEnd()
    rotation += 1

pyglet.app.run()

Типичные ошибки: забыть импортировать GL-константы. Некорректная инициализация окна без выполнения основного цикла. Также Pyglet требует явного вызова glClear и glLoadIdentity.

Все перечисленные варианты решают задачу создания игры на Python, но выбор зависит от цели: консоль проста для прототипов, Tkinter подходит для UI-игр, Pygame – для быстрых 2D проектов, Arcade – для образовательных целей, а Pyglet – для экспериментов с OpenGL.

Расширенные и нестандартные примеры игровых кодов

Пример 1: 3D игра с Ursina (управление персонажем и освещение)

Ursina - высокоуровневый движок на базе Panda3D, позволяющий быстро создавать 3D миры. Пример загружает модель, добавляет освещение и управление от третьего лица.

Пример
from ursina import *

app = Ursina()

player = Entity(model='cube', color=color.orange, scale=(1,1.5,1))

def update():
    player.x += held_keys['d'] * 0.1
    player.x -= held_keys['a'] * 0.1
    player.y += held_keys['w'] * 0.1
    player.y -= held_keys['s'] * 0.1

camera.position = (0, 10, -15)
camera.look_at(player)

app.run()
Откроется окно с оранжевым кубом, который можно двигать клавишами WASD. Камера автоматически следует за объектом.

Ошибки: при отсутствии Panda3D библиотека не установится через pip. Используйте pip install ursina. Также Ursina требует Python версии 3.8+.

Пример 2: Сетевая игра на Pygame через сокеты (чат и синхронизация)

Простой чат-сервер с игровым полем: игроки могут перемещать квадраты и видеть друг друга. Реализация без сторонних библиотек, только socket.

Пример
# Серверная часть (server.py)
import socket
import threading

clients = []

def handle(client):
    while True:
        try:
            data = client.recv(1024)
            if not data:
                break
            for c in clients:
                if c != client:
                    c.send(data)
        except:
            client.close()
            clients.remove(client)
            break

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(('localhost', 5555))
server.listen()

print('Сервер запущен')
while True:
    client, addr = server.accept()
    clients.append(client)
    threading.Thread(target=handle, args=(client,)).start()
Пример
# Клиентская часть с Pygame (client.py)
import pygame
import socket
import threading

client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(('localhost', 5555))

pygame.init()
screen = pygame.display.set_mode((400, 300))

x, y = 50, 50

def receive():
    global x, y
    while True:
        data = client.recv(1024).decode()
        if data:
            parts = data.split(',')
            x = int(parts[0])
            y = int(parts[1])

threading.Thread(target=receive, daemon=True).start()

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            exit()
    keys = pygame.key.get_pressed()
    if keys[pygame.K_LEFT]: x -= 1
    if keys[pygame.K_RIGHT]: x += 1
    if keys[pygame.K_UP]: y -= 1
    if keys[pygame.K_DOWN]: y += 1
    client.send(f'{x},{y}'.encode())

    screen.fill((255,255,255))
    pygame.draw.rect(screen, (0,0,255), (x, y, 20, 20))
    pygame.display.flip()
    pygame.time.Clock().tick(60)
При запуске сервера и двух клиентов два квадрата будут отображаться в одном окне (только для отладки, для двух окон нужно запускать отдельно). Каждый игрок видит свои координаты, но не чужие – в коде не реализовано отображение второго квадрата. Для полной синхронизации требуется отправлять позиции всех игроков.

Ошибки: блокирующий recv может остановить игру. Используйте потоки или асинхронный ввод-вывод. Также сокеты могут потерять соединение без обработки исключений.

Пример 3: Игра-стрелялка за 50 строк на pgzero

Pygame Zero - обёртка для Pygame, убирающая boilerplate. Пример: цель появляется случайно, игрок щёлкает по ней.

Пример
import pgzrun
import random

WIDTH = 800
HEIGHT = 600

target = Actor('target_idle', center=(400, 300))
score = 0

def draw():
    screen.clear()
    target.draw()
    screen.draw.text(f'Score: {score}', (10, 10), fontsize=50)

def update():
    pass

def on_mouse_down(pos):
    global score
    if target.collidepoint(pos):
        score += 1
        target.center = (random.randint(50, WIDTH-50), random.randint(50, HEIGHT-50))

pgzrun.go()
Окно с изображением цели (файл target_idle.png должен быть в папке images). При клике на мишень счёт увеличивается, мишень перемещается.

Ошибки: отсутствие изображения вызывает ошибку. Рекомендуется создать хотя бы простой прямоугольник-заглушку через Surface. Также pgzrun требует установки: pip install pgzero.

Пример 4: Оптимизация рендеринга с использованием Pygame и OpenGL (VBO)

Для большого количества объектов стандартный Pygame медлителен. Используя OpenGL через модуль pygame.gl, можно загружать вершины в буфер.

Пример
import pygame
from pygame.locals import *
from OpenGL.GL import *
from OpenGL.GLU import *

pygame.init()
display = (800, 600)
pygame.display.set_mode(display, DOUBLEBUF|OPENGL)
gluOrtho2D(0, 800, 0, 600)

vertices = [(100,100), (200,100), (150,200)]
vbo = glGenBuffers(1)
glBindBuffer(GL_ARRAY_BUFFER, vbo)
glBufferData(GL_ARRAY_BUFFER, len(vertices)*2*4, (GLfloat * len(vertices)*2)(*sum(vertices, ())), GL_STATIC_DRAW)
glVertexPointer(2, GL_FLOAT, 0, None)
glEnableClientState(GL_VERTEX_ARRAY)

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            exit()
    glClear(GL_COLOR_BUFFER_BIT)
    glDrawArrays(GL_TRIANGLES, 0, 3)
    pygame.display.flip()
    pygame.time.wait(10)
В окне отобразится треугольник, отрисованный с помощью OpenGL через буфер вершин. Этот метод значительно быстрее рисования через pygame.draw.

Ошибки: неправильное преобразование типов для ctypes. Используйте OpenGL.GL.ARRAY._GLfloatArray или numpy. Также не забудьте импортировать необходимые функции из OpenGL.

Эти расширенные примеры демонстрируют, как выйти за рамки стандартных решений и применить Python для более сложных игровых проектов: 3D, сетевого взаимодействия, быстрой разработки и оптимизации графики.

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

En
Python game codes (python)