Примеры игровых проектов на 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, сетевого взаимодействия, быстрой разработки и оптимизации графики.