ππ» ΠΠΈΡΠ΅ΠΌ ΠΈΠ³ΡΡ Pac-Man Π½Π° Python Π² 300 ΡΡΡΠΎΠΊ ΠΊΠΎΠ΄Π°
Π Π΄Π°Π½Π½ΠΎΠΉ ΡΡΠ°ΡΡΠ΅ ΠΌΡ Π½Π°ΠΏΠΈΡΠ΅ΠΌ Π»Π΅Π³Π΅Π½Π΄Π°ΡΠ½ΡΡ ΠΈΠ³ΡΡ Pac-Man Π½Π° Python, ΡΠΌΠ΅ΡΡΠΈΠ² Π΅Π΅ Π² 300 ΡΡΡΠΎΡΠ΅ΠΊ ΠΊΠΎΠ΄Π°.
Pac-Man β ΠΊΠ»Π°ΡΡΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ΅Ρ, ΠΊΠΎΡΠΎΡΡΠΉ, Π½Π°Π²Π΅ΡΠ½ΠΎΠ΅, ΡΠ΅Π³ΠΎΠ΄Π½Ρ ΠΈΠ·Π²Π΅ΡΡΠ΅Π½ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡ. ΠΠ°Π·Π²Π°Π½ΠΈΠ΅ Β«Pac-ManΒ» ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ ΠΎΡ ΡΠΏΠΎΠ½ΡΠΊΠΎΠ³ΠΎ ΡΠ»ΠΎΠ²Π° Β«pakuΒ», ΡΡΠΎ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ ΠΎΡΠΊΡΡΠ²Π°Π½ΠΈΠ΅ ΠΈ Π·Π°ΠΊΡΡΠ²Π°Π½ΠΈΠ΅ ΡΡΠ°. Π‘ΠΎΠ·Π΄Π°ΡΠ΅Π»Ρ Π’ΠΎΡΡ ΠΠ²Π°ΡΠ°Π½ΠΈ Π²Π΄ΠΎΡ Π½ΠΎΠ²ΠΈΠ»Π° ΡΠΏΠΎΠ½ΡΠΊΠ°Ρ ΠΈΡΡΠΎΡΠΈΡ ΠΎ ΡΡΡΠ΅ΡΡΠ²Π΅, ΠΊΠΎΡΠΎΡΠΎΠ΅ Π·Π°ΡΠΈΡΠ°Π΅Ρ Π΄Π΅ΡΠ΅ΠΉ ΠΎΡ ΠΌΠΎΠ½ΡΡΡΠΎΠ², ΠΏΠΎΠ΅Π΄Π°Ρ ΠΈΡ . ΠΡΠΈ ΡΠΎΠ·Π΄Π°Π½ΠΈΠΈ ΠΈΠ³ΡΡ ΠΎΠ½ ΠΎΠΏΠΈΡΠ°Π»ΡΡ Π½Π° ΠΊΠ»ΡΡΠ΅Π²ΡΠ΅ ΡΠ»ΠΎΠ²Π° ΠΈΠ· Π»Π΅Π³Π΅Π½Π΄Ρ, Π° Π³Π»Π°Π³ΠΎΠ» Β«ΡΡΠ΅ΡΡΡΒ» ΡΡΠ°Π» ΠΎΡΠ½ΠΎΠ²ΠΎΠΉ Π²ΡΠ΅Π³ΠΎ.
(ΠΠ°Π½Π½ΠΎΠ΅ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ ΠΈ Π²ΡΠ΅ ΠΏΠΎΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ Π²Π·ΡΡΡ ΠΎΡΡΡΠ΄Π°.)
ΠΠΎΠ½ΡΡΡΡ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½Ρ Π² Π²ΠΈΠ΄Π΅ ΡΠ΅ΡΡΡΠ΅Ρ ΠΏΡΠΈΠ·ΡΠ°ΠΊΠΎΠ², ΠΊΠΎΡΠΎΡΡΠ΅ Π°ΡΠ°ΠΊΡΡΡ ΠΈΠ³ΡΠΎΠΊΠ° ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΡΠΌΠΈ Β«Π²ΠΎΠ»Π½Π°ΠΌΠΈΒ», ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ ΠΊΠΎΡΠΌΠΈΡΠ΅ΡΠΊΠΈΠΌ Π·Π°Ρ Π²Π°ΡΡΠΈΠΊΠ°ΠΌ. ΠΠ°ΠΆΠ΄ΡΠΉ ΠΏΡΠΈΠ·ΡΠ°ΠΊ ΡΠ°ΠΊΠΆΠ΅ ΠΈΠΌΠ΅Π΅Ρ ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΡΡ Π»ΠΈΡΠ½ΠΎΡΡΡ. Π ΠΈΡΡΠΎΡΠΈΠΈ Π΅ΡΡΡ Π΅ΡΠ΅ ΠΎΠ΄ΠΈΠ½ Π²Π°ΠΆΠ½ΡΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ, ΠΊΠΎΠ½ΡΠ΅ΠΏΡΠΈΡ ΠΆΠΈΠ·Π½Π΅Π½Π½ΠΎΠΉ ΡΠΈΠ»Ρ Β«ΠΊΠΎΠΊΠΎΡΠΎΒ», ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ»Π° ΡΡΡΠ΅ΡΡΠ²Π°ΠΌ ΠΏΠΎΠ΅Π΄Π°ΡΡ ΠΌΠΎΠ½ΡΡΡΠΎΠ². Π ΠΈΠ³ΡΠ΅ ΡΡΠ° ΡΠ½Π΅ΡΠ³ΠΈΡ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½Π° ββββΠ² Π²ΠΈΠ΄Π΅ ΠΏΠ΅ΡΠ΅Π½ΡΡ Ρ ΡΡΠΈΠ»Π΅Π½ΠΈΠ΅ΠΌ, ΠΊΠΎΡΠΎΡΠΎΠ΅ Π΄Π°Π΅Ρ Pac-Man ΠΊΡΠ°ΡΠΊΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡΡ ΠΏΠΎΠ΅Π΄Π°ΡΡ ΠΌΠΎΠ½ΡΡΡΠΎΠ².
Π ΡΡΠΎΠΌ ΡΡΠΎΠΊΠ΅ Ρ ΡΠ½Π°ΡΠ°Π»Π° ΠΏΡΠΎΠ²Π΅Π΄Ρ Π²Π°Ρ ΡΠ΅ΡΠ΅Π· Π±Π°Π·ΠΎΠ²ΡΡ Π½Π°ΡΡΡΠΎΠΉΠΊΡ, Π·Π°ΡΠ΅ΠΌ ΠΌΡ ΡΠΎΠ·Π΄Π°Π΄ΠΈΠΌ ΠΈΠ³ΡΠΎΠ²ΡΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΡ Π΄Π»Ρ ΡΡΠ΅Π½Ρ Π»Π°Π±ΠΈΡΠΈΠ½ΡΠ°, Pac-Man ΠΈ ΠΏΡΠΈΠ·ΡΠ°ΠΊΠΎΠ², ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠΌ ΠΏΠΎΠΈΡΠΊ ΠΏΡΡΠΈ Π² Π»Π°Π±ΠΈΡΠΈΠ½ΡΠ΅, Π·Π°Π΄Π°Π΄ΠΈΠΌ ΠΏΡΠΈΠ·ΡΠ°ΠΊΠ°ΠΌ ΡΠ»ΡΡΠ°ΠΉΠ½ΠΎΠ΅ Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΠ΅, ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅ΠΌ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΡΡΡΠ΅Π»ΠΊΠ°ΠΌΠΈ Π΄Π»Ρ ΠΈΠ³ΡΠΎΠΊΠ° ΠΈ Π½Π°ΠΊΠΎΠ½Π΅Ρ, ΡΠ°Π·ΠΌΠ΅ΡΡΠΈΠΌ Π΅Π΄Ρ Π² Π²ΠΈΠ΄Π΅ ΠΏΠ΅ΡΠ΅Π½ΡΡ ΠΏΠΎ Π²ΡΠ΅ΠΌΡ Π»Π°Π±ΠΈΡΠΈΠ½ΡΡ.
>> basic_settings
ΠΠΎΠ»ΡΡΠΈΠ²ΡΠ°ΡΡΡ ΠΈΠ³ΡΠ° ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΠΏΡΠΈΠΌΠ΅ΡΠ½ΠΎ 300 ΡΡΡΠΎΠΊ ΠΊΠΎΠ΄Π°, ΠΏΠΎΡΡΠΎΠΌΡ Ρ ΠΏΠ΅ΡΠ΅ΡΠΈΡΠ»ΡΡ Π·Π΄Π΅ΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΡΠ°ΠΌΡΠ΅ Π²Π°ΠΆΠ½ΡΠ΅ ΡΠ°ΡΡΠΈ. ΠΠΎΠ»Π½ΡΠΉ ΠΊΠΎΠ΄ Π΄ΠΎΡΡΡΠΏΠ΅Π½ Π² ΠΌΠΎΠ΅ΠΌ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΈ GitHub. ΠΠ΅ΡΠ²ΡΠΌ Π΄Π΅Π»ΠΎΠΌ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΠΌ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΠ΅ ΠΏΠ°ΠΊΠ΅ΡΡ. ΠΠ°ΠΌ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΡΡΡΡ pygame, numpy ΠΈ tcod. Π£ΡΡΠ°Π½ΠΎΠ²ΠΈΡΠ΅ ΠΈΡ Π²ΡΠ΅ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠ° pip. ΠΡΠ»ΠΈ Π²Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΠ΅ IDE, ΡΠ°ΠΊΡΡ ββΠΊΠ°ΠΊ PyCharm (Ρ ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΡ Π΅Π΅), ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠ° ΠΏΡΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ ΠΏΠΎΡΠ»Π΅ Π½Π°ΠΆΠ°ΡΠΈΡ Π½Π° ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎΠ± ΠΎΡΠΈΠ±ΠΊΠ΅ ΠΎΡΡΡΡΡΡΠ²ΡΡΡΠ΅Π³ΠΎ ΠΏΠ°ΠΊΠ΅ΡΠ°.
ΠΠΎ-ΠΏΠ΅ΡΠ²ΡΡ
, ΠΌΡ ΡΠΎΠ·Π΄Π°Π΄ΠΈΠΌ ΠΈΠ³ΡΠΎΠ²ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ, Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½ΠΎ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅ΠΌΡ ΡΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²Ρ ΠΏΠΎ ΠΈΠ³ΡΠ΅ Space Invaders (Π² ΠΊΠΎΡΠΎΡΠΎΠΌ Π±ΡΠ»ΠΎ Π²ΡΠ΅Π³ΠΎ 100 ΡΡΡΠΎΠΊ). ΠΠ΄Π΅ΡΡ Ρ ΠΏΠΎΠ΄Π³ΠΎΡΠΎΠ²Π»Ρ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ Π΄Π»Ρ ΡΠΊΠ°Π·Π°Π½ΠΈΡ ΡΠ°Π·ΠΌΠ΅ΡΠ° ΠΎΠΊΠ½Π°, Π½Π°Π·Π²Π°Π½ΠΈΡ ΠΈΠ³ΡΡ, ΡΠ°ΡΡΠΎΡΡ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ ΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΠ»Π΅ΠΉ Π΄Π°Π½Π½ΡΡ
, ΠΊΠΎΡΠΎΡΡΠ΅ Π±ΡΠ΄ΡΡ ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΡ ΡΡΡΠ»ΠΊΠΈ Π½Π° ΠΈΠ³ΡΠΎΠ²ΡΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΡ ΠΈ ΠΈΠ³ΡΠΎΠΊΠ°. Π€ΡΠ½ΠΊΡΠΈΡ tick
ΠΈΡΠ΅ΡΠ°ΡΠΈΠ²Π½ΠΎ ΠΏΡΠΎΡ
ΠΎΠ΄ΠΈΡ ΠΏΠΎ Π²ΡΠ΅ΠΌ ΠΈΠ³ΡΠΎΠ²ΡΠΌ ΠΎΠ±ΡΠ΅ΠΊΡΠ°ΠΌ ΠΈ Π²ΡΠ·ΡΠ²Π°Π΅Ρ ΠΈΡ
Π²Π½ΡΡΡΠ΅Π½Π½ΡΡ Π»ΠΎΠ³ΠΈΠΊΡ ΠΈ ΡΠ΅Π½Π΄Π΅ΡΠΈΠ½Π³. ΠΠ°ΡΠ΅ΠΌ ΠΎΡΡΠ°Π΅ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΠ΅ΡΠ΅ΡΠΈΡΠΎΠ²Π°ΡΡ Π²ΡΡ ΠΈΠ³ΡΠΎΠ²ΡΡ ΠΎΠ±Π»Π°ΡΡΡ ΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ°ΡΡ ΡΠΎΠ±ΡΡΠΈΡ Π²Π²ΠΎΠ΄Π°, ΡΠ°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ ΡΠ΅Π»ΡΠΊΠΈ ΠΌΡΡΡΡ ΠΈ Π²Π²ΠΎΠ΄ Ρ ΠΊΠ»Π°Π²ΠΈΠ°ΡΡΡΡ. ΠΠ»Ρ ΡΡΠΎΠΉ ΡΠ΅Π»ΠΈ Π±ΡΠ΄Π΅Ρ ΡΠ»ΡΠΆΠΈΡΡ ΡΡΠ½ΠΊΡΠΈΡ _handle_events
.
import pygame # import packages (install with "pip install pygame" in cmd) import numpy as np import tcod class GameRenderer: def __init__(self, in_width: int, in_height: int): pygame.init() self._width = in_width self._height = in_height self._screen = pygame.display.set_mode((in_width, in_height)) pygame.display.set_caption('Pacman') self._clock = pygame.time.Clock() self._done = False self._game_objects = [] self._walls = [] self._cookies = [] self._hero: Hero = None def tick(self, in_fps: int): black = (0, 0, 0) while not self._done: for game_object in self._game_objects: game_object.tick() game_object.draw() pygame.display.flip() self._clock.tick(in_fps) self._screen.fill(black) self._handle_events() print("Game over") def add_game_object(self, obj: GameObject): self._game_objects.append(obj) def add_wall(self, obj: Wall): self.add_game_object(obj) self._walls.append(obj) def _handle_events(self): pass # we'll implement this later
>> parent_game_object
ΠΠ°ΡΠ΅ΠΌ Ρ ΡΠΎΠ·Π΄Π°Ρ ΡΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΠΈΠΉ ΠΈΠ³ΡΠΎΠ²ΠΎΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ Ρ ΠΈΠΌΠ΅Π½Π΅ΠΌ GameObject
, ΠΎΡ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ Π΄ΡΡΠ³ΠΈΠ΅ ΠΊΠ»Π°ΡΡΡ Π±ΡΠ΄ΡΡ Π½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΡ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΡΡΡ. Π ΠΈΠ³ΡΠ΅ Ρ Π½Π°Ρ Π±ΡΠ΄ΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΡ Π΄Π»Ρ ΡΡΠ΅Π½Ρ (Wall), Pac-Man (Hero), ΠΏΡΠΈΠ²ΠΈΠ΄Π΅Π½ΠΈΡ (Ghost) ΠΈ ΠΏΠ΅ΡΠ΅Π½ΡΡ (Cookie). ΠΠ»Ρ ΡΠΏΠΎΠΌΡΠ½ΡΡΡΡ
Π²ΡΡΠ΅ ΠΏΠΎΠ΄Π²ΠΈΠΆΠ½ΡΡ
ΠΈΠ³ΡΠΎΠ²ΡΡ
ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² ΠΏΠΎΠ·ΠΆΠ΅ Ρ ΡΠΎΠ·Π΄Π°ΠΌ ΠΊΠ»Π°ΡΡ MovableObject
, ΠΊΠΎΡΠΎΡΡΠΉ Π±ΡΠ΄Π΅Ρ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΠ΅ΠΌ ΠΊΠ»Π°ΡΡΠ° GameObject
Ρ ΡΡΠ½ΠΊΡΠΈΡΠΌΠΈ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ΅Π½ΠΈΡ.
ΠΠΎ Π²ΡΠ΅ΠΌΡ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΎΠ±ΡΠ΅ΠΊΡΠ° Ρ Π·Π°Π΄Π°Ρ Π΅Π³ΠΎ ΡΠ²Π΅Ρ, ΡΠΎΡΠΌΡ ΠΈ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅. ΠΠ°ΠΆΠ΄ΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ ΡΠ°ΠΊΠΆΠ΅ ΠΈΠΌΠ΅Π΅Ρ ΡΡΡΠ»ΠΊΡ Π½Π° ΠΏΠΎΠ²Π΅ΡΡ
Π½ΠΎΡΡΡ ΡΠ΅Π½Π΄Π΅ΡΠΈΠ½Π³Π° _surface
, ΡΠ°ΠΊ ΡΡΠΎ ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ ΡΠ°ΠΌ Π·Π°Π±ΠΎΡΠΈΡΡΡΡ ΠΎ ΡΠ²ΠΎΠ΅ΠΌ ΡΠ΅Π½Π΄Π΅ΡΠΈΠ½Π³Π΅ Π½Π° ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΉ ΠΏΠΎΠ²Π΅ΡΡ
Π½ΠΎΡΡΠΈ. ΠΠ»Ρ ΡΡΠΎΠΉ ΡΠ΅Π»ΠΈ Ρ Π½Π°Ρ Π΅ΡΡΡ ΡΡΠ½ΠΊΡΠΈΡ draw
, ΠΊΠΎΡΠΎΡΠ°Ρ Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ ΡΠ°Π½Π΅Π΅ ΡΠΎΠ·Π΄Π°Π½Π½ΡΠΌ GameRenderer
Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ³ΡΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ°. Π Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΎΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ° is_circle
ΠΎΠ±ΡΠ΅ΠΊΡ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅ΡΡΡ Π»ΠΈΠ±ΠΎ Π² Π²ΠΈΠ΄Π΅ ΠΊΡΡΠ³Π°, Π»ΠΈΠ±ΠΎ Π² Π²ΠΈΠ΄Π΅ ΠΏΡΡΠΌΠΎΡΠ³ΠΎΠ»ΡΠ½ΠΈΠΊΠ° (Π² Π½Π°ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΠΊΠ²Π°Π΄ΡΠ°Ρ ΡΠΎ ΡΠ»Π΅Π³ΠΊΠ° Π·Π°ΠΊΡΡΠ³Π»Π΅Π½Π½ΡΠΌΠΈ ΡΠ³Π»Π°ΠΌΠΈ Π΄Π»Ρ ΡΡΠ΅Π½ ΠΈ ΠΊΡΡΠ³ Π΄Π»Ρ Pac-Man ΠΈ ΠΏΠ΅ΡΠ΅Π½ΡΡ).
class GameObject: def __init__(self, in_surface, x, y, in_size: int, in_color=(255, 0, 0), is_circle: bool = False): self._size = in_size self._renderer: GameRenderer = in_surface self._surface = in_surface._screen self.y = y self.x = x self._color = in_color self._circle = is_circle self._shape = pygame.Rect(self.x, self.y, in_size, in_size) def draw(self): if self._circle: pygame.draw.circle(self._surface, self._color, (self.x, self.y), self._size) else: rect_object = pygame.Rect(self.x, self.y, self._size, self._size) pygame.draw.rect(self._surface, self._color, rect_object, border_radius=4) def tick(self): pass
Π‘ΠΎΠ·Π΄Π°ΡΡ ΠΊΠ»Π°ΡΡ ΡΡΠ΅Π½Ρ Π±ΡΠ΄Π΅Ρ ΠΏΡΠΎΡΡΠΎ. ΠΠ»Ρ ΡΡΠ΅Π½ Π²ΡΠ±ΠΈΡΠ°Ρ ΡΠΈΠ½ΠΈΠΉ ΡΠ²Π΅Ρ ΡΠΎΠ³Π»Π°ΡΠ½ΠΎ ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»ΡΠ½ΠΎΠΌΡ Pac-Man (ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ ΡΠ²Π΅ΡΠ° β Blue 255, ΠΎΡΡΠ°Π»ΡΠ½ΠΎΠ΅ 0).
class Wall(GameObject): def __init__(self, in_surface, x, y, in_size: int, in_color=(0, 0, 255)): super().__init__(in_surface, x * in_size, y * in_size, in_size, in_color)
ΠΠΎΠ΄Π³ΠΎΡΠΎΠ²Π»Π΅Π½ ΠΊΠΎΠ΄ Π΄Π»Ρ ΡΠ΅Π½Π΄Π΅ΡΠΈΠ½Π³Π° ΠΈ ΠΎΠ±ΡΠ΅ΠΊΡ Π΄Π»Ρ ΡΡΠ΅Π½. ΠΡΠΈ Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΠΈ ΡΠ»Π΅Π΄ΠΈΡΠ΅ Π·Π° ΡΠ΅ΠΌ, ΡΡΠΎΠ±Ρ ΠΊΠ»Π°ΡΡΡ Wall
ΠΈ GameObject
Π±ΡΠ»ΠΈ Π²ΡΡΠ΅ ΠΊΠ»Π°ΡΡΠ° GameRenderer
, ΡΡΠΎΠ±Ρ ΠΊΠ»Π°ΡΡ ΠΈΡ
Β«Π²ΠΈΠ΄Π΅Π»Β». Π‘Π»Π΅Π΄ΡΡΡΠΈΠΌ ΡΠ°Π³ΠΎΠΌ ΡΠ²Π»ΡΠ΅ΡΡΡ Π²ΠΈΠ·ΡΠ°Π»ΠΈΠ·Π°ΡΠΈΡ Π»Π°Π±ΠΈΡΠΈΠ½ΡΠ° Π½Π° ΡΠΊΡΠ°Π½Π΅. ΠΠΎ ΠΏΠ΅ΡΠ΅Π΄ ΡΡΠΈΠΌ ΠΌΡ Π΄ΠΎΠ»ΠΆΠ½Ρ ΡΠΎΠ·Π΄Π°ΡΡ ΠΎΠ΄ΠΈΠ½ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°ΡΠ΅Π»ΡΠ½ΡΠΉ ΠΊΠ»Π°ΡΡ.
>> the_game_controller_class
Π― ΡΠΎΡ
ΡΠ°Π½Ρ Π»Π°Π±ΠΈΡΠΈΠ½Ρ Π² ΡΠΈΠΌΠ²ΠΎΠ»Π°Ρ
ASCII Π² ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π² Π½ΠΎΠ²ΠΎΠΌ ΠΊΠ»Π°ΡΡΠ΅ PacmanGameController
. Π― Π±ΡΠ΄Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΈΡΡ
ΠΎΠ΄Π½ΡΠΉ ΡΠ°Π·ΠΌΠ΅Ρ Π»Π°Π±ΠΈΡΠΈΠ½ΡΠ° β 28x31 ΡΠ°ΠΉΠ». ΠΠΎΠ·ΠΆΠ΅ ΠΌΠ½Π΅ Π½ΡΠΆΠ½ΠΎ Π±ΡΠ΄Π΅Ρ ΡΠ±Π΅Π΄ΠΈΡΡΡΡ, ΡΡΠΎ ΠΏΡΠΈΠ·ΡΠ°ΠΊΠΈ ΡΠΌΠΎΠ³ΡΡ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ ΠΏΡΠΎΠΉΡΠΈ ΡΠ΅ΡΠ΅Π· Π»Π°Π±ΠΈΡΠΈΠ½Ρ ΠΈ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π½Π°ΠΉΡΠΈ ΠΈΠ³ΡΠΎΠΊΠ°. Π‘Π½Π°ΡΠ°Π»Π° Ρ ΠΏΡΠΎΡΠΈΡΠ°Ρ Π»Π°Π±ΠΈΡΠΈΠ½Ρ ΠΊΠ°ΠΊ ΡΠΈΠΌΠ²ΠΎΠ»Ρ ΠΈ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΡΡ Π΅Π³ΠΎ Π² ΠΌΠ°ΡΡΠΈΡΡ Π΅Π΄ΠΈΠ½ΠΈΡ ΠΈ Π½ΡΠ»Π΅ΠΉ, Π³Π΄Π΅ ΡΡΠ΅Π½Π° ΡΠ°Π²Π½Π° Π½ΡΠ»Ρ, Π° ΠΏΡΠΎΡ
ΠΎΠ΄ΠΈΠΌΠΎΠ΅ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎ ΡΠ°Π²Π½ΠΎ Π΅Π΄ΠΈΠ½ΠΈΡΠ΅. ΠΡΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΡΠ»ΡΠΆΠ°Ρ Π°Π»Π³ΠΎΡΠΈΡΠΌΡ ΠΏΠΎΠΈΡΠΊΠ° ΠΏΡΡΠΈ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΡΠ°ΠΊ Π½Π°Π·ΡΠ²Π°Π΅ΠΌΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ ΡΡΠΎΠΈΠΌΠΎΡΡΠΈ. ΠΠΎΠ»Ρ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ Π±Π΅ΡΠΊΠΎΠ½Π΅ΡΠ½ΡΡ ΡΡΠΎΠΈΠΌΠΎΡΡΡ ΠΏΡΠΎΡ
ΠΎΠΆΠ΄Π΅Π½ΠΈΡ, ΠΏΠΎΡΡΠΎΠΌΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ Π² ΠΌΠ°ΡΡΠΈΠ²Π΅, ΠΎΡΠΌΠ΅ΡΠ΅Π½Π½ΡΠ΅ ΡΠ°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, Π½Π΅ Π±ΡΠ΄ΡΡ ΡΡΠΈΡΠ°ΡΡΡΡ ΠΏΡΠΎΡ
ΠΎΠ΄ΠΈΠΌΡΠΌΠΈ. ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° ΠΌΠ°ΡΡΠΈΠ² reachable_spaces
, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΠΏΡΠΎΡ
ΠΎΠ΄ΠΈΠΌΡΠ΅ ΡΠ°ΡΡΠΈ Π»Π°Π±ΠΈΡΠΈΠ½ΡΠ°. ΠΠΎ ΠΎΠ± ΡΡΠΎΠΌ ΠΏΠΎΠ·ΠΆΠ΅, ΡΠ½Π°ΡΠ°Π»Π° Ρ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΈΡΡ ΡΡΡΡΠΊΡΡΡΡ ΠΊΠ»Π°ΡΡΠΎΠ². ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠΊΠΎΠΏΠΈΡΠΎΠ²Π°ΡΡ Π»Π°Π±ΠΈΡΠΈΠ½Ρ Π² ΡΠΎΡΠΌΠ°ΡΠ΅ ASCII Ρ ΠΌΠΎΠ΅Π³ΠΎ GitHub. Π ΠΎΠ±ΠΎΠ·Π½Π°ΡΠ΅Π½ΠΈΠΈ ΠΏΠ΅ΡΡΠΎΠ½Π°ΠΆΠ° Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π» X
Π΄Π»Ρ ΡΡΠ΅Π½Ρ, P
Π΄Π»Ρ Pac-Man ΠΈ G
Π΄Π»Ρ ΠΏΡΠΈΠ·ΡΠ°ΠΊΠ°.
class PacmanGameController: def __init__(self): self.ascii_maze = [ "XXXXXXXXXXXXXXXXXXXXXXXXXXXX", "XP XX X", "X XXXX XXXXX XX XXXXX XXXX X", "X XXXX XXXXX XX XXXXX XXXX X", "X XXXX XXXXX XX XXXXX XXXX X", "X X", "X XXXX XX XXXXXXXX XX XXXX X", "X XXXX XX XXXXXXXX XX XXXX X", "X XX XX XX X", "XXXXXX XXXXX XX XXXXX XXXXXX", "XXXXXX XXXXX XX XXXXX XXXXXX", "XXXXXX XX XX XXXXXX", "XXXXXX XX XXXXXXXX XX XXXXXX", "XXXXXX XX X G X XX XXXXXX", " X G X ", "XXXXXX XX X G X XX XXXXXX", # shortened for article, full ascii on my github "XXXXXXXXXXXXXXXXXXXXXXXXXXXX", ] self.numpy_maze = [] self.cookie_spaces = [] self.reachable_spaces = [] self.ghost_spawns = [] self.size = (0, 0) self.convert_maze_to_numpy() #self.p = Pathfinder(self.numpy_maze) # use later def convert_maze_to_numpy(self): for x, row in enumerate(self.ascii_maze): self.size = (len(row), x + 1) binary_row = [] for y, column in enumerate(row): if column == "G": self.ghost_spawns.append((y, x)) if column == "X": binary_row.append(0) else: binary_row.append(1) self.cookie_spaces.append((y, x)) self.reachable_spaces.append((y, x)) self.numpy_maze.append(binary_row)
>> rendering_the_maze
ΠΡΠ΅ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎΠ΅ Π΄Π»Ρ ΡΠ΅Π½Π΄Π΅ΡΠΈΠ½Π³Π° Π»Π°Π±ΠΈΡΠΈΠ½ΡΠ° ΠΏΠΎΠ΄Π³ΠΎΡΠΎΠ²Π»Π΅Π½ΠΎ, ΠΏΠΎΡΡΠΎΠΌΡ ΠΎΡΡΠ°Π»ΠΎΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΡΠΎΠ·Π΄Π°ΡΡ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΡ Π½Π°ΡΠΈΡ
ΠΊΠ»Π°ΡΡΠΎΠ² PacmanGameController
, ΠΏΡΠΎΠΉΡΠΈΡΡ ΠΏΠΎ 2D-ΠΌΠ°ΡΡΠΈΠ²Ρ Ρ ΠΏΠΎΠ·ΠΈΡΠΈΡΠΌΠΈ ΡΡΠ΅Π½ ΠΈ ΡΠΎΠ·Π΄Π°ΡΡ Π² ΡΡΠΈΡ
ΠΌΠ΅ΡΡΠ°Ρ
ΠΎΠ±ΡΠ΅ΠΊΡ Wall
(Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΡΡΠ½ΠΊΡΠΈΡ add_wall
, ΠΊΠΎΡΠΎΡΠ°Ρ Π½Π΅ ΠΏΠΎΠΊΠ°Π·Π°Π½Π° Π·Π΄Π΅ΡΡ, Π΅ΡΠ΅ ΡΠ°Π· Π²Π·Π³Π»ΡΠ½ΠΈΡΠ΅ Π½Π° ΠΏΠΎΠ»Π½ΡΠΉ ΠΊΠΎΠ΄ Π½Π° ΠΌΠΎΠ΅ΠΌ GitHub). Π― ΡΡΡΠ°Π½ΠΎΠ²ΠΈΠ» ΡΠ°ΡΡΠΎΡΡ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ 120 ΠΊΠ°Π΄ΡΠΎΠ² Π² ΡΠ΅ΠΊΡΠ½Π΄Ρ.
if __name__ == "__main__": unified_size = 32 pacman_game = PacmanGameController() size = pacman_game.size game_renderer = GameRenderer(size[0] * unified_size, size[1] * unified_size) for y, row in enumerate(pacman_game.numpy_maze): for x, column in enumerate(row): if column == 0: game_renderer.add_wall(Wall(game_renderer, x, y, unified_size)) game_renderer.tick(120)
>> letβs_add_ghosts!
Π ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»ΡΠ½ΠΎΠΌ Pac-Man Π±ΡΠ»ΠΎ ΡΠ΅ΡΡΡΠ΅ ΠΏΡΠΈΠ·ΡΠ°ΠΊΠ° ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ ΠΠ»ΠΈΠ½ΠΊΠΈ, ΠΠΈΠ½ΠΊΠΈ, ΠΠ½ΠΊΠΈ ΠΈ ΠΠ»Π°ΠΉΠ΄, ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠΎ ΡΠ²ΠΎΠΈΠΌ Ρ Π°ΡΠ°ΠΊΡΠ΅ΡΠΎΠΌ ΠΈ ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡΡΠΌΠΈ. ΠΠΎΠ½ΡΠ΅ΠΏΡΠΈΡ ΠΈΠ³ΡΡ ΠΎΡΠ½ΠΎΠ²Π°Π½Π° Π½Π° ΡΠΏΠΎΠ½ΡΠΊΠΎΠΉ ΡΠΊΠ°Π·ΠΊΠ΅ (ΠΏΠΎΠ΄ΡΠΎΠ±Π½Π΅Π΅ Π·Π΄Π΅ΡΡ ΠΈ Π·Π΄Π΅ΡΡ), Π° ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»ΡΠ½ΡΠ΅ Π½Π°Π·Π²Π°Π½ΠΈΡ Π½Π° ΡΠΏΠΎΠ½ΡΠΊΠΎΠΌ ΡΠ·ΡΠΊΠ΅ ΡΠ°ΠΊΠΆΠ΅ ΠΏΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π°ΡΡ ΠΈΡ ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡΠΈ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Ρ ΠΠΈΠ½ΠΊΠΈ ΡΠΏΠΎΠ½ΡΠΊΠΎΠ΅ ΠΈΠΌΡ ΠΠΎΡ, Ρ ΠΠ»ΠΈΠ½ΠΊΠΈ β Π’Π΅Π½Ρ). ΠΠ΄Π½Π°ΠΊΠΎ Π΄Π»Ρ Π½Π°ΡΠ΅ΠΉ ΠΈΠ³ΡΡ ΠΌΡ Π½Π΅ Π±ΡΠ΄Π΅ΠΌ Π²Π΄Π°Π²Π°ΡΡΡΡ Π² ΡΠ°ΠΊΠΈΠ΅ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎΡΡΠΈ, ΠΈ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΏΡΠΈΠ·ΡΠ°ΠΊ Π±ΡΠ΄Π΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π±Π°Π·ΠΎΠ²ΡΠΉ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΡΠ΅ΡΠΊΠΈΠΉ ΡΠΈΠΊΠ», ΠΊΠ°ΠΊ ΠΈ Π² ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»Π΅, ΡΠΎ Π΅ΡΡΡ ΡΠ΅ΠΆΠΈΠΌΡ Β«ΠΏΡΠ΅ΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΠ΅Β», Β«ΡΠ°ΡΡΠ΅ΠΈΠ²Π°Π½ΠΈΠ΅Β» ΠΈ Β«ΠΈΡΠΏΡΠ³Β». ΠΡ ΠΎΠΏΠΈΡΠ΅ΠΌ ΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ°Π΅ΠΌ ΡΡΠΈ ΡΠ΅ΠΆΠΈΠΌΡ ΠΠ Π²ΠΎ Π²ΡΠΎΡΠΎΠΉ ΡΠ°ΡΡΠΈ.
ΠΠ»Π°ΡΡ-ΠΏΡΠΈΠ·ΡΠ°ΠΊ Π±ΡΠ΄Π΅Ρ ΠΏΡΠΎΡΡΡΠΌ, ΡΠ½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Π² Π±ΠΎΠ»ΡΡΡΡ ΡΠ°ΡΡΡ ΡΠ²ΠΎΠ΅Π³ΠΎ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΡ ΠΎΡ ΡΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΠΎΠ³ΠΎ ΠΊΠ»Π°ΡΡΠ° MovableObject
(ΠΏΠΎΡΠΌΠΎΡΡΠΈΡΠ΅ ΠΌΠΎΠΉ GitHub, ΡΡΠΎΡ ΠΊΠ»Π°ΡΡ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ»ΠΎΠΆΠ½Π΅Π΅ ΠΈ Π²ΠΊΠ»ΡΡΠ°Π΅Ρ Π»ΠΎΠ³ΠΈΠΊΡ Π΄Π»Ρ Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΡ Π² ΡΠ΅ΡΡΡΠ΅Ρ
Π½Π°ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡΡ
, ΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΡ ΠΏΠΎ ΠΌΠ°ΡΡΡΡΡΡ ΠΈ ββΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ Π½Π° ΡΡΠΎΠ»ΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΡ ΡΠΎ ΡΡΠ΅Π½Π°ΠΌΠΈ).
class Ghost(MovableObject): def __init__(self, in_surface, x, y, in_size: int, in_game_controller, in_color=(255, 0, 0)): super().__init__(in_surface, x, y, in_size, in_color, False) self.game_controller = in_game_controller
Π― Π΄ΠΎΠ±Π°Π²Π»Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΡ RGB Π΄Π»Ρ ΡΠ²Π΅ΡΠΎΠ² ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΡΠΈΠ·ΡΠ°ΠΊΠ° Π² ΠΊΠ»Π°ΡΡ PacmanGameController
ΠΈ ΡΠ³Π΅Π½Π΅ΡΠΈΡΡΡ ΡΠ΅ΡΡΡΠ΅ ΡΠ²Π΅ΡΠ½ΡΡ
ΠΏΡΠΈΠ·ΡΠ°ΠΊΠ° Π² ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ. Π― ΡΠ°ΠΊΠΆΠ΅ ΠΏΠΎΠ΄Π³ΠΎΡΠΎΠ²Π»Ρ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΡΡ ΡΡΠ½ΠΊΡΠΈΡ Π΄Π»Ρ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΡ ΠΊΠΎΠΎΡΠ΄ΠΈΠ½Π°Ρ, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΡΠΎΡΡΠΎ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΡΠ΅Ρ ΠΊΠΎΠΎΡΠ΄ΠΈΠ½Π°ΡΡ Π»Π°Π±ΠΈΡΠΈΠ½ΡΠ° (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, x=16 y=16 ΠΏΡΠΈΠ±Π»ΠΈΠ·ΠΈΡΠ΅Π»ΡΠ½ΠΎ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΠ΅Ρ ΡΠ΅Π½ΡΡΡ Π»Π°Π±ΠΈΡΠΈΠ½ΡΠ°, ΠΈ ΡΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π° ΡΠ°Π·ΠΌΠ΅Ρ ΡΡΠ΅ΠΉΠΊΠΈ ΠΈΠ»ΠΈ ΡΠ°ΠΉΠ»Π° Π΄Π°Π΅Ρ ΠΌΠ½Π΅ ΠΊΠΎΠΎΡΠ΄ΠΈΠ½Π°ΡΡ Π½Π° ΠΏΠΎΠ²Π΅ΡΡ
Π½ΠΎΡΡΡ ΠΈΠ³ΡΡ Π² ΠΏΠΈΠΊΡΠ΅Π»ΡΡ
).
# inPacmanGameController self.ghost_colors = [ (255, 184, 255), (255, 0, 20), (0, 255, 255), (255, 184, 82) ] # in main for i, ghost_spawn in enumerate(pacman_game.ghost_spawns): translated = translate_maze_to_screen(ghost_spawn) ghost = Ghost(game_renderer, translated[0], translated[1], unified_size, pacman_game, pacman_game.ghost_colors[i % 4]) game_renderer.add_game_object(ghost) # General functions for coordinate conversion, place at the beginning of the code def translate_screen_to_maze(in_coords, in_size=32): return int(in_coords[0] / in_size), int(in_coords[1] / in_size) def translate_maze_to_screen(in_coords, in_size=32): return in_coords[0] * in_size, in_coords[1] * in_size
ΠΠ° ΡΡΠΎΠΌ ΡΡΠ°ΠΏΠ΅ ΡΠ΅ΡΡΡΠ΅ ΠΏΡΠΈΠ·ΡΠ°ΠΊΠ° Π±ΡΠ΄ΡΡ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°ΡΡΡΡ Π² Π»Π°Π±ΠΈΡΠΈΠ½ΡΠ΅ ΠΏΡΠΈ Π·Π°ΠΏΡΡΠΊΠ΅ ΠΈΠ³ΡΡ. Π’Π΅ΠΏΠ΅ΡΡ ΠΌΡ Ρ ΠΎΡΠΈΠΌ Π·Π°ΡΡΠ°Π²ΠΈΡΡ ΠΈΡ Π΄Π²ΠΈΠ³Π°ΡΡΡΡ.
>> maze_pathfinding
Π’Π΅ΠΏΠ΅ΡΡ Π½Π°ΡΡΡΠΏΠ°Π΅Ρ, ΠΏΠΎΠΆΠ°Π»ΡΠΉ, ΡΠ°ΠΌΠ°Ρ ΡΠ»ΠΎΠΆΠ½Π°Ρ ΡΠ°ΡΡΡ. ΠΠΎΠΈΡΠΊ ΠΏΡΡΠΈ Π² Π΄Π²ΡΠΌΠ΅ΡΠ½ΠΎΠΌ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π΅ ΠΈΠ»ΠΈ Π³ΡΠ°ΡΠ΅ β ΡΠ»ΠΎΠΆΠ½Π°Ρ Π·Π°Π΄Π°ΡΠ°. Π Π΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ Π°Π»Π³ΠΎΡΠΈΡΠΌΠ° ΡΠ΅ΡΠ΅Π½ΠΈΡ ΡΠ°ΠΊΠΎΠΉ Π·Π°Π΄Π°ΡΠΈ Π·Π°Π½ΡΠ»Π° Π±Ρ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΡ ΡΡΠ°ΡΡΡ, ΠΏΠΎΡΡΠΎΠΌΡ Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΡ Π³ΠΎΡΠΎΠ²ΡΠΌ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ΠΌ. ΠΠ°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΡΠΌ Π°Π»Π³ΠΎΡΠΈΡΠΌΠΎΠΌ ΠΏΠΎΠΈΡΠΊΠ° ΠΏΡΡΠΈ ΡΠ²Π»ΡΠ΅ΡΡΡ Π°Π»Π³ΠΎΡΠΈΡΠΌ A*. ΠΡΠΎ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅ΡΡΡ ΠΏΠ°ΠΊΠ΅ΡΠΎΠΌ tcod
, ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΡ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΠ»ΠΈ Π²Π½Π°ΡΠ°Π»Π΅.
Π§ΡΠΎΠ±Ρ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ°ΡΡ ΠΏΡΠΈΠ·ΡΠ°ΠΊΠΎΠ², Ρ ΡΠΎΠ·Π΄Π°ΠΌ ΠΊΠ»Π°ΡΡ Ρ ΠΈΠΌΠ΅Π½Π΅ΠΌ Pathfinder
. Π ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠ΅ Ρ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΡ ΠΌΠ°ΡΡΠΈΠ² numpy
ΡΠΎ ΡΡΠΎΠΈΠΌΠΎΡΡΡΡ ΠΏΡΠΎΡ
ΠΎΠΆΠ΄Π΅Π½ΠΈΡ (ΠΌΠ°ΡΡΠΈΠ² Π΅Π΄ΠΈΠ½ΠΈΡ ΠΈ Π½ΡΠ»Π΅ΠΉ, ΠΎΠΏΠΈΡΠ°Π½Π½ΡΠΉ ΡΠ°Π½Π΅Π΅) ΠΈ ΡΠΎΠ·Π΄Π°ΠΌ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΠΊΠ»Π°ΡΡΠ° pf
, ΠΊΠΎΡΠΎΡΠ°Ρ Π±ΡΠ΄Π΅Ρ ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΡ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ Π½Π°Π²ΠΈΠ³Π°ΡΠΎΡΠ° A*. ΠΠ°ΡΠ΅ΠΌ ΡΡΠ½ΠΊΡΠΈΡ get_path
ΡΠ°ΡΡΡΠΈΡΠ°Π΅Ρ ΠΈ Π²Π΅ΡΠ½Π΅Ρ ΠΏΡΡΡ Π² Π²ΠΈΠ΄Π΅ ΡΠ΅ΡΠΈΠΈ ΡΠ°Π³ΠΎΠ² Π² ΠΌΠ°ΡΡΠΈΠ²Π΅ ΠΏΡΠΈ Π²ΡΠ·ΠΎΠ²Π΅ Ρ ΠΊΠΎΠΎΡΠ΄ΠΈΠ½Π°ΡΠ°ΠΌΠΈ Π² Π»Π°Π±ΠΈΡΠΈΠ½ΡΠ΅ (ΠΎΡΠΊΡΠ΄Π°, ΠΊΡΠ΄Π°).
class Pathfinder: def __init__(self, in_arr): cost = np.array(in_arr, dtype=np.bool_).tolist() self.pf = tcod.path.AStar(cost=cost, diagonal=0) def get_path(self, from_x, from_y, to_x, to_y) -> object: res = self.pf.get_path(from_x, from_y, to_x, to_y) return [(sub[1], sub[0]) for sub in res]
Π’Π΅ΠΏΠ΅ΡΡ Ρ Π΄ΠΎΠ±Π°Π²Π»Ρ ΡΠ°Π·Π΄Π΅Π» ΠΊ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ, ΡΡΠΎΠ±Ρ ΠΏΡΠΎΠ΄Π΅ΠΌΠΎΠ½ΡΡΡΠΈΡΠΎΠ²Π°ΡΡ ΠΏΠΎΠΈΡΠΊ ΠΏΡΡΠΈ. Π― Π²ΡΠ±ΠΈΡΠ°Ρ Π½Π°ΡΠ°Π»ΡΠ½ΡΠ΅ ΠΊΠΎΠΎΡΠ΄ΠΈΠ½Π°ΡΡ [1,1]
ΠΈ ΠΏΡΠ½ΠΊΡ Π½Π°Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΌΠ°ΡΡΡΡΡΠ° [24,24]
. ΠΡΠΎ Π½Π΅ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΡΠΉ ΠΊΠΎΠ΄.
# draw path - optional red = (255, 0, 0) green = (0, 255, 0) _from = (1, 1) _to = (24, 24) path_array = pacman_game.p.get_path(_from[1], _from[0], _to[1], _to[0]) print(path_array) # [(1, 2), (1, 3), (1, 4), (1, 5), (2, 5), (3, 5), (4, 5), (5, 5), (6, 5), (6, 6), (6, 7) ... white = (255, 255, 255) for path in path_array: game_renderer.add_game_object(Wall(game_renderer, path[0], path[1], unified_size, white)) from_translated = translate_maze_to_screen(_from) game_renderer.add_game_object( GameObject(game_renderer, from_translated[0], from_translated[1], unified_size, red)) to_translated = translate_maze_to_screen(_to) game_renderer.add_game_object( GameObject(game_renderer, to_translated[0], to_translated[1], unified_size, green))
Π ΠΈΠ³ΡΠ΅ ΡΠ΅Π½Π΄Π΅ΡΠΈΠ½Π³ ΠΊΡΠ°ΡΡΠ°ΠΉΡΠ΅Π³ΠΎ ΠΌΠ°ΡΡΡΡΡΠ° Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΡΠ°ΠΊ:
>> randomized_ghost_movement
Π’Π΅ΠΏΠ΅ΡΡ ΠΌΡ ΡΠΎΠ±ΠΈΡΠ°Π΅ΠΌΡΡ ΡΠΎΠ·Π΄Π°ΡΡ Π½ΠΎΠ²ΡΡ ΡΡΠ½ΠΊΡΠΈΡ Π² ΠΊΠ»Π°ΡΡΠ΅ PacmanGameController
Π΄Π»Ρ Π²ΡΠ±ΠΎΡΠ° ΡΠ»ΡΡΠ°ΠΉΠ½ΠΎΠΉ ΡΠΎΡΠΊΠΈ ΠΈΠ· ΠΌΠ°ΡΡΠΈΠ²Π° reachable_spaces
. ΠΠ°ΠΆΠ΄ΡΠΉ ΠΏΡΠΈΠ·ΡΠ°ΠΊ Π±ΡΠ΄Π΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΡ ΡΡΠ½ΠΊΡΠΈΡ ΠΏΠΎΡΠ»Π΅ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π΄ΠΎΡΡΠΈΠ³Π½Π΅Ρ ΠΌΠ΅ΡΡΠ° Π½Π°Π·Π½Π°ΡΠ΅Π½ΠΈΡ. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, ΠΏΡΠΈΠ·ΡΠ°ΠΊΠΈ Π±ΡΠ΄ΡΡ ΠΏΡΠΎΡΡΠΎ Π²ΡΠ±ΠΈΡΠ°ΡΡ ΠΏΡΡΡ ΠΎΡ ΡΠ²ΠΎΠ΅Π³ΠΎ ΡΠ΅ΠΊΡΡΠ΅Π³ΠΎ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π² Π»Π°Π±ΠΈΡΠΈΠ½ΡΠ΅ Π΄ΠΎ ΡΠ»ΡΡΠ°ΠΉΠ½ΠΎΠ³ΠΎ ΠΌΠ΅ΡΡΠ° Π½Π°Π·Π½Π°ΡΠ΅Π½ΠΈΡ Π½Π° Π½Π΅ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠΉ ΡΡΠΎΠΊ. Π ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΉ ΡΠ°ΡΡΠΈ ΠΌΡ ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅ΠΌ Π±ΠΎΠ»Π΅Π΅ ΡΠ»ΠΎΠΆΠ½ΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅, ΡΠ°ΠΊΠΎΠ΅ ΠΊΠ°ΠΊ ΠΏΠΎΠ³ΠΎΠ½Ρ ΠΈ Π±Π΅Π³ΡΡΠ²ΠΎ ΠΎΡ ΠΈΠ³ΡΠΎΠΊΠ°.
def request_new_random_path(self, in_ghost: Ghost): random_space = random.choice(self.reachable_spaces) current_maze_coord = translate_screen_to_maze(in_ghost.get_position()) path = self.p.get_path(current_maze_coord[1], current_maze_coord[0], random_space[1], random_space[0]) test_path = [translate_maze_to_screen(item) for item in path] in_ghost.set_new_path(test_path)
Π ΠΊΠ»Π°ΡΡΠ΅ Ghost
ΠΌΡ Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅ΠΌ Π½ΠΎΠ²ΡΡ Π»ΠΎΠ³ΠΈΠΊΡ Π΄Π»Ρ ΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΡ ΠΏΠΎ ΠΏΡΡΠΈ. Π€ΡΠ½ΠΊΡΠΈΡ reached_target
Π²ΡΠ·ΡΠ²Π°Π΅Ρ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΊΠ°Π΄Ρ ΠΈ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅Ρ, Π΄ΠΎΡΡΠΈΠ³ Π»ΠΈ ΡΠΆΠ΅ ΠΏΡΠΈΠ·ΡΠ°ΠΊ ΡΠ²ΠΎΠ΅ΠΉ ΡΠ΅Π»ΠΈ. ΠΡΠ»ΠΈ Π΄Π°, ΡΠΎ ΠΎΠ½ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ, Π² ΠΊΠ°ΠΊΠΎΠΌ Π½Π°ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠΈ Π½Π°Ρ
ΠΎΠ΄ΠΈΡΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ ΡΠ°Π³ ΠΏΡΡΠΈ ΡΠ΅ΡΠ΅Π· Π»Π°Π±ΠΈΡΠΈΠ½Ρ, ΠΈ Π½Π°ΡΠΈΠ½Π°Π΅Ρ ΠΌΠ΅Π½ΡΡΡ ΡΠ²ΠΎΠ΅ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π²Π²Π΅ΡΡ
, Π²Π½ΠΈΠ·, Π²Π»Π΅Π²ΠΎ ΠΈΠ»ΠΈ Π²ΠΏΡΠ°Π²ΠΎ (Π»ΠΎΠ³ΠΈΠΊΠ° Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΡ Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ Π² ΡΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΠΎΠΌ ΠΊΠ»Π°ΡΡΠ΅ MovableObject
).
def reached_target(self): if (self.x, self.y) == self.next_target: self.next_target = self.get_next_location() self.current_direction = self.calculate_direction_to_next_target() def set_new_path(self, in_path): for item in in_path: self.location_queue.append(item) self.next_target = self.get_next_location() def calculate_direction_to_next_target(self) -> Direction: if self.next_target is None: self.game_controller.request_new_random_path(self) return Direction.NONE diff_x = self.next_target[0] - self.x diff_y = self.next_target[1] - self.y if diff_x == 0: return Direction.DOWN if diff_y > 0 else Direction.UP if diff_y == 0: return Direction.LEFT if diff_x < 0 else Direction.RIGHT self.game_controller.request_new_random_path(self) return Direction.NONE def automatic_move(self, in_direction: Direction): if in_direction == Direction.UP: self.set_position(self.x, self.y - 1) elif in_direction == Direction.DOWN: self.set_position(self.x, self.y + 1) elif in_direction == Direction.LEFT: self.set_position(self.x - 1, self.y) elif in_direction == Direction.RIGHT: self.set_position(self.x + 1, self.y)
ΠΡΠΈΠ·ΡΠ°ΠΊΠΈ ΡΠ΅ΠΏΠ΅ΡΡ ΡΠΎΠ·Π΄Π°ΡΡΡΡ Π² ΠΏΠΎΠ·ΠΈΡΠΈΡΡ
, ΠΎΠ±ΠΎΠ·Π½Π°ΡΠ΅Π½Π½ΡΡ
Π±ΡΠΊΠ²ΠΎΠΉ G
Π² ΠΈΡΡ
ΠΎΠ΄Π½ΠΎΠΌ Π»Π°Π±ΠΈΡΠΈΠ½ΡΠ΅ ASCII, ΠΈ Π½Π°ΡΠΈΠ½Π°ΡΡ ΠΈΡΠΊΠ°ΡΡ ΡΠ»ΡΡΠ°ΠΉΠ½ΡΠΉ ΠΏΡΡΡ. Π― Π·Π°ΠΏΠ΅Ρ Π² ΠΊΠ»Π΅ΡΠΊΠ΅ ΡΡΠ΅Ρ
ΠΏΡΠΈΠ·ΡΠ°ΠΊΠΎΠ² β ΠΊΠ°ΠΊ ΠΈ Π² ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»ΡΠ½ΠΎΠΌ Pacman, ΠΎΠ½ΠΈ Π±ΡΠ΄ΡΡ Π²ΡΠΏΡΡΠΊΠ°ΡΡΡΡ ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡ β ΠΈ ΠΎΠ΄ΠΈΠ½ Π±ΡΠΎΠ΄ΠΈΡ ΠΏΠΎ Π»Π°Π±ΠΈΡΠΈΠ½ΡΡ:
>> player_controls
Π§ΡΠΎΠ±Ρ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΡΡΡ ΠΏΠ»Π΅Π΅ΡΠ°, Ρ ΡΠΎΠ·Π΄Π°ΠΌ ΠΊΠ»Π°ΡΡ ΠΏΠΎΠ΄ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ Hero
. ΠΠΎΠ»ΡΡΠ°Ρ ΡΠ°ΡΡΡ Π»ΠΎΠ³ΠΈΠΊΠΈ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΠΊΠ°ΠΊ ΠΈΠ³ΡΠΎΠΊΠΎΠΌ, ΡΠ°ΠΊ ΠΈ ΠΏΡΠΈΠ·ΡΠ°ΠΊΠ°ΠΌΠΈ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°Π΅ΡΡΡ Π² ΠΊΠ»Π°ΡΡΠ΅ MovableObject
, ΠΏΠΎΡΡΠΎΠΌΡ Π½Π°ΠΌ Π½ΡΠΆΠ½ΠΎ Π²ΡΠ΅Π³ΠΎ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΡΠ½ΠΊΡΠΈΠΉ Π΄Π»Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΡ ΠΈΠ³ΡΠΎΠΊΠ°. Π ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»ΡΠ½ΠΎΠΌ Pacman ΠΈΠ³ΡΠΎΠΊ ΠΌΠΎΠΆΠ΅Ρ Π΄Π²ΠΈΠ³Π°ΡΡΡΡ Π² ΡΠ΅ΡΡΡΠ΅Ρ
Π½Π°ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡΡ
, ΡΠΏΡΠ°Π²Π»ΡΠ΅ΠΌΡΡ
ΠΊΠ»Π°Π²ΠΈΡΠ°ΠΌΠΈ ΡΠΎ ΡΡΡΠ΅Π»ΠΊΠ°ΠΌΠΈ. ΠΡΠ»ΠΈ Π½ΠΈ ΠΎΠ΄Π½Π° ΠΊΠ»Π°Π²ΠΈΡΠ° ΡΠΎ ΡΡΡΠ΅Π»ΠΊΠΎΠΉ Π½Π΅ Π½Π°ΠΆΠ°ΡΠ°, ΠΈΠ³ΡΠΎΠΊ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΠ΅ Π² ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅ΠΌ Π΄ΠΎΠΏΡΡΡΠΈΠΌΠΎΠΌ Π½Π°ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠΈ. ΠΡΠ»ΠΈ ΠΊΠ»Π°Π²ΠΈΡΠ° Π½Π°ΠΆΠ°ΡΠ° Π² Π½Π°ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠΈ, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ ΠΈΠ³ΡΠΎΠΊ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ Π΄Π²ΠΈΠ³Π°ΡΡΡΡ, ΡΡΠΎ Π½Π°ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΡΠΎΡ
ΡΠ°Π½ΡΠ΅ΡΡΡ ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π² ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΌ Π΄ΠΎΡΡΡΠΏΠ½ΠΎΠΌ Ρ
ΠΎΠ΄Π΅. Π― Π²ΠΎΡΠΏΡΠΎΠΈΠ·Π²Π΅Π΄Ρ ΡΡΠΎ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² Π½Π°ΡΠ΅ΠΉ ΠΈΠ³ΡΠ΅, Π° ΡΠ°ΠΊΠΆΠ΅ Π΄ΠΎΠ±Π°Π²Π»Ρ ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡΡ ΠΠ°ΠΊΠΌΠ°Π½Π° ΡΠ΅Π»Π΅ΠΏΠΎΡΡΠΈΡΠΎΠ²Π°ΡΡΡΡ ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ½ΡΠ° Π»Π°Π±ΠΈΡΠΈΠ½ΡΠ° Π² Π΄ΡΡΠ³ΠΎΠΉ β Ρ ΠΏΡΠΎΡΡΠΎ ΠΏΡΠΎΠ²Π΅ΡΡ, Π½Π°Ρ
ΠΎΠ΄ΠΈΡΡΡ Π»ΠΈ ΠΈΠ³ΡΠΎΠΊ Π²Π½Π΅ ΠΈΠ³ΡΠΎΠ²ΠΎΠΉ Π·ΠΎΠ½Ρ Ρ Π»Π΅Π²ΠΎΠΉ ΠΈΠ»ΠΈ ΠΏΡΠ°Π²ΠΎΠΉ ΡΡΠΎΡΠΎΠ½Ρ, ΠΈ ΡΡΡΠ°Π½ΠΎΠ²Π»Ρ Π΅Π³ΠΎ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π° ΠΏΡΠΎΡΠΈΠ²ΠΎΠΏΠΎΠ»ΠΎΠΆΠ½ΡΡ ΡΡΠΎΡΠΎΠ½Ρ Π»Π°Π±ΠΈΡΠΈΠ½ΡΠ° ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎ. Π Pacman ΡΠ°ΠΊΠΆΠ΅ Π΅ΡΡΡ ΠΌΠΎΠ΄ΠΈΡΠΈΡΠΈΡΠΎΠ²Π°Π½Π½Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ ΡΠ΅Π½Π΄Π΅ΡΠΈΠ½Π³Π°, Π½Π°ΠΌ Π½ΡΠΆΠ½ΠΎ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°ΡΡ Π΅Π³ΠΎ Π²Π΄Π²ΠΎΠ΅ ΠΌΠ΅Π½ΡΡΠ΅, ΡΠ΅ΠΌ ΠΎΠ½ ΠΎΠ±ΡΡΠ½ΠΎ Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ (ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ pygame.rect
).
class Hero(MovableObject): def __init__(self, in_surface, x, y, in_size: int): super().__init__(in_surface, x, y, in_size, (255, 255, 0), False) self.last_non_colliding_position = (0, 0) def tick(self): # TELEPORT if self.x < 0: self.x = self._renderer._width if self.x > self._renderer._width: self.x = 0 self.last_non_colliding_position = self.get_position() if self.check_collision_in_direction(self.direction_buffer)[0]: self.automatic_move(self.current_direction) else: self.automatic_move(self.direction_buffer) self.current_direction = self.direction_buffer if self.collides_with_wall((self.x, self.y)): self.set_position(self.last_non_colliding_position[0], self.last_non_colliding_position[1]) self.handle_cookie_pickup() def automatic_move(self, in_direction: Direction): collision_result = self.check_collision_in_direction(in_direction) desired_position_collides = collision_result[0] if not desired_position_collides: self.last_working_direction = self.current_direction desired_position = collision_result[1] self.set_position(desired_position[0], desired_position[1]) else: self.current_direction = self.last_working_direction def handle_cookie_pickup(self): collision_rect = pygame.Rect(self.x, self.y, self._size, self._size) cookies = self._renderer.get_cookies() game_objects = self._renderer.get_game_objects() for cookie in cookies: collides = collision_rect.colliderect(cookie.get_shape()) if collides and cookie in game_objects: game_objects.remove(cookie) def draw(self): half_size = self._size / 2 pygame.draw.circle(self._surface, self._color, (self.x + half_size, self.y + half_size), half_size)
Π― ΡΠΎΠ·Π΄Π°Ρ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ ΠΊΠ»Π°ΡΡΠ° Hero
Π² ΠΊΠΎΠ½ΡΠ΅ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ. ΠΠ°Π΄Π°Ρ ΠΏΠΎΠ·ΠΈΡΠΈΡ Ρ ΠΊΠΎΠΎΡΠ΄ΠΈΠ½Π°ΡΠ°ΠΌΠΈ [1,1]
β unified_size
β ΡΠ°Π·ΠΌΠ΅Ρ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π°. Π’Π°ΠΊΠΆΠ΅ Π½Π°ΠΌ Π½ΡΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΡ Π²Ρ
ΠΎΠ΄Π½ΡΡ
ΡΠΎΠ±ΡΡΠΈΠΉ Π² ΠΊΠ»Π°ΡΡ GameRenderer
, ΡΡΠΎΠ±Ρ ΠΌΡ ΠΌΠΎΠ³Π»ΠΈ ΡΠΏΡΠ°Π²Π»ΡΡΡ ΠΈΠ³ΡΠΎΠ²ΡΠΌ ΠΏΠ΅ΡΡΠΎΠ½Π°ΠΆΠ΅ΠΌ.
# in GameRenderer class def add_hero(self, in_hero): self.add_game_object(in_hero) self._hero = in_hero def _handle_events(self): for event in pygame.event.get(): if event.type == pygame.QUIT: self._done = True pressed = pygame.key.get_pressed() if pressed[pygame.K_UP]: self._hero.set_direction(Direction.UP) elif pressed[pygame.K_LEFT]: self._hero.set_direction(Direction.LEFT) elif pressed[pygame.K_DOWN]: self._hero.set_direction(Direction.DOWN) elif pressed[pygame.K_RIGHT]: self._hero.set_direction(Direction.RIGHT) # at the end of main function pacman = Hero(game_renderer, unified_size, unified_size, unified_size) game_renderer.add_hero(pacman) game_renderer.tick(120)
ΠΠΎΡΠ»Π΅ Π·Π°ΠΏΡΡΠΊΠ° ΠΈΠ³ΡΡ ΡΠ΅ΠΏΠ΅ΡΡ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΏΡΠ°Π²Π»ΡΡΡ ΠΈΠ³ΡΠΎΠΊΠΎΠΌ β Pacman!
>> adding_cookies
ΠΡΠΎ Π±ΡΠ» Π±Ρ Π½Π΅ ΠΠ°ΠΊΠΌΠ°Π½ Π±Π΅Π· ΠΏΠ΅ΡΠ΅Π½ΡΡ Π² Π»Π°Π±ΠΈΡΠΈΠ½ΡΠ΅. Π‘ ΡΠΎΡΠΊΠΈ Π·ΡΠ΅Π½ΠΈΡ ΠΈΠ³ΡΠΎΠ²ΠΎΠ³ΠΎ ΠΏΡΠΎΡΠ΅ΡΡΠ° ΠΎΠ½ΠΈ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡ ΡΡΠ΅ΠΏΠ΅Π½Ρ ΠΈΡΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΡ ΠΌΠΈΡΠ°, Π° Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠ°ΠΉΠ»Ρ cookie Π΄Π°ΠΆΠ΅ ΠΌΠ΅Π½ΡΡΡ ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡΠΈ ΠΏΡΠΈΠ·ΡΠ°ΠΊΠΎΠ² ΠΈ ΠΠ°ΠΊΠΌΠ°Π½Π°. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, ΠΎΠ½ΠΈ ΡΠ²Π»ΡΡΡΡΡ Π²ΡΡΡΠ΅ΠΉ Π½Π°Π³ΡΠ°Π΄ΠΎΠΉ Π΄Π»Ρ ΠΈΠ³ΡΠΎΠΊΠΎΠ² ΠΈ ΠΎΡΠ½ΠΎΠ²Π½ΡΠΌ ΠΏΠΎΠΊΠ°Π·Π°ΡΠ΅Π»Π΅ΠΌ ΠΈΡ ΠΏΡΠΎΠ³ΡΠ΅ΡΡΠ° Π² ΡΡΠΎΠ²Π½ΡΡ . Π ΡΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΠΈΠ³ΡΠ°Ρ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅, ΠΊΠΎΡΠΎΡΠΎΠ΅ Π³Π΅ΠΉΠΌΠ΄ΠΈΠ·Π°ΠΉΠ½Π΅Ρ Ρ ΠΎΡΠ΅Ρ ΠΏΠΎΠΎΡΡΡΡΡ Π² ΠΈΠ³ΡΠΎΠΊΠ΅, ΠΎΠ±ΡΡΠ½ΠΎ Π²ΠΎΠ·Π½Π°Π³ΡΠ°ΠΆΠ΄Π°Π΅ΡΡΡ. ΠΡΠ΅ΠΊΡΠ°ΡΠ½ΡΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠΎΠΌ ΡΠ²Π»ΡΠ΅ΡΡΡ Elden Ring, Π³Π΄Π΅ ΠΊΠ°ΠΆΠ΄ΡΠΉ, ΠΊΡΠΎ ΠΈΡΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠ³ΠΎΠ»ΠΎΠΊ ΠΌΠΈΡΠ°, ΠΏΠΎΠ»ΡΡΠ°Π΅Ρ Π²ΠΎΠ·Π½Π°Π³ΡΠ°ΠΆΠ΄Π΅Π½ΠΈΠ΅. Π§Π΅ΠΌ ΠΎΠΏΠ°ΡΠ½Π΅Π΅ ΠΈ ΠΎΡΠ΄Π°Π»Π΅Π½Π½Π΅Π΅, ΡΠ΅ΠΌ Π±ΠΎΠ»ΡΡΠ΅ Π½Π°Π³ΡΠ°Π΄Π°. Π‘ Π΄ΡΡΠ³ΠΎΠΉ ΡΡΠΎΡΠΎΠ½Ρ, ΡΠ°ΠΊΠΈΠ΅ ΠΈΠ³ΡΡ, ΠΊΠ°ΠΊ Assassin's Creed, ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π·Π°Π΄Π°Ρ, ΠΏΠΎΡΡΠΎΠΌΡ Π²ΠΎ Π²ΡΠ΅ΠΌΡ ΠΈΠ³ΡΡ Ρ Π²Π°Ρ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ ΠΎΡΡΡΠ΅Π½ΠΈΠ΅, ΡΡΠΎ Π²Ρ ΡΠ°Π±ΠΎΡΠ°Π΅ΡΠ΅, Π° Π½Π΅ ΠΈΠ³ΡΠ°Π΅ΡΠ΅.
ΠΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ² cookie Π±ΡΠ΄Π΅Ρ ΡΠ°ΠΌΡΠΌ ΠΏΡΠΎΡΡΡΠΌ Π²ΠΎ Π²ΡΠ΅ΠΌ ΡΡΠΎΠΊΠ΅, ΠΏΠΎΡΡΠΎΠΌΡ Ρ ΠΎΡΡΠ°Π²ΠΈΠ» Π΅Π³ΠΎ Π½Π° ΠΊΠΎΠ½Π΅Ρ, ΠΊΠ°ΠΊ Π²ΠΈΡΠ΅Π½ΠΊΡ Π½Π° ΡΠΎΡΡΠ΅. Π― ΡΠΎΠ·Π΄Π°ΠΌ ΠΊΠ»Π°ΡΡ ΠΏΠΎΠ΄ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ Cookie
. ΠΠ³ΠΎ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ Π²ΡΠ΅Π³Π΄Π° Π±ΡΠ΄Π΅Ρ ΠΈΠΌΠ΅ΡΡ ΡΠ°Π·ΠΌΠ΅Ρ ΡΠ΅ΡΡΡΠ΅ ΠΏΠΈΠΊΡΠ΅Π»Ρ, ΠΆΠ΅Π»ΡΡΠΉ ΡΠ²Π΅Ρ ΠΈ ΠΊΡΡΠ³Π»ΡΡ ΡΠΎΡΠΌΡ. Π ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ Ρ ΡΠΎΠ·Π΄Π°ΠΌ ΠΊΡΠΊΠΈ Π½Π° Π²ΡΠ΅Ρ
ΡΠ°ΠΉΠ»Π°Ρ
, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΡ Π²Π½Π°ΡΠ°Π»Π΅ ΡΠΎΡ
ΡΠ°Π½ΠΈΠ»ΠΈ Π² ΠΌΠ°ΡΡΠΈΠ²Π΅ cookie_spaces
(ΡΠΎΡ ΠΆΠ΅, ΡΡΠΎ ΠΈ reachable_spaces
). Π― Π΄ΠΎΠ±Π°Π²Π»Ρ Π² ΠΏΠ»Π΅Π΅Ρ ΡΡΠ½ΠΊΡΠΈΡ Ρ ΠΈΠΌΠ΅Π½Π΅ΠΌ handle_cookie_pickup
, Π² ΠΊΠΎΡΠΎΡΠΎΠΉ Ρ ΠΏΠΎΡΡΠΎΡΠ½Π½ΠΎ ΠΏΡΠΎΠ²Π΅ΡΡΡ, Π½Π΅ ΡΡΠ°Π»ΠΊΠΈΠ²Π°Π΅ΡΡΡ Π»ΠΈ ΠΏΠ»Π΅Π΅Ρ Ρ ΠΊΠ°ΠΊΠΈΠΌ-Π»ΠΈΠ±ΠΎ cookie. ΠΡΠ»ΠΈ ΡΡΠΎ ΡΠ°ΠΊ, Ρ ΡΠ΄Π°Π»Ρ ΡΠ°ΠΉΠ» cookie ΠΈΠ· ΠΌΠ°ΡΡΠΈΠ²Π°, ΠΈ ΠΎΠ½ Π±ΠΎΠ»ΡΡΠ΅ Π½Π΅ Π±ΡΠ΄Π΅Ρ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°ΡΡΡΡ.
class Cookie(GameObject): def __init__(self, in_surface, x, y): super().__init__(in_surface, x, y, 4, (255, 255, 0), True) # in GameRenderer class def add_cookie(self, obj: GameObject): self._game_objects.append(obj) self._cookies.append(obj) # in Hero class def handle_cookie_pickup(self): collision_rect = pygame.Rect(self.x, self.y, self._size, self._size) cookies = self._renderer.get_cookies() game_objects = self._renderer.get_game_objects() for cookie in cookies: collides = collision_rect.colliderect(cookie.get_shape()) if collides and cookie in game_objects: game_objects.remove(cookie) # in main function: for cookie_space in pacman_game.cookie_spaces: translated = translate_maze_to_screen(cookie_space) cookie = Cookie(game_renderer, translated[0] + unified_size / 2, translated[1] + unified_size / 2) game_renderer.add_cookie(cookie)
Π ΡΠ΅ΠΏΠ΅ΡΡ ΠΎ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅ Π½Π°ΡΠΈΡ ΡΡΠ°ΡΠ°Π½ΠΈΠΉ:
ΠΠ΅Π±ΠΎΠ»ΡΡΠΎΠΉ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΡΠΉ ΡΠ°ΠΊΡ Π½Π°ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠΊ β Π² ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»ΡΠ½ΠΎΠΉ ΠΈΠ³ΡΠ΅ ΠΠ°ΠΊΠΌΠ°Π½ ΠΎΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΡΡΡ Π½Π° ΠΎΠ΄ΠΈΠ½ ΠΊΠ°Π΄Ρ ΠΏΠΎΡΠ»Π΅ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΡΡΠ΅ΡΡ ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ ΠΏΠ΅ΡΠ΅Π½ΡΠ΅, ΠΏΠΎΡΡΠΎΠΌΡ ΠΏΡΠΈΠ·ΡΠ°ΠΊΠ°ΠΌ Π»Π΅Π³ΡΠ΅ Π΅Π³ΠΎ ΠΏΠΎΠΉΠΌΠ°ΡΡ Π² Π½Π°ΡΠ°Π»Π΅ ΠΈΠ³ΡΡ, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΠ»Π΅ Π΅ΡΠ΅ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΎ. Π ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΉ ΡΠ°ΡΡΠΈ ΠΌΡ ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅ΠΌ Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½ΡΡ ΠΈΠ³ΡΠΎΠ²ΡΡ ΠΌΠ΅Ρ Π°Π½ΠΈΠΊΡ, ΠΈ Π²Ρ ΡΠ°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠ°ΡΡΡΠΈΡΡΠ²Π°ΡΡ Π½Π° ΠΈΡΠΊΡΡΡΡΠ²Π΅Π½Π½ΡΠΉ ΠΈΠ½ΡΠ΅Π»Π»Π΅ΠΊΡ Π΄Π»Ρ ΠΏΡΠΈΠ·ΡΠ°ΠΊΠΎΠ², ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°Π½ΠΈΠ΅ ΠΎΡΠΊΠΎΠ², Π·Π²ΡΠΊΠΈ, Π°Π½ΠΈΠΌΠ°ΡΠΈΡ, ΡΠ΅ΠΊΡΡΡΡΡ, Π±ΠΎΠ½ΡΡΡ, ΡΡΡΠ΅ΠΊΡΡ Π΄ΡΠΎΠΆΠ°Π½ΠΈΡ ΡΠΊΡΠ°Π½Π°, ΠΆΠΈΠ·Π½ΠΈ ΠΈ ΠΊΠΎΠ½Π΅ΡΠ½ΡΠ΅ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ ΠΈΠ³ΡΡ.