<> preface
We used it before python Wrote part of the code for the aircraft war , Only the hero plane can be displayed , background , Enemy planes and bullets , Today, the background music , Destroy enemy aircraft , burst
Deep fried effect , Scores and other related functions are added together , The code is a little long , More than 300 lines , Here comes the code you want ?
<> Programming ideas
Main use pygame library , Class creation , Function call, etc , Not much to say , Upper procedure .
<> Programming implementation
Python exchange of learning Q group :906715085#### import pygame # Import dynamic module (.dll .pyd .so) You do not need to follow the package name with the module name
from pygame.locals import * import time import random import sys #
Defining constants ( After definition , No value change ) WINDOW_HEIGHT = 768 WINDOW_WIDTH = 512 enemy_list = [] score = 0
is_restart= False class Map: def __init__(self, img_path, window): self.x = 0
self.bg_img1 = pygame.image.load(img_path) self.bg_img2 = pygame.image.load(
img_path) self.bg1_y = - WINDOW_HEIGHT self.bg2_y = 0 self.window = window def
move(self): # When map 1 of y Axis moves to 0, Then reset if self.bg1_y >= 0: self.bg1_y = - WINDOW_HEIGHT
# When map 2 of y Axis moves to Bottom of window , Then reset if self.bg2_y >= WINDOW_HEIGHT: self.bg2_y = 0 #
Move every cycle 1 Pixels self.bg1_y += 3 self.bg2_y += 3 def display(self): """ Mapping """ self.
window.blit(self.bg_img1, (self.x, self.bg1_y)) self.window.blit(self.bg_img2, (
self.x, self.bg2_y)) class HeroBullet: """ Hero bullets """ def __init__(self, img_path,
x, y, window): self.img = pygame.image.load(img_path) self.x = x self.y = y self
.window = window def display(self): self.window.blit(self.img, (self.x, self.y))
def move(self): """ Upward flight distance of bullet """ self.y -= 6 def is_hit_enemy(self, enemy): if
pygame.Rect.colliderect( pygame.Rect(self.x, self.y, 20, 31), pygame.Rect(enemy.
x, enemy.y, 100, 68) ): # Judge whether it is crossed return True else: return False class EnemyPlane
: """ Enemy aircraft """ def __init__(self, img_path, x, y, window): self.img = pygame.
image.load(img_path) # Picture object self.x = x # Aircraft coordinates self.y = y self.window = window #
Window where the aircraft is located self.is_hited = False self.anim_index = 0 self.hit_sound = pygame.mixer.
Sound("E:/ Aircraft battle /baozha.ogg") def move(self): self.y += 10 # Reach lower window boundary , Back to top if self.
y>= WINDOW_HEIGHT: self.x = random.randint(0, random.randint(0, WINDOW_WIDTH -
100)) self.y = 0 def plane_down_anim(self): """ Enemy aircraft hit animation """ if self.anim_index >=
21: # Animation execution completed self.anim_index = 0 self.img = pygame.image.load(
"E:/ Aircraft battle /img-plane_%d.png" % random.randint(1, 7)) self.x = random.randint(0,
WINDOW_WIDTH- 100) self.y = 0 self.is_hited = False return elif self.anim_index
== 0: self.hit_sound.play() self.img = pygame.image.load( "E:/ Aircraft battle /bomb-%d.png"
% (self.anim_index // 3 + 1)) self.anim_index += 1 def display(self): """ Mapping """
if self.is_hited: self.plane_down_anim() self.window.blit(self.img, (self.x,
self.y)) class HeroPlane: def __init__(self, img_path, x, y, window): self.img =
pygame.image.load(img_path) # Picture object self.x = x # Aircraft coordinates self.y = y self.window =
window# Window where the aircraft is located self.bullets = [] # Record all bullets fired by the aircraft self.is_hited = False self.
is_anim_down= False self.anim_index = 0 def is_hit_enemy(self, enemy): if pygame
.Rect.colliderect( pygame.Rect(self.x, self.y, 120, 78), pygame.Rect(enemy.x,
enemy.y, 100, 68) ): # Judge whether it is crossed return True else: return False def plane_down_anim
(self): """ Enemy aircraft hit animation """ if self.anim_index >= 21: # Animation execution completed self.is_hited = False
self.is_anim_down = True return self.img = pygame.image.load(
"E:/ Aircraft battle /bomb-%d.png" % (self.anim_index // 3 + 1)) self.anim_index += 1 def
display(self): """ Mapping """ for enemy in enemy_list: if self.is_hit_enemy(enemy):
enemy.is_hited = True self.is_hited = True self.plane_down_anim() break self.
window.blit(self.img, (self.x, self.y)) def display_bullets(self): # Stick bullet diagram
deleted_bullets= [] for bullet in self.bullets: # judge Does the bullet exceed Upper boundary if bullet.y >= -
31: # No boundary bullet.display() bullet.move() else: # Fly out of the boundary deleted_bullets.append(
bullet) for enemy in enemy_list: if bullet.is_hit_enemy(enemy): # Determine whether the enemy aircraft has been hit enemy
.is_hited = True deleted_bullets.append(bullet) global score score += 10 break
for out_window_bullet in deleted_bullets: self.bullets.remove(out_window_bullet)
def move_left(self): """ Fly to the left """ if self.x >= 0 and not self.is_hited: self.x -=
10 def move_right(self): """ Fly right """ if self.x <= WINDOW_WIDTH - 120 and not self.
is_hited: self.x += 10 def move_up(self): """ Fly up """ if self.y >= 0 and not self.
is_hited: self.y -= 5 def move_down(self): """ Fly down """ if self.y <= WINDOW_HEIGHT
- 78 and not self.is_hited: self.y += 5 def fire(self): """ Fire a bullet """ # Create bullet object bullet x
= aircraft x + Half the width of the aircraft - Half the width of the bullet bullet = HeroBullet("E:/ Aircraft battle /bullet_17.png", self.x +
60 - 10, self.y - 31, self.window) # Show bullets ( Stick bullet diagram ) bullet.display() self.bullets.
append(bullet) # To prevent the bullet object from being released ( Only local variables reference objects , Method will be released as soon as it is executed ) class Game: def __init__(
self): pygame.init() # Set title pygame.display.set_caption(" Aircraft battle v1.0") # Settings Icon
game_ico= pygame.image.load("E:/ Aircraft battle /app.ico") pygame.display.set_icon(game_ico)
pygame.mixer.music.load("E:/ Aircraft battle /bg2.ogg") # End of game sound ( Super Marie ) self.gameover_sound
= pygame.mixer.Sound("E:/ Aircraft battle /gameover.wav") # Loop background music pygame.mixer.music.play(
-1) # create a window set_mode(( Window size )) self.window = pygame.display.set_mode((WINDOW_WIDTH,
WINDOW_HEIGHT)) # Create map objects self.game_map = Map("E:/ Aircraft battle /img_bg_level_%d.jpg" %
random.randint(1, 5), self.window) # create object self.hero_plane = HeroPlane(
"E:/ Aircraft battle /hero2.png", 240, 500, self.window) enemy_plane1 = EnemyPlane(
"E:/ Aircraft battle /img-plane_%d.png" % random.randint( 1, 7), random.randint(0,
WINDOW_WIDTH- 100), 0, self.window) enemy_plane2 = EnemyPlane(
"E:/ Aircraft battle /img-plane_%d.png" % random.randint(1, 7), random.randint(0,
WINDOW_WIDTH- 100), random.randint(-150, -68), self.window) enemy_plane3 =
EnemyPlane("E:/ Aircraft battle /img-plane_%d.png" % random.randint(1, 7), random.randint(0,
WINDOW_WIDTH- 100), random.randint(-300, -140), self.window) enemy_list.append(
enemy_plane1) enemy_list.append(enemy_plane2) enemy_list.append(enemy_plane3)
self.enemy_list = enemy_list # Create text object # self.score_font =
pygame.font.SysFont("simhei", 40) self.score_font = pygame.font.Font(
"E:/ Aircraft battle /SIMHEI.TTF", 40) def draw_text(self, content, size, x, y): # font_obj
= pygame.font.SysFont("simhei", size) font_obj = pygame.font.Font(
"E:/ Aircraft battle /SIMHEI.TTF", size) text = font_obj.render(content, 1, (255, 255, 255))
self.window.blit(text, (x, y)) def wait_game_input(self): while True: for event
in pygame.event.get(): if event.type == QUIT: sys.exit() pygame.quit() elif
event.type == KEYDOWN: if event.key == K_ESCAPE: sys.exit() pygame.quit() elif
event.key == K_RETURN: global is_restart, score is_restart = True score = 0
return def game_start(self): # Paste background picture self.game_map.display() self.draw_text(
" Aircraft battle ", 40, WINDOW_WIDTH / 2 - 100, WINDOW_HEIGHT / 3) self.draw_text(
" Press Enter Start the game , Esc Exit the game .", 28, WINDOW_WIDTH /3 - 140, WINDOW_HEIGHT /2) pygame.
display.update() self.wait_game_input() def game_over(self): # Stop the background music first pygame.
mixer.music.stop() # Play sound again self.gameover_sound.play() # Paste background picture self.game_map.
display() self.draw_text(" The fighter plane was shot down , Score is %d" % score, 28, WINDOW_WIDTH / 3 - 100,
WINDOW_HEIGHT/ 3) self.draw_text(" Press Enter restart , Esc Exit the game .", 28, WINDOW_WIDTH / 3 -
140, WINDOW_HEIGHT / 2) pygame.display.update() self.wait_game_input() self.
gameover_sound.stop() def key_control(self): # Get events , Such as buttons Display interface first , Based on the acquired events , Modify interface effect
for event in pygame.event.get(): # Determine whether the exit button is clicked if event.type == QUIT: sys.exit(
) # Terminate the program pygame.quit() # Determine whether the key is pressed elif event.type == KEYDOWN: # Check whether the key is a space bar if
event.key == K_SPACE: self.hero_plane.fire() # Get continuous press pressed_keys = pygame.
key.get_pressed() if pressed_keys[pygame.K_LEFT]: self.hero_plane.move_left() if
pressed_keys[pygame.K_RIGHT]: self.hero_plane.move_right() if pressed_keys[
pygame.K_UP]: self.hero_plane.move_up() if pressed_keys[pygame.K_DOWN]: self.
hero_plane.move_down() def display(self): # Paste background image self.game_map.display() self.
game_map.move() # Paste aircraft map self.hero_plane.display() self.hero_plane.display_bullets
() # Paste enemy aircraft map for enemy in enemy_list: enemy.display() # Let the enemy aircraft move if not enemy.is_hited
: enemy.move() # Paste score text score_text = self.score_font.render(" score :%d" % score, 1, (
255, 255, 255)) self.window.blit(score_text, (10, 10)) # Refresh interface Do not refresh will not update the displayed content
pygame.display.update() def run(self): if is_restart == False: self.game_start()
while True: # Display interface self.display() if self.hero_plane.is_anim_down: self.
hero_plane.is_anim_down = False global enemy_list enemy_list = [] break # Keyboard control
self.key_control() # Each cycle , Let the program sleep for a while time.sleep(0.01) self.game_over() def main():
""" Main function Generally, the entry of the program """ # Run the game while True: # Create GameObject game = Game() game.run() if
__name__== '__main__': # Determine whether to execute the file actively main() import pygame # Import dynamic module (.dll .pyd
.so) You do not need to follow the package name with the module name from pygame.locals import * import time import random import
sys# Defining constants ( After definition , No value change ) WINDOW_HEIGHT = 768 WINDOW_WIDTH = 512 enemy_list = [] score
= 0 is_restart = False class Map: def __init__(self, img_path, window): self.x =
0 self.bg_img1 = pygame.image.load(img_path) self.bg_img2 = pygame.image.load(
img_path) self.bg1_y = - WINDOW_HEIGHT self.bg2_y = 0 self.window = window def
move(self): # When map 1 of y Axis moves to 0, Then reset if self.bg1_y >= 0: self.bg1_y = - WINDOW_HEIGHT
# When map 2 of y Axis moves to Bottom of window , Then reset if self.bg2_y >= WINDOW_HEIGHT: self.bg2_y = 0 #
Move every cycle 1 Pixels self.bg1_y += 3 self.bg2_y += 3 def display(self): """ Mapping """ self.
window.blit(self.bg_img1, (self.x, self.bg1_y)) self.window.blit(self.bg_img2, (
self.x, self.bg2_y)) class HeroBullet: """ Hero bullets """ def __init__(self, img_path,
x, y, window): self.img = pygame.image.load(img_path) self.x = x self.y = y self
.window = window def display(self): self.window.blit(self.img, (self.x, self.y))
def move(self): """ Upward flight distance of bullet """ self.y -= 6 def is_hit_enemy(self, enemy): if
pygame.Rect.colliderect( pygame.Rect(self.x, self.y, 20, 31), pygame.Rect(enemy.
x, enemy.y, 100, 68) ): # Judge whether it is crossed return True else: return False class EnemyPlane
: """ Enemy aircraft """ def __init__(self, img_path, x, y, window): self.img = pygame.
image.load(img_path) # Picture object self.x = x # Aircraft coordinates self.y = y self.window = window #
Window where the aircraft is located self.is_hited = False self.anim_index = 0 self.hit_sound = pygame.mixer.
Sound("E:/ Aircraft battle /baozha.ogg") def move(self): self.y += 10 # Reach lower window boundary , Back to top if self.
y>= WINDOW_HEIGHT: self.x = random.randint(0, random.randint(0, WINDOW_WIDTH -
100)) self.y = 0 def plane_down_anim(self): """ Enemy aircraft hit animation """ if self.anim_index >=
21: # Animation execution completed self.anim_index = 0 self.img = pygame.image.load(
"E:/ Aircraft battle /img-plane_%d.png" % random.randint(1, 7)) self.x = random.randint(0,
WINDOW_WIDTH- 100) self.y = 0 self.is_hited = False return elif self.anim_index
== 0: self.hit_sound.play() self.img = pygame.image.load( "E:/ Aircraft battle /bomb-%d.png"
% (self.anim_index // 3 + 1)) self.anim_index += 1 def display(self): """ Mapping """
if self.is_hited: self.plane_down_anim() self.window.blit(self.img, (self.x,
self.y)) class HeroPlane: def __init__(self, img_path, x, y, window): self.img =
pygame.image.load(img_path) # Picture object self.x = x # Aircraft coordinates self.y = y self.window =
window# Window where the aircraft is located self.bullets = [] # Record all bullets fired by the aircraft self.is_hited = False self.
is_anim_down= False self.anim_index = 0 def is_hit_enemy(self, enemy): if pygame
.Rect.colliderect( pygame.Rect(self.x, self.y, 120, 78), pygame.Rect(enemy.x,
enemy.y, 100, 68) ): # Judge whether it is crossed return True else: return False def plane_down_anim
(self): """ Enemy aircraft hit animation """ if self.anim_index >= 21: # Animation execution completed self.is_hited = False
self.is_anim_down = True return self.img = pygame.image.load(
"E:/ Aircraft battle /bomb-%d.png" % (self.anim_index // 3 + 1)) self.anim_index += 1 def
display(self): """ Mapping """ for enemy in enemy_list: if self.is_hit_enemy(enemy):
enemy.is_hited = True self.is_hited = True self.plane_down_anim() break self.
window.blit(self.img, (self.x, self.y)) def display_bullets(self): # Stick bullet diagram
deleted_bullets= [] for bullet in self.bullets: # judge Does the bullet exceed Upper boundary if bullet.y >= -
31: # No boundary bullet.display() bullet.move() else: # Fly out of the boundary deleted_bullets.append(
bullet) for enemy in enemy_list: if bullet.is_hit_enemy(enemy): # Determine whether the enemy aircraft has been hit enemy
.is_hited = True deleted_bullets.append(bullet) global score score += 10 break
for out_window_bullet in deleted_bullets: self.bullets.remove(out_window_bullet)
def move_left(self): """ Fly to the left """ if self.x >= 0 and not self.is_hited: self.x -=
10 def move_right(self): """ Fly right """ if self.x <= WINDOW_WIDTH - 120 and not self.
is_hited: self.x += 10 def move_up(self): """ Fly up """ if self.y >= 0 and not self.
is_hited: self.y -= 5 def move_down(self): """ Fly down """ if self.y <= WINDOW_HEIGHT
- 78 and not self.is_hited: self.y += 5 def fire(self): """ Fire a bullet """ # Create bullet object bullet x
= aircraft x + Half the width of the aircraft - Half the width of the bullet bullet = HeroBullet("E:/ Aircraft battle /bullet_17.png", self.x +
60 - 10, self.y - 31, self.window) # Show bullets ( Stick bullet diagram ) bullet.display() self.bullets.
append(bullet) # To prevent the bullet object from being released ( Only local variables reference objects , Method will be released as soon as it is executed ) class Game: def __init__(
self): pygame.init() # Set title pygame.display.set_caption(" Aircraft battle v1.0") # Settings Icon
game_ico= pygame.image.load("E:/ Aircraft battle /app.ico") pygame.display.set_icon(game_ico)
pygame.mixer.music.load("E:/ Aircraft battle /bg2.ogg") # End of game sound ( Super Marie ) self.gameover_sound
= pygame.mixer.Sound("E:/ Aircraft battle /gameover.wav") # Loop background music pygame.mixer.music.play(
-1) # create a window set_mode(( Window size )) self.window = pygame.display.set_mode((WINDOW_WIDTH,
WINDOW_HEIGHT)) # Create map objects self.game_map = Map("E:/ Aircraft battle /img_bg_level_%d.jpg" %
random.randint(1, 5), self.window) # create object self.hero_plane = HeroPlane(
"E:/ Aircraft battle /hero2.png", 240, 500, self.window) enemy_plane1 = EnemyPlane(
"E:/ Aircraft battle /img-plane_%d.png" % random.randint( 1, 7), random.randint(0,
WINDOW_WIDTH- 100), 0, self.window) enemy_plane2 = EnemyPlane(
"E:/ Aircraft battle /img-plane_%d.png" % random.randint(1, 7), random.randint(0,
WINDOW_WIDTH- 100), random.randint(-150, -68), self.window) enemy_plane3 =
EnemyPlane("E:/ Aircraft battle /img-plane_%d.png" % random.randint(1, 7), random.randint(0,
WINDOW_WIDTH- 100), random.randint(-300, -140), self.window) enemy_list.append(
enemy_plane1) enemy_list.append(enemy_plane2) enemy_list.append(enemy_plane3)
self.enemy_list = enemy_list # Create text object # self.score_font =
pygame.font.SysFont("simhei", 40) self.score_font = pygame.font.Font(
"E:/ Aircraft battle /SIMHEI.TTF", 40) def draw_text(self, content, size, x, y): # font_obj
= pygame.font.SysFont("simhei", size) font_obj = pygame.font.Font(
"E:/ Aircraft battle /SIMHEI.TTF", size) text = font_obj.render(content, 1, (255, 255, 255))
self.window.blit(text, (x, y)) def wait_game_input(self): while True: for event
in pygame.event.get(): if event.type == QUIT: sys.exit() pygame.quit() elif
event.type == KEYDOWN: if event.key == K_ESCAPE: sys.exit() pygame.quit() elif
event.key == K_RETURN: global is_restart, score is_restart = True score = 0
return def game_start(self): # Paste background picture self.game_map.display() self.draw_text(
" Aircraft battle ", 40, WINDOW_WIDTH / 2 - 100, WINDOW_HEIGHT / 3) self.draw_text(
" Press Enter Start the game , Esc Exit the game .", 28, WINDOW_WIDTH /3 - 140, WINDOW_HEIGHT /2) pygame.
display.update() self.wait_game_input() def game_over(self): # Stop the background music first pygame.
mixer.music.stop() # Play sound again self.gameover_sound.play() # Paste background picture self.game_map.
display() self.draw_text(" The fighter plane was shot down , Score is %d" % score, 28, WINDOW_WIDTH / 3 - 100,
WINDOW_HEIGHT/ 3) self.draw_text(" Press Enter restart , Esc Exit the game .", 28, WINDOW_WIDTH / 3 -
140, WINDOW_HEIGHT / 2) pygame.display.update() self.wait_game_input() self.
gameover_sound.stop() def key_control(self): # Get events , Such as buttons Display interface first , Based on the acquired events , Modify interface effect
for event in pygame.event.get(): # Determine whether the exit button is clicked if event.type == QUIT: sys.exit(
) # Terminate the program pygame.quit() # Determine whether the key is pressed elif event.type == KEYDOWN: # Check whether the key is a space bar if
event.key == K_SPACE: self.hero_plane.fire() # Get continuous press pressed_keys = pygame.
key.get_pressed() if pressed_keys[pygame.K_LEFT]: self.hero_plane.move_left() if
pressed_keys[pygame.K_RIGHT]: self.hero_plane.move_right() if pressed_keys[
pygame.K_UP]: self.hero_plane.move_up() if pressed_keys[pygame.K_DOWN]: self.
hero_plane.move_down() def display(self): # Paste background image self.game_map.display() self.
game_map.move() # Paste aircraft map self.hero_plane.display() self.hero_plane.display_bullets
() # Paste enemy aircraft map for enemy in enemy_list: enemy.display() # Let the enemy aircraft move if not enemy.is_hited
: enemy.move() # Paste score text score_text = self.score_font.render(" score :%d" % score, 1, (
255, 255, 255)) self.window.blit(score_text, (10, 10)) # Refresh interface Do not refresh will not update the displayed content
pygame.display.update() def run(self): if is_restart == False: self.game_start()
while True: # Display interface self.display() if self.hero_plane.is_anim_down: self.
hero_plane.is_anim_down = False global enemy_list enemy_list = [] break # Keyboard control
self.key_control() # Each cycle , Let the program sleep for a while time.sleep(0.01) self.game_over() def main():
""" Main function Generally, the entry of the program """ # Run the game while True: # Create GameObject game = Game() game.run() if
__name__== '__main__': # Determine whether to execute the file actively main() # The code is a little long , You have to pull down hard ...
<> design sketch
<> last
This is the end of the little game of aircraft war that I'll share with you today , Put the code on it , Let's have a try with the little friend you like .
Technology