popov . dev

Main

Library

Articles

Как разрабатыват...

Как разрабатывать игры на языке Python?

Простота и универсальность Python делают его отличным выбором для разработки игр. В этом руководстве мы создадим классическую игру Snake, используя библиотеку pygame. Рассмотрим пошаговый процесс.

Шаг 1: Настройка среды

Прежде чем мы начнем, убедитесь, что у вас установлена pygame. Вы можете установить ее через pip:

pip install pygame

Шаг 2: Инициализация pygame и игрового окна

Мы начинаем с инициализации pygame и настройки игрового окна нужных размеров.

import pygame
import random
import sys

# Константы игры
WIDTH = 800 # Ширина
HEIGHT = 600 # Высота
SPEED = 10 # Скорость перемещения
BLOCK_SIZE = 20 # Размер блока

# Определяем цвета
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (255, 0, 0)

class SnakeGame:
    def __init__(self):
        pygame.init()
        self.screen = pygame.display.set_mode((WIDTH, HEIGHT))
        pygame.display.set_caption("Змейка")
        self.clock = pygame.time.Clock()

Шаг 3: Инициализация змеи и пищи

Мы инициализируем позиции змеи и еды. Змея представлена в виде списка кортежей (x, y), а позиция еды генерируется случайным образом в игровом окне.

class SnakeGame:
    def __init__(self):
        # Приведенный выше код для инициализации...

        # Создадим змею и еду
        self.snake = [(200, 200), (190, 200), (180, 200)]
        self.food = (random.randint(0, WIDTH - BLOCK_SIZE) // BLOCK_SIZE * BLOCK_SIZE,
            random.randint(0, HEIGHT - BLOCK_SIZE) // BLOCK_SIZE * BLOCK_SIZE)
        self.direction = 'right'
        self.score = 0

Шаг 4: Обработка пользовательского ввода

Мы используем данные о нажатых клавишах, чтобы изменить направление движения змеи.

class SnakeGame:
    def run(self):
        while True:
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    pygame.quit()
                    sys.exit()
                elif event.type == pygame.KEYDOWN:
                    if event.key == pygame.K_UP and self.direction != 'down':
                        self.direction = 'up'
                    elif event.key == pygame.K_DOWN and self.direction != 'up':
                        self.direction = 'down'
                    elif event.key == pygame.K_LEFT and self.direction != 'right':
                        self.direction = 'left'
                    elif event.key == pygame.K_RIGHT and self.direction != 'left':
                        self.direction = 'right'

Шаг 5: Обновление положения змеи и проверка на наличие столкновений

Мы обновляем положение змеи в зависимости от ее направления и проверяем, нет ли столкновений с границами игры и с ней самой.

class SnakeGame:
    def run(self):
        while True:
            # Предыдущий код...

            # Движение змеи
            head = self.snake[0]
            if self.direction == 'right':
                new_head = (head[0] + BLOCK_SIZE, head[1])
            elif self.direction == 'left':
                new_head = (head[0] - BLOCK_SIZE, head[1])
            elif self.direction == 'up':
                new_head = (head[0], head[1] - BLOCK_SIZE)
            elif self.direction == 'down':
                new_head = (head[0], head[1] + BLOCK_SIZE)

            if new_head in self.snake or new_head[0] < 0 or new_head[0] >= WIDTH or new_head[1] < 0 or new_head[1] >= HEIGHT:
                print('Конец игры!')
                pygame.quit()
                sys.exit()

            if new_head == self.food:
                self.score += 1
                self.food = (random.randint(0, WIDTH - BLOCK_SIZE) // BLOCK_SIZE * BLOCK_SIZE,
                    random.randint(0, HEIGHT - BLOCK_SIZE) // BLOCK_SIZE * BLOCK_SIZE)
            else:
                self.snake.insert(0, new_head)
                if len(self.snake) > self.score + 1:
                    self.snake.pop()

Шаг 6: Отрисовка графики

Мы рисуем на экране змею, еду и результат игры.

class SnakeGame:
    def run(self):
        while True:
            # Предыдущий код...

            # Рисуем все
            self.screen.fill(BLACK)
            for x, y in self.snake:
                pygame.draw.rect(self.screen, WHITE, (x, y, BLOCK_SIZE, BLOCK_SIZE))
            pygame.draw.rect(self.screen, RED, (*self.food, BLOCK_SIZE, BLOCK_SIZE))

            font = pygame.font.Font(None, 36)
            text = font.render("Счет: " + str(self.score), True, WHITE)
            self.screen.blit(text, (10, 10))

            # Обновление экрана
            pygame.display.flip()
            self.clock.tick(SPEED)

Шаг 7: Запуск игры

Наконец, мы создаем экземпляр игрового класса Snake и запускаем игру.

if __name__ == "__main__":
    game = SnakeGame()
    game.run()

Заключение

Поздравляю! Вы успешно создали игру Змейка на Python с помощью pygame. Этот проект демонстрирует основные концепции разработки игры, включая обработку пользовательского ввода, обновление состояния игры и рендеринг графики. Не стесняйтесь совершенствовать игру, добавляя такие функции, как звуковые эффекты, высокие баллы или дополнительные уровни.

Весь код полностью:

import pygame
import random
import sys

# Константы игры
WIDTH = 800 # Ширина
HEIGHT = 600 # Высота
SPEED = 10 # Скорость перемещения
BLOCK_SIZE = 20 # Размер блока

# Определяем цвета
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (255, 0, 0)

class SnakeGame:
    def __init__(self):
        pygame.init()
        self.screen = pygame.display.set_mode((WIDTH, HEIGHT))
        pygame.display.set_caption("Змейка")
        self.clock = pygame.time.Clock()

        # Создадим змею и еду
        self.snake = [(200, 200), (190, 200), (180, 200)]
        self.food = (random.randint(0, WIDTH - BLOCK_SIZE) // BLOCK_SIZE * BLOCK_SIZE,
            random.randint(0, HEIGHT - BLOCK_SIZE) // BLOCK_SIZE * BLOCK_SIZE)
        self.direction = 'right'
        self.score = 0

    def run(self):
        while True:
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    pygame.quit()
                    sys.exit()
                elif event.type == pygame.KEYDOWN:
                    if event.key == pygame.K_UP and self.direction != 'down':
                        self.direction = 'up'
                    elif event.key == pygame.K_DOWN and self.direction != 'up':
                        self.direction = 'down'
                    elif event.key == pygame.K_LEFT and self.direction != 'right':
                        self.direction = 'left'
                    elif event.key == pygame.K_RIGHT and self.direction != 'left':
                        self.direction = 'right'

            # Движение змеи
            head = self.snake[0]
            if self.direction == 'right':
                new_head = (head[0] + BLOCK_SIZE, head[1])
            elif self.direction == 'left':
                new_head = (head[0] - BLOCK_SIZE, head[1])
            elif self.direction == 'up':
                new_head = (head[0], head[1] - BLOCK_SIZE)
            elif self.direction == 'down':
                new_head = (head[0], head[1] + BLOCK_SIZE)

            if new_head in self.snake or new_head[0] < 0 or new_head[0] >= WIDTH or new_head[1] < 0 or new_head[1] >= HEIGHT:
                print('Конец игры!')
                pygame.quit()
                sys.exit()

            if new_head == self.food:
                self.score += 1
                self.food = (random.randint(0, WIDTH - BLOCK_SIZE) // BLOCK_SIZE * BLOCK_SIZE,
                    random.randint(0, HEIGHT - BLOCK_SIZE) // BLOCK_SIZE * BLOCK_SIZE)
            else:
                self.snake.insert(0, new_head)
                if len(self.snake) > self.score + 1:
                    self.snake.pop()

            # Рисуем все
            self.screen.fill(BLACK)
            for x, y in self.snake:
                pygame.draw.rect(self.screen, WHITE, (x, y, BLOCK_SIZE, BLOCK_SIZE))
            pygame.draw.rect(self.screen, RED, (*self.food, BLOCK_SIZE, BLOCK_SIZE))

            font = pygame.font.Font(None, 36)
            text = font.render("Счет: " + str(self.score), True, WHITE)
            self.screen.blit(text, (10, 10))

            # Обновление экрана
            pygame.display.flip()
            self.clock.tick(SPEED)

    def main(self):
        self.run()


if __name__ == "__main__":
    game = SnakeGame()
    game.main()

Comments

In order to leave your opinion, you need to register on the website