"Арканоид" - это классическая аркадная игра, где игрок управляет платформой, отбивая мяч и разбивая блоки на экране.
Установка 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()
Результат
Итоговый код
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()
Это основная структура идеи кода игры "Арканоид". Можно добавить дополнительные детали, такие как обработку управления клавишами и отображение информации о текущем счете и уровне.