飞机大战(Python)代码分为两个python文件,工具类和主类,需要安装pygame模块,能完美运行(网上好多不完整的,调试得心累。实现出来,成就感还是满满的),如图所示:
完整代码如下:
1.工具类plane_sprites.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
|
import random
import pygame
# 屏幕大小的常量
SCREEN_RECT = pygame.Rect( 0 , 0 , 480 , 700 )
# 刷新的帧率
FRAME_PER_SEC = 60
# 创建敌机的定时器常量
CREATE_ENEMY_EVENT = pygame.USEREVENT
# 英雄发射子弹事件
HERO_FIRE_EVENT = pygame.USEREVENT + 1
class 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 ):
# 在屏幕的垂直方向上移动
self .rect.y + = self .speed
class Background(GameSprite):
"""游戏背景精灵"""
def __init__( self , is_alt = False ):
super ().__init__( "C:/Users/Administrator/Desktop/background.png" ) # 1. 调用父类方法实现精灵的创建(image/rect/speed)
if is_alt: # 2. 判断是否是交替图像,如果是,需要设置初始位置
self .rect.y = - self .rect.height
def update( self ):
super ().update() # 1. 调用父类的方法实现
if self .rect.y > = SCREEN_RECT.height: # 2. 判断是否移出屏幕,如果移出屏幕,将图像设置到屏幕的上方
self .rect.y = - self .rect.height
class Enemy(GameSprite):
"""敌机精灵"""
def __init__( self ):
super ().__init__( "C:/Users/Administrator/Desktop/enemy1.png" ) # 1. 调用父类方法,创建敌机精灵,同时指定敌机图片
self .speed = random.randint( 1 , 3 ) # 2. 指定敌机的初始随机速度 1 ~ 3
self .rect.bottom = 0 # 3. 指定敌机的初始随机位置
max_x = SCREEN_RECT.width - self .rect.width
self .rect.x = random.randint( 0 , max_x)
def update( self ):
super ().update() # 1. 调用父类方法,保持垂直方向的飞行
# 2. 判断是否飞出屏幕,如果是,需要从精灵组删除敌机
if self .rect.y > = SCREEN_RECT.height:
self .kill()
# print("飞出屏幕,需要从精灵组删除...")
# kill方法可以将精灵从所有精灵组中移出,精灵就会被自动销毁
def __del__( self ):
# print("敌机挂了 %s" % self.rect)
pass
class Hero(GameSprite):
"""英雄精灵"""
def __init__( self ):
super ().__init__( "C:/Users/Administrator/Desktop/me1.png" , 0 )
self .rect.centerx = SCREEN_RECT.centerx
self .rect.bottom = SCREEN_RECT.bottom - 120
self .bullets = pygame.sprite.Group()
def update( self ):
self .rect.x + = self .speed
if self .rect.x < 0 :
self .rect.x = 0
elif self .rect.right > SCREEN_RECT.right:
self .rect.right = SCREEN_RECT.right
def fire( self ):
print ( "发射子弹..." )
for i in ( 0 , 1 , 2 ):
bullet = Bullet()
bullet.rect.bottom = self .rect.y - i * 20
bullet.rect.centerx = self .rect.centerx
self .bullets.add(bullet)
class Bullet(GameSprite):
"""子弹精灵"""
def __init__( self ):
super ().__init__( "C:/Users/Administrator/Desktop/bullet1.png" , - 2 )
def update( self ):
super ().update()
if self .rect.bottom < 0 :
self .kill()
def __del__( self ):
print ( "子弹被销毁..." )
|
2.主类plane_main.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
|
import pygame
from plane_sprites import *
class PlaneGame( object ):
"""飞机大战主游戏"""
def __init__( self ):
print ( "游戏初始化" )
self .screen = pygame.display.set_mode(SCREEN_RECT.size)
self .clock = pygame.time.Clock()
self .__create_sprites()
pygame.time.set_timer(CREATE_ENEMY_EVENT, 1000 )
pygame.time.set_timer(HERO_FIRE_EVENT, 500 )
def __create_sprites( self ):
bg1 = Background()
bg2 = Background( True )
self .back_group = pygame.sprite.Group(bg1, bg2)
self .enemy_group = pygame.sprite.Group()
self .hero = Hero()
self .hero_group = pygame.sprite.Group( self .hero)
def start_game( self ):
print ( "游戏开始..." )
while True :
self .clock.tick(FRAME_PER_SEC)
self .__event_handler()
self .__check_collide()
self .__update_sprites()
pygame.display.update()
def __event_handler( self ):
for event in pygame.event.get():
if event. type = = pygame.QUIT:
PlaneGame.__game_over()
elif event. type = = CREATE_ENEMY_EVENT:
# print("敌机出场...")
# 创建敌机精灵
enemy = Enemy()
self .enemy_group.add(enemy)
elif event. type = = HERO_FIRE_EVENT:
self .hero.fire()
# elif event.type == pygame.KEYDOWN and event.key == pygame.K_RIGHT:
# print("向右移动...")
keys_pressed = pygame.key.get_pressed()
if keys_pressed[pygame.K_RIGHT]:
self .hero.speed = 2
elif keys_pressed[pygame.K_LEFT]:
self .hero.speed = - 2
else :
self .hero.speed = 0
def __check_collide( self ):
for event in pygame.event.get():
if event. type = = pygame.QUIT:
PlaneGame.__game_over()
elif event. type = = CREATE_ENEMY_EVENT:
enemy = Enemy()
self .enemy_group.add(enemy)
elif event. type = = HERO_FIRE_EVENT:
self .hero.fire()
keys_pressed = pygame.key.get_pressed()
if keys_pressed[pygame.K_RIGHT]:
self .hero.speed = 2
elif keys_pressed[pygame.K_LEFT]:
self .hero.speed = - 2
else :
self .hero.speed = 0
def __check_collide( self ):
pygame.sprite.groupcollide( self .hero.bullets, self .enemy_group, True , True )
enemies = pygame.sprite.spritecollide( self .hero, self .enemy_group, True )
if len (enemies) > 0 :
self .hero.kill()
PlaneGame.__game_over()
def __update_sprites( self ):
self .back_group.update()
self .back_group.draw( self .screen)
self .enemy_group.update()
self .enemy_group.draw( self .screen)
self .hero_group.update()
self .hero_group.draw( self .screen)
self .hero.bullets.update()
self .hero.bullets.draw( self .screen)
@staticmethod
def __game_over():
print ( "游戏结束" )
pygame.quit()
exit()
if __name__ = = '__main__' :
game = PlaneGame()
game.start_game()
|
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/weixin_44193909/article/details/88964137