Файл: Лабораторная работа 14 Знакомство с библиотеками языка Python. PyGame.docx
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 10.01.2024
Просмотров: 358
Скачиваний: 6
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
Лабораторная работа № 14Знакомство с библиотеками языка Python. PyGame.Цель работы: приобретение практических навыков создания приложений на языке Python, быстрая разработка 2d игр.Задание:Для выполнения лабораторной работы требуется установить интерпретатор Python версии 3.5+. Выполнить написание программы-сценария в соответствии с вариантом задания (табл. 1). Провести тестирование. Оформить отчет.Установка библиотекиpip install pygameТаблица 1. – Варианты задания
Пример игры для космической стрелялки:Основнойигровойцикл pygame:if __name__ == "__main__":size = width, height = 800, 800game = Game(size)running = Truewhile 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 = Falseif 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 = 0self.size = sizeself.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 = playerdef 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 = 3else: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 = 0self.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 = 0def add_hit(self):self.current_record += 1def 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, abstractmethodfrom include.enemy import Asteroid, ChickenSIZE_ASTEROID = (50, 50)SIZE_CHICKEN = (100, 104)class ScenarioEnemy(ABC):def __init__(self, width_window, height_window):self.width_window = width_windowself.height_window = height_windowself.active = 0self.army = []@abstractmethoddef is_last(self):pass@abstractmethoddef get_enemys(self):passdef activate(self):self.active = 1def remove_enemy(self, enemy):for e in enemy:self.army.remove(e)def is_end(self):if self.army:return Falsereturn Trueclass ScenarioAsteroid(ScenarioEnemy):def is_last(self):return Falsedef 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) - 4for 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.armyclass ScenarioEndGame(ScenarioEnemy):def is_last(self):return Truedef get_enemys(self):return []class ScenarioChiken(ScenarioEnemy):def is_last(self):return Falsedef 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. | 2048 с возможностью выбора размера поля |
| 2. | Лабиринт |
| 3. | Домашний питомец |
| 4. | Тетрис |
| 5. | Space shooter |
| 6. | Клеточный tower-defense |
| 7. | Гонки |
| 8. | Игра «Жизнь» |
| 9. | Змейка |
| 10. | PacMan |
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 = 3else: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 = 0self.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 = 0def add_hit(self):self.current_record += 1def 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, abstractmethodfrom include.enemy import Asteroid, ChickenSIZE_ASTEROID = (50, 50)SIZE_CHICKEN = (100, 104)class ScenarioEnemy(ABC):def __init__(self, width_window, height_window):self.width_window = width_windowself.height_window = height_windowself.active = 0self.army = []@abstractmethoddef is_last(self):pass@abstractmethoddef get_enemys(self):passdef activate(self):self.active = 1def remove_enemy(self, enemy):for e in enemy:self.army.remove(e)def is_end(self):if self.army:return Falsereturn Trueclass ScenarioAsteroid(ScenarioEnemy):def is_last(self):return Falsedef 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) - 4for 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.armyclass ScenarioEndGame(ScenarioEnemy):def is_last(self):return Truedef get_enemys(self):return []class ScenarioChiken(ScenarioEnemy):def is_last(self):return Falsedef 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 -
Игровой цикл, передача события.