Файл: Лабораторная работа 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
Контрольные вопросы:
-
ООП при реализации игровых сценариев. -
Особенность отрисовки объектов в pygame. -
Классы pygame.sprite.Sprite и pygame.sprite.Group -
Игровой цикл, передача события.