Найти тему
IT Start | Python

Игра "Арканоид" на Python Pygame

Оглавление

"Арканоид" - это классическая аркадная игра, где игрок управляет платформой, отбивая мяч и разбивая блоки на экране.

Игра "Арканоид" на Python Pygame
Игра "Арканоид" на Python Pygame

Установка Pygame

Для начала нужно установить библиотеку pygame. Для этого в командной строке нужно прописать:

pip install pygame

Настройка окна игры

Импортируем необходимые модули и задаем размеры окна игры:

import pygame
import random

# Инициализация Pygame
pygame.init()

# Определение цветов
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
BLUE = (0, 0, 255)
RED = (255, 0, 0)
GREEN = (0, 255, 0)

# Определение размеров экрана и платформы
WIDTH = 800
HEIGHT = 600
PADDLE_WIDTH = 100
PADDLE_HEIGHT = 10

# Определение параметров мяча
BALL_RADIUS = 10
BALL_SPEED_X = 3
BALL_SPEED_Y = -3

# Определение параметров блоков
BLOCK_WIDTH = 70
BLOCK_HEIGHT = 20
BLOCK_MARGIN = 10
BLOCK_ROWS = 5
BLOCK_COLS = 10

# Создание игрового окна
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Арканоид")

clock = pygame.time.Clock()

Создание классов игровых объектов

# Определение класса платформы
class Paddle(pygame.sprite.Sprite):
def __init__(self):
super().__init__()
self.image = pygame.Surface([PADDLE_WIDTH, PADDLE_HEIGHT])
self.image.fill(BLUE)
self.rect = self.image.get_rect()
self.rect.x = (WIDTH - PADDLE_WIDTH) // 2
self.rect.y = HEIGHT - PADDLE_HEIGHT - 10
self.direction = 0
self.speed = 5

def update(self):
self.rect.x += self.direction * self.speed
if self.rect.x < 0:
self.rect.x = 0
if self.rect.x > WIDTH - PADDLE_WIDTH:
self.rect.x = WIDTH - PADDLE_WIDTH


# Определение класса мяча
class Ball(pygame.sprite.Sprite):
def __init__(self):
super().__init__()
self.image = pygame.Surface([BALL_RADIUS * 2, BALL_RADIUS * 2])
self.image.set_colorkey(BLACK)
pygame.draw.circle(self.image, RED, (BALL_RADIUS, BALL_RADIUS), BALL_RADIUS)
self.rect = self.image.get_rect()
self.rect.x = (WIDTH - BALL_RADIUS) // 2
self.rect.y = HEIGHT - PADDLE_HEIGHT - BALL_RADIUS * 2 - 10
self.speed_x = BALL_SPEED_X
self.speed_y = BALL_SPEED_Y

def update(self):
self.rect.x += self.speed_x
self.rect.y += self.speed_y
if self.rect.x < 0 or self.rect.x > WIDTH - BALL_RADIUS * 2:
self.speed_x *= -1
if self.rect.y < 0:
self.speed_y *= -1


# Определение класса блока
class Block(pygame.sprite.Sprite):
def __init__(self, x, y):
super().__init__()
self.image = pygame.Surface([BLOCK_WIDTH, BLOCK_HEIGHT])
self.image.fill(GREEN)
self.rect = self.image.get_rect()
self.rect.x = x
self.rect.y = y

Основной игровой цикл

Реализуем основной игровой цикл, в котором будет обрабатываться пользовательский ввод, обновляться состояние игры и отображаться графика:

# Генерация блоков
def create_blocks():
block_list = pygame.sprite.Group()
for row in range(BLOCK_ROWS):
for col in range(BLOCK_COLS):
block = Block(col * (BLOCK_WIDTH + BLOCK_MARGIN) + BLOCK_MARGIN,
row * (BLOCK_HEIGHT + BLOCK_MARGIN) + BLOCK_MARGIN)
block_list.add(block)
return block_list


def main():
paddle = Paddle()
ball = Ball()
blocks = create_blocks()

all_sprites = pygame.sprite.Group()
all_sprites.add(paddle)
all_sprites.add(ball)
all_sprites.add(blocks)

score = 0

running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
paddle.direction = -1
elif event.key == pygame.K_RIGHT:
paddle.direction = 1
elif event.type == pygame.KEYUP:
paddle.direction = 0

all_sprites.update()

if pygame.sprite.spritecollide(ball, blocks, True):
ball.speed_y *= -1
score += 1
if len(blocks) == 0:
running = False

if pygame.sprite.collide_rect(ball, paddle):
ball.speed_y *= -1

if ball.rect.y > HEIGHT:
running = False

screen.fill(BLACK)
all_sprites.draw(screen)
pygame.display.flip()
clock.tick(60)

pygame.quit()


# Запуск игры
if __name__ == '__main__':
main()

Результат

Игра "Арканоид" на Python Pygame
Игра "Арканоид" на Python Pygame

Итоговый код

import pygame
import random

# Инициализация Pygame
pygame.init()

# Определение цветов
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
BLUE = (0, 0, 255)
RED = (255, 0, 0)
GREEN = (0, 255, 0)

# Определение размеров экрана и платформы
WIDTH = 800
HEIGHT = 600
PADDLE_WIDTH = 100
PADDLE_HEIGHT = 10

# Определение параметров мяча
BALL_RADIUS = 10
BALL_SPEED_X = 3
BALL_SPEED_Y = -3

# Определение параметров блоков
BLOCK_WIDTH = 70
BLOCK_HEIGHT = 20
BLOCK_MARGIN = 10
BLOCK_ROWS = 5
BLOCK_COLS = 10

# Создание игрового окна
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Арканоид")

clock = pygame.time.Clock()


# Определение класса платформы
class Paddle(pygame.sprite.Sprite):
def __init__(self):
super().__init__()
self.image = pygame.Surface([PADDLE_WIDTH, PADDLE_HEIGHT])
self.image.fill(BLUE)
self.rect = self.image.get_rect()
self.rect.x = (WIDTH - PADDLE_WIDTH) // 2
self.rect.y = HEIGHT - PADDLE_HEIGHT - 10
self.direction = 0
self.speed = 5

def update(self):
self.rect.x += self.direction * self.speed
if self.rect.x < 0:
self.rect.x = 0
if self.rect.x > WIDTH - PADDLE_WIDTH:
self.rect.x = WIDTH - PADDLE_WIDTH


# Определение класса мяча
class Ball(pygame.sprite.Sprite):
def __init__(self):
super().__init__()
self.image = pygame.Surface([BALL_RADIUS * 2, BALL_RADIUS * 2])
self.image.set_colorkey(BLACK)
pygame.draw.circle(self.image, RED, (BALL_RADIUS, BALL_RADIUS), BALL_RADIUS)
self.rect = self.image.get_rect()
self.rect.x = (WIDTH - BALL_RADIUS) // 2
self.rect.y = HEIGHT - PADDLE_HEIGHT - BALL_RADIUS * 2 - 10
self.speed_x = BALL_SPEED_X
self.speed_y = BALL_SPEED_Y

def update(self):
self.rect.x += self.speed_x
self.rect.y += self.speed_y
if self.rect.x < 0 or self.rect.x > WIDTH - BALL_RADIUS * 2:
self.speed_x *= -1
if self.rect.y < 0:
self.speed_y *= -1


# Определение класса блока
class Block(pygame.sprite.Sprite):
def __init__(self, x, y):
super().__init__()
self.image = pygame.Surface([BLOCK_WIDTH, BLOCK_HEIGHT])
self.image.fill(GREEN)
self.rect = self.image.get_rect()
self.rect.x = x
self.rect.y = y


# Генерация блоков
def create_blocks():
block_list = pygame.sprite.Group()
for row in range(BLOCK_ROWS):
for col in range(BLOCK_COLS):
block = Block(col * (BLOCK_WIDTH + BLOCK_MARGIN) + BLOCK_MARGIN,
row * (BLOCK_HEIGHT + BLOCK_MARGIN) + BLOCK_MARGIN)
block_list.add(block)
return block_list


def main():
paddle = Paddle()
ball = Ball()
blocks = create_blocks()

all_sprites = pygame.sprite.Group()
all_sprites.add(paddle)
all_sprites.add(ball)
all_sprites.add(blocks)

score = 0

running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
paddle.direction = -1
elif event.key == pygame.K_RIGHT:
paddle.direction = 1
elif event.type == pygame.KEYUP:
paddle.direction = 0

all_sprites.update()

if pygame.sprite.spritecollide(ball, blocks, True):
ball.speed_y *= -1
score += 1
if len(blocks) == 0:
running = False

if pygame.sprite.collide_rect(ball, paddle):
ball.speed_y *= -1

if ball.rect.y > HEIGHT:
running = False

screen.fill(BLACK)
all_sprites.draw(screen)
pygame.display.flip()
clock.tick(60)

pygame.quit()


# Запуск игры
if __name__ == '__main__':
main()

Это основная структура идеи кода игры "Арканоид". Можно добавить дополнительные детали, такие как обработку управления клавишами и отображение информации о текущем счете и уровне.

Наука
7 млн интересуются