Goal--using object-oriented design aircraft war game class
Goal
- Clear Main program Responsibilities
- Implementing the Main program class
- Prepare the game Sprite Group
01, clear the main program responsibility
- Review the QuickStart case , the responsibility of a game main program can be divided into two parts
- Game initialization
- Game Loop
- According to clear responsibilities, the design
PlaneGame
class is as follows:
tips to encapsulate a private method according to responsibilities , you can avoid the code of one method being too verbose; If a method is written too long, it is not good to read or to maintain.
- Game Initialization -the
__init__()
method is called:
Method |
Responsibilities |
__event_handler(self) |
Event Monitoring |
__check_collide(self) |
Collision detection--bullets destroy enemy planes, enemy planes crash heroes |
__update_sprites(self) |
Sprite Group Update and draw |
__game_over() |
Game Over |
02, to achieve aircraft vs. main Game Class 2.1 clear document Responsibilities
plane_main
- 1, encapsulating the main game class
- 2. Create a Game object
- 3, start the game
plane_sprites
- Encapsulates all the sprite subclasses that need to be used in the game
- tools to provide games
Code implementation
- Create
plane_main.py
a new file and set it to executable
- Writing the underlying code
import pygamefrom Aircraft_War.plane_sprites import *class PlaneGame(object): """飞机大战主游戏""" def __init__(self): print("游戏初始化") # 1,创建游戏的窗口 self.screen = pygame.display.set_mode((480, 700)) # 2,创建游戏的时钟 self.clock = pygame.time.Clock() # 3,调用私有方法, 精灵和精灵组的创建 self.__create_sprites() def __create_sprites(self): pass def start_game(self): print("游戏开始...")if __name__ == ‘__main__‘: # 创建游戏对象 game = PlaneGame() # 启动游戏 game.start_game()
Use constants instead of fixed values
- Constant--the quantity that does not change
- Variable--The amount that can be changed
Application Scenarios
- At development time, you may want to use a fixed value , such as the height of the screen
700
- At this time, it is recommended not to use fixed values directly, but to use constants
- When developing, try not to use magic numbers in order to maintain code maintainability
Definition of constants
- The syntax for defining constants and defining variables is exactly the same as using assignment statements
- The command for a constant should be that all letters are uppercase, and the words are underlined between the words
The benefits of constants
- When reading code, you don't need to guess the meaning of a number by means of a constant name .
- If you need to adjust the value , you only need to modify the constant definition to achieve uniform modification
hint : Python does not have a really meaningful constant, just by naming the convention--all letters are capitalized in time constants, not easy to modify when developing!
Code Adjustment
plane_sprites.py
increase the definition of a constant in
plane_sprites.py
import pygame# 屏幕大小的常量SCREEN_RECT = pygame.Rect(0, 0, 480, 700)# 刷新的帧率FRAME_PER_SEC = 60class GameSprite(pygame.sprite.Sprite): """飞机大战游戏精灵""" def __init__(self, image_name, speed=1): # 调用父类的初始化方法 super().__init__() # 定义对象的属性 self.image = pygame.image.load(image_name) self.rect = self.image.get_rect() self.speed = speed def update(self, *args): # 在屏幕的垂直方向上移动 self.rect.y += self.speed
plan_main.py
Import pygamefrom aircraft_war.plane_sprites Import *class planegame (object): "" "Aircraft vs. Main game" "Def __init__ (self): Print ("Game Initialization") # 1, create a game window # self.screen = Pygame.display.set_mode ((480, $)) Self.screen = Pygam E.display.set_mode (screen_rect.size) # 2, create game clock Self.clock = Pygame.time.Clock () # 3, call private method, Sprite and Sprite Group Create Self.__create_sprites () def __create_sprites (self): Pass def start_game (self): print ("game starts. .") While True: # 1, set refresh frame rate Self.clock.tick (frame_per_sec) # 2, Event listener Self.__event_ha Ndler () # 3, Collision Detection Self.__check_collide () # 4, update/Draw Sprite Group Self.__update_sprites () # 5, update display pygame.display.update () def __event_handler (self): for event in Pygame.event.get () : # Determine whether to exit the game if Event.type = = Pygame. Quit:planegame.__game_over () def __check_collide (self): Pass Def __update_sprites (self): pass @staticmethod def __game_over (): Print ("Game Over") p Ygame. QUIT () exit () if __name__ = = ' __main__ ': # Create game Object games = Planegame () # Start Game game.start_game ()
Python--project combat--game frame setup