Файл: Лабораторная работа 14 Знакомство с библиотеками языка Python. PyGame.docx

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 10.01.2024

Просмотров: 69

Скачиваний: 3

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

Лабораторная работа № 14
Знакомство с библиотеками языка Python. PyGame.

Цель работы: приобретение практических навыков создания приложений на языке Python, быстрая разработка 2d игр.
Задание:

Для выполнения лабораторной работы требуется установить интерпретатор Python версии 3.5+. Выполнить написание программы-сценария в соответствии с вариантом задания (табл. 1). Провести тестирование. Оформить отчет.
Установка библиотеки
pip install pygame
Таблица 1. – Варианты задания

1.

2048 с возможностью выбора размера поля

2.

Лабиринт

3.

Домашний питомец

4.

Тетрис

5.

Space shooter

6.

Клеточный tower-defense

7.

Гонки

8.

Игра «Жизнь»

9.

Змейка

10.

PacMan

Пример игры для космической стрелялки:

Основной игровой цикл pygame:
if __name__ == "__main__":

size = width, height = 800, 800

game = Game(size)

running = True
while running:

if pygame.key.get_pressed()[pygame.K_RIGHT]:

game.player_right()

if pygame.key.get_pressed()[pygame.K_LEFT]:

game.player_left()
for event in pygame.event.get():

if event.type == pygame.QUIT:

running = False

if event.type == pygame.MOUSEBUTTONDOWN:

game.on_click(event.pos)
if event.type == pygame.KEYDOWN:

if event.key == pygame.K_SPACE:

game.player_fire()

if event.key == pygame.K_ESCAPE:

game.create_menu()
pygame.display.flip()

game.draw()

pygame.quit()
Основной игровой класс:

class Game:

def __init__(self, size):

pygame.init()

self.clock = pygame.time.Clock()

self.tick = 0

self.size = size

self.records = Recors()

self.state_game = 0 # 0 открыто меню

# 1 идет игра

# 2 информация об игре

# 3 конец игры

self.create_menu()

self.create_new_game()
def create_new_game(self):

self.screen = pygame.display.set_mode(self.size)

self.about = About(self.size)

self.end_game = TheEndGame(self.size, result=0)

self.sp_player = pygame.sprite.Group()

self.bullets = pygame.sprite.Group()

self.enemy = pygame.sprite.Group()

self.background = BackGround(self.size, 1)

self.player = Player(0, width, width // 2, height - 40)

self.sp_player.add(self.player)

self.scenario = ScenarioAsteroid(self.size[0], self.size[1])
def create_new_player(self):

player = Player(0, self.size[0], self.size[0] // 2, self.size[1] - 20)

self.player = player
def draw_background(self, tick):

self.screen.fill((0, 0, 0))

self.background.draw(self.screen, tick)
def draw(self):

self.tick = self.clock.tick()

if self.state_game == 1:

f = pygame.sprite.groupcollide(self.bullets, self.enemy, True, True)


if f:

self.records.add_hit()

for bullet, enemy in f.items():

self.scenario.remove_enemy(enemy)
self.draw_background(tick=self.tick)

self.bullets.update(tick=self.tick)

self.bullets.draw(self.screen)

self.sp_player.update(tick=self.tick)

self.sp_player.draw(self.screen)

self.enemy.update(tick=self.tick)

self.enemy.draw(self.screen)

self.records.draw(self.screen)
if self.scenario.is_end():

self.scenario = self.scenario.next_scenario()

self.start_scenario()
elif self.state_game == 0:

self.draw_background(tick=self.tick)

self.draw_menu()

elif self.state_game == 2:

self.draw_background(tick=self.tick)

self.draw_about()

elif self.state_game == 3:

self.draw_background(tick=self.tick)

self.draw_the_end_game()
def player_left(self):

self.player.move_left(self.tick)
def player_right(self):

self.player.move_right(self.tick)
def player_fire(self):

bullet = self.player.make_shot()

self.bullets.add(bullet)
def start_scenario(self):

if self.scenario.is_last():

self.state_game = 3

else:

enemys = self.scenario.get_enemys()

for enemy in enemys:

self.enemy.add(enemy)
def draw_about(self):

self.about.draw(self.screen)
def draw_menu(self):

self.menu.draw(self.screen)
def draw_the_end_game(self):

self.end_game.draw(self.screen, result=self.records.current_record)
def create_menu(self):

self.state_game = 0

self.menu = Menu(self.size)
def on_click(self, pos):

if self.state_game == 0:

self.menu.click(pos, self)
Класс для учета очков игрока

class Records:

def __init__(self):

self.current_record = 0
def add_hit(self):

self.current_record += 1
def draw(self, screen):

font = pygame.font.Font(None, 100)

textsurface = font.render(str(self.current_record), True, (255, 0, 0))

screen.blit(textsurface, (20, 20))
Модуль с формированием игровых сценариев. Обратите внимание на алгоритм формирования нового сценария и последнего сценария. Какие паттерны проектирования были использованы?
from abc import ABC, abstractmethod
from include.enemy import Asteroid, Chicken
SIZE_ASTEROID = (50, 50)

SIZE_CHICKEN = (100, 104)
class ScenarioEnemy(ABC):

def __init__(self, width_window, height_window):

self.width_window = width_window

self.height_window = height_window

self.active = 0

self.army = []
@abstractmethod

def is_last(self):

pass
@abstractmethod

def get_enemys(self):

pass
def activate(self):

self.active = 1
def remove_enemy(self, enemy):

for e in enemy:

self.army.remove(e)
def is_end(self):

if self.army:

return False

return True

class ScenarioAsteroid(ScenarioEnemy):

def is_last(self):

return False
def next_scenario(self):

return ScenarioChiken(self.width_window, self.height_window)
def get_enemys(self, count=None):

count_x = self.width_window // (SIZE_ASTEROID[0] + 3)

count_y = self.height_window // 2 // (SIZE_ASTEROID[1] + 6) - 4

for i in range(count_x):

for j in range(count_y):

self.army.append(Asteroid(

i * (SIZE_ASTEROID[0] + 3) + 25,

j * (SIZE_ASTEROID[1] + 3) + 25,

"src/asteroid.png",

SIZE_ASTEROID

))

return self.army

class ScenarioEndGame(ScenarioEnemy):

def is_last(self):

return True
def get_enemys(self):

return []

class ScenarioChiken(ScenarioEnemy):

def is_last(self):

return False
def next_scenario(self):

return ScenarioEndGame(self.width_window, self.height_window)
def get_enemys(self):

count_x = self.width_window // (SIZE_CHICKEN[0] + 3)

count_y = self.height_window // 2 // (SIZE_CHICKEN[1] + 3)

for i in range(count_x):

for j in range(count_y):

self.army.append(Chicken(

i * (SIZE_CHICKEN[0] + 5),



j * (SIZE_CHICKEN[1] + 5),

"src/chicken.png",

SIZE_CHICKEN

))

return self.army


Контрольные вопросы:


  1. ООП при реализации игровых сценариев.

  2. Особенность отрисовки объектов в pygame.

  3. Классы pygame.sprite.Sprite и pygame.sprite.Group

  4. Игровой цикл, передача события.