0、Python版飞机大战程序代码
需要Python学习资料的朋友可以戳资料哦!
代码1:
1 import random 2 import pygame 3 4 # 屏幕大小的常量 5 SCREEN\_RECT = pygame.Rect(0, 0, 480, 700) 6 # 刷新的帧率 7 FRAME\_PER\_SEC = 60 8 # 创建敌机的定时器常量 9 CREATE\_ENEMY\_EVENT = pygame.USEREVENT 10 # 英雄发射子弹事件 11 HERO\_FIRE\_EVENT = pygame.USEREVENT+1 12 #子弹速度 13 BULLET\_SPEED = -2.5 14 15 16 class GameSprite(pygame.sprite.Sprite): 17 """"飞机大战游戏精灵""" 18 19 def \_\_init\_\_(self, image\_name, speed = 1): 20 # 调用父亲的初始化方法 21 super().\_\_init\_\_() 22 # 定义对象的属性 23 self.image = pygame.image.load(image\_name) 24 self.rect = self.image.get\_rect() 25 self.speed = speed 26 27 def update(self): 28 #在屏幕的垂直方向上移动 29 self.rect.y += self.speed 30 31 32 class Background(GameSprite): 33 """"游戏背景精灵""" 34 35 def \_\_init\_\_(self, is\_alt = False): 36 # 1.调用父类构造方法 37 super().\_\_init\_\_("./images/background.png") 38 # 2.判断是否与前图像循环重合,若否,则需重新设置初始位置 39 if is\_alt: 40 self.rect.y = -self.rect.height 41 42 43 def update(self): 44 # 1.调用父类的方法,,,注意super后面要加括号!!! 45 super().update() 46 # 2.判断是否移出屏幕 47 if self.rect.y >= SCREEN\_RECT.height: 48 self.rect.y = -self.rect.height 49 50 51 class Enemy(GameSprite): 52 """"敌机精灵""" 53 54 def \_\_init\_\_(self): 55 # 1.调用父类方法,创建敌机精灵 56 super().\_\_init\_\_("./images/enemy1.png") 57 # 2. 指定敌机的初始随机速度 1-2-3 58 self.speed = random.randint(1,3) 59 # 3.指定敌机的初始随机位置 60 self.rect.bottom = 0 61 62 max\_x = SCREEN\_RECT.width - self.rect.width 63 self.rect.x = random.randint(0, max\_x) 64 65 66 def update(self): 67 68 # 1.调用父类方法,保持垂直方向的飞行 69 super().update() 70 # 2.判断是否非出屏幕,如果是,需要从精灵组删除敌机 71 if self.rect.y >= SCREEN\_RECT.height: 72 #print("飞出屏幕,需要从精灵组删除...") 73 # kill方法可以将精灵从精灵组中移除 74 self.kill() 75 76 def \_\_del\_\_(self): 77 #print("敌机挂了%s" %self.rect) 78 pass 79 80 81 class Hero(GameSprite): 82 """英雄精灵""" 83 84 def \_\_init\_\_(self): 85 # 1.调用父类方法,设置image和speed 86 super().\_\_init\_\_("./images/me1.png", speed = 0) 87 self.speed1 = 0 88 # 2.设置英雄的初始位置 89 self.rect.centerx = SCREEN\_RECT.centerx 90 self.rect.bottom = SCREEN\_RECT.bottom - 100 91 # 3.创建子弹精灵组 92 self.bullets = pygame.sprite.Group() 93 94 def update(self): 95 #(错误的判断句,会导致一旦出界就很难再恢复回来)if 0 <= self.rect.x <= SCREEN\_RECT.width - self.rect.width: 96 self.rect.x += self.speed 97 if self.rect.x < 0: 98 self.rect.x = 0 99 elif self.rect.right > SCREEN\_RECT.width:100 self.rect.right = SCREEN\_RECT.width101 102 self.rect.y += self.speed1103 if self.rect.y < 0:104 self.rect.y = 0105 elif self.rect.bottom > SCREEN\_RECT.height:106 self.rect.bottom = SCREEN\_RECT.height107 108 109 def fire(self):110 #print("发射子弹")111 # 1.创建子弹精灵112 bullet = Bullet()113 # 2.设置精灵位置114 bullet.rect.bottom = self.rect.y115 bullet.rect.centerx = self.rect.centerx116 # 3.将精灵添加到精灵组117 self.bullets.add(bullet)118 119 120 class Bullet(GameSprite):121 """"子弹精灵"""122 123 def \_\_init\_\_(self):124 # 调用父类方法125 super().\_\_init\_\_("./images/bullet1.png", BULLET\_SPEED)126 127 def update(self):128 super().update()129 if self.rect.bottom < 0:130 self.kill()131 132 def \_\_del\_\_(self):133 #print("子弹被销毁")134 pass
View Code
代码2:
1 from plane\_sprites import \* 2 # 游戏主程序 3 4 class PlaneGame(object): 5 """"飞机大战主游戏""" 6 7 def \_\_init\_\_(self): 8 print("游戏初始化") 9 10 # 1.创建游戏的窗口 11 self.screen = pygame.display.set\_mode(SCREEN\_RECT.size) 12 # 2.创建游戏的时钟 13 self.clock = pygame.time.Clock() 14 # 3.调用私有方法,精灵和精灵组的创建 15 self.\_\_create\_sprites() 16 # 4.设置定时器事件——创建敌机 1s 17 pygame.time.set\_timer(CREATE\_ENEMY\_EVENT,1000) 18 pygame.time.set\_timer(HERO\_FIRE\_EVENT, 300) 19 20 def \_\_create\_sprites(self): 21 # 创建背景精灵和精灵组 22 bg1 = Background() 23 bg2 = Background(True) 24 self.back\_group = pygame.sprite.Group(bg1, bg2) 25 # 创建敌机精灵 26 self.enemy\_group = pygame.sprite.Group() 27 # 创建英雄精灵 28 self.hero = Hero() 29 self.hero\_group = pygame.sprite.Group(self.hero) 30 31 32 def start\_game(self): 33 print("游戏开始...") 34 35 while True: 36 # 1.设置刷新帧率 37 self.clock.tick(FRAME\_PER\_SEC) 38 # 2.事件监听 39 self.\_\_event\_handler() 40 # 3.碰撞检测 41 self.\_\_check\_collide() 42 # 4.更新/绘制精灵组 43 self.\_\_update\_sprites() 44 # 5.更新显示 45 pygame.display.update() 46 47 48 def \_\_event\_handler(self): 49 for event in pygame.event.get(): 50 #判断是否退出游戏 51 if event.type == pygame.QUIT: 52 PlaneGame.\_\_game\_over() 53 elif event.type == CREATE\_ENEMY\_EVENT: 54 #print("敌机出现。。。") 55 # 创建敌机精灵 56 enemy = Enemy() 57 # 将敌机精灵添加到敌机精灵组中 58 self.enemy\_group.add(enemy) 59 elif event.type == HERO\_FIRE\_EVENT: 60 self.hero.fire() 61 62 # elif event.type == pygame.KEYDOWN and event.key == pygame. K\_RIGHT: 63 # print("向右移动") 64 65 # 使用键盘提供的方法获得按键元组 66 keys\_pressed = pygame.key.get\_pressed() 67 #判断元组中对应的按键索引值 68 if keys\_pressed\[pygame.K\_RIGHT\]: 69 self.hero.speed = 2 70 elif keys\_pressed\[pygame.K\_LEFT\]: 71 self.hero.speed = -2 72 elif keys\_pressed\[pygame.K\_DOWN\]: 73 self.hero.speed1 = 2 74 elif keys\_pressed\[pygame.K\_UP\]: 75 self.hero.speed1 = -2 76 else: 77 self.hero.speed = 0 78 self.hero.speed1 = 0 79 80 81 def \_\_check\_collide(self): 82 # 1.子弹摧毁敌机 83 pygame.sprite.groupcollide(self.hero.bullets, self.enemy\_group, True, True) 84 # 2.敌机撞毁英雄 85 enenmy = pygame.sprite.spritecollide(self.hero, self.enemy\_group, True) 86 if len(enenmy) > 0: 87 self.hero.kill() 88 print("飞机被撞毁,任务失败!") 89 PlaneGame.\_\_game\_over() 90 91 def \_\_update\_sprites(self): 92 # 更新显示背景 93 self.back\_group.update() 94 self.back\_group.draw(self.screen) 95 # 更新显示敌机 96 self.enemy\_group.update() 97 self.enemy\_group.draw(self.screen) 98 # 更新显示英雄 99 self.hero\_group.update()100 self.hero\_group.draw(self.screen)101 # 更新显示子弹102 self.hero.bullets.update()103 self.hero.bullets.draw(self.screen)104 105 @staticmethod106 def \_\_game\_over():107 print("游戏结束")108 109 pygame.quit()110 exit()111 112 if \_\_name\_\_ == '\_\_main\_\_':113 #创建游戏对象114 game = PlaneGame()115 #启动游戏116 game.start\_game()
View Code
最终呈现结果:
1、准备工作
1.1 图像素材
为了实现这个游戏,我们需要一些图片(png格式)。其中包括:玩家飞机、敌机、背景图等等。
1.2 打开pycharm,导入pygame包
pygame是python中一个第三方库,具有良好的游戏开发性能,功能强大且内容十分丰富,具体请百度或者参考该博客: https://blog.csdn.net/qq_38526635/article/details/82688786
1.3 pygame绘制游戏窗口
1) pygame中的坐标系以左上角为原点,提供了一个类pygame.Rect用于描述矩形区域.
Rect对象的常见属性:x, y, left, top, bottom, right, center, centerx, centery, size, width, height.
1 Rect(x, y, width, height) →Rect
2)pygame.display用于创建与管理窗口
1 # 创建游戏主窗口2 screen = pygame.display.set\_mode((480, 700))
3)图像绘制
1 import pygame 2 3 游戏初始化标准句,Rect对象可以不用 4 pygame.init() 5 6 # 创建游戏的窗口 480 \* 700 7 screen = pygame.display.set\_mode((480, 700)) 8 9 # 绘制背景图像10 bg = pygame.image.load("./images/background.png")11 screen.blit(bg, (0, 0))12 # pygame.display.update()13 14 # 绘制英雄的飞机15 hero = pygame.image.load("./images/me1.png")16 screen.blit(hero, (150, 300))17 18 # 可以在所有绘制工作完成之后,统一调用update方法19 pygame.display.update()20 21 while True:22 pass23 24 pygame.quit()
View Code
1.4 游戏循环
1)pygame.time.Clock用于刷新帧率
要使用时钟对象需要两步:①在游戏初始化创建一个时钟对象;②在游戏循环中让时钟对象调用tick(帧率)方法
2)pygame.event.get()可以得到用户当前所做动作的时间列表(代码相对比较固定)
1 #游戏循环 2 while True: 3 #设置帧率 4 clock.tick(60) 5 #事件监听 6 for event in pygame.event.get(): 7 #判断用户是否点击了关闭按钮 8 if event.type == pygame.QUIT: 9 print("退出游戏。。。")10 pygame.quit()11 #直接退出系统12 exit()
View Code
2、游戏初始化
该游戏的大体框架是两部分内容:一部分是基于pygame.sprite.Sprite这个父类,创建各种各样的派生类,比如子弹类,敌机类。第二部分是创建主程序类PlaneGame,使用前面各种类来实现具体的游戏功能。
首先先来看类PlaneGame的创建过程:
2.1 创建类PlaneGame的构造函数
1 class PlaneGame(object):2 3 def \_\_init\_\_(self):4 print("游戏初始化")
2.2 创建游戏的窗口
1 # 屏幕大小的常量2 SCREEN\_RECT = pygame.Rect(0, 0, 480, 700)3 ...4 self.screen = pygame.display.set\_mode(SCREEN\_RECT.size)
2.3创建游戏时钟
1 self.clock = pygame.time.Clock()
2.4调用私有方法,精灵和精灵组的创建
1 self.\_\_create\_sprites()
2.5设置定时器事件
1 # 创建敌机的定时器常量 2 CREATE\_ENEMY\_EVENT = pygame.USEREVENT 3 # 英雄发射子弹事件 4 HERO\_FIRE\_EVENT = pygame.USEREVENT+1 5 6 class PlaneGame(object): 7 def \_\_init\_\_(self): 8 ... 9 pygame.time.set\_timer(CREATE\_ENEMY\_EVENT,1000)10 pygame.time.set\_timer(HERO\_FIRE\_EVENT, 300)
View Code
3、创建精灵组
3.1创建精灵父类GameSprite
继承自pygame.sprite.Sprite类,包含image、rect、spped=1等属性和update()方法。
1 class GameSprite(pygame.sprite.Sprite): 2 3 def \_\_init\_\_(self, image\_name, speed = 1): 4 # 调用父亲的初始化方法 5 super().\_\_init\_\_() 6 # 定义对象的属性 7 self.image = pygame.image.load(image\_name) 8 self.rect = self.image.get\_rect() 9 self.speed = speed10 11 def update(self):12 #在屏幕的垂直方向上移动13 self.rect.y += self.speed
View Code
3.2 创建游戏背景精灵类
采用一张图循环拼接构成游戏背景,故需要在主程序中生成两个背景精灵对象。
1 class Background(GameSprite): 2 3 def \_\_init\_\_(self, is\_alt = False): 4 # 1.调用父类构造方法 5 super().\_\_init\_\_("./images/background.png") 6 # 2.判断是否与前图像循环重合,若否,则需重新设置初始位置 7 if is\_alt: 8 self.rect.y = -self.rect.height 9 10 11 def update(self):12 # 1.调用父类的方法,,,注意super后面要加括号!!!13 super().update()14 # 2.判断是否移出屏幕15 if self.rect.y >= SCREEN\_RECT.height:16 self.rect.y = -self.rect.height
View Code
3.3 创建敌机精灵类
其实质是一秒产生一架敌机并将其随机从上方某处以1,2或者3的速度落下。当飞出屏幕外注意使用self.kill()自我销毁。
1 class Enemy(GameSprite): 2 3 def \_\_init\_\_(self): 4 # 1.调用父类方法,创建敌机精灵 5 super().\_\_init\_\_("./images/enemy1.png") 6 # 2. 指定敌机的初始随机速度 1-2-3 7 self.speed = random.randint(1,3) 8 # 3.指定敌机的初始随机位置 9 self.rect.bottom = 010 11 max\_x = SCREEN\_RECT.width - self.rect.width12 self.rect.x = random.randint(0, max\_x)13 14 15 def update(self):16 17 # 1.调用父类方法,保持垂直方向的飞行18 super().update()19 # 2.判断是否非出屏幕,如果是,需要从精灵组删除敌机20 if self.rect.y >= SCREEN\_RECT.height:21 #print("飞出屏幕,需要从精灵组删除...")22 # kill方法可以将精灵从精灵组中移除23 self.kill()24 25 def \_\_del\_\_(self):26 #print("敌机挂了%s" %self.rect)27 pass
View Code
3.4 创建子弹类
子弹类飞出屏幕外需要自我销毁
1 class Bullet(GameSprite): 2 3 def \_\_init\_\_(self): 4 # 调用父类方法 5 super().\_\_init\_\_("./images/bullet1.png", BULLET\_SPEED) 6 7 def update(self): 8 super().update() 9 if self.rect.bottom < 0:10 self.kill()11 12 def \_\_del\_\_(self):13 #print("子弹被销毁")14 pass
View Code
3.5 创建英雄类
英雄类多了一个fire()方法,并且内部包含子弹类
1 class Hero(GameSprite): 2 3 def \_\_init\_\_(self): 4 # 1.调用父类方法,设置image和speed 5 super().\_\_init\_\_("./images/me1.png", speed = 0) 6 self.speed1 = 0 7 # 2.设置英雄的初始位置 8 self.rect.centerx = SCREEN\_RECT.centerx 9 self.rect.bottom = SCREEN\_RECT.bottom - 10010 # 3.创建子弹精灵组11 self.bullets = pygame.sprite.Group()12 13 def update(self):14 #(错误的判断句,会导致一旦出界就很难再恢复回来)if 0 <= self.rect.x <= SCREEN\_RECT.width - self.rect.width:15 self.rect.x += self.speed16 if self.rect.x < 0:17 self.rect.x = 018 elif self.rect.right > SCREEN\_RECT.width:19 self.rect.right = SCREEN\_RECT.width20 21 self.rect.y += self.speed122 if self.rect.y < 0:23 self.rect.y = 024 elif self.rect.bottom > SCREEN\_RECT.height:25 self.rect.bottom = SCREEN\_RECT.height26 27 28 def fire(self):29 #print("发射子弹")30 # 1.创建子弹精灵31 bullet = Bullet()32 # 2.设置精灵位置33 bullet.rect.bottom = self.rect.y34 bullet.rect.centerx = self.rect.centerx35 # 3.将精灵添加到精灵组36 self.bullets.add(bullet)
View Code
3.6 在主程序中创建精灵(组)
1 class PlaneGame(object): 2 3 def \_\_init\_\_(self): 4 ... 5 6 def \_\_create\_sprites(self): 7 # 创建背景精灵和精灵组 8 bg1 = Background() 9 bg2 = Background(True)10 self.back\_group = pygame.sprite.Group(bg1, bg2)11 # 创建敌机精灵12 self.enemy\_group = pygame.sprite.Group()13 # 创建英雄精灵14 self.hero = Hero()15 self.hero\_group = pygame.sprite.Group(self.hero)
View Code
4、开始游戏
首先令FRAME_PER_SEC = 60,调用self.clock.tick(FRAME_PER_SER)设置帧率为60
1 class PlaneGame(object): 2 def \_\_init\_\_(self): 3 ... 4 5 def \_\_create\_sprites(self): 6 ... 7 8 def start\_game(self): 9 while True:10 # 1.设置刷新帧率11 self.clock.tick(FRAME\_PER\_SEC)12 # 2.事件监听13 self.\_\_event\_handler()14 # 3.碰撞检测15 self.\_\_check\_collide()16 # 4.更新/绘制精灵组17 self.\_\_update\_sprites()18 # 5.更新显示19 pygame.display.update()
View Code
4.1 事件监听
1 def \_\_event\_handler(self): 2 for event in pygame.event.get(): 3 #判断是否退出游戏 4 if event.type == pygame.QUIT: 5 PlaneGame.\_\_game\_over() 6 elif event.type == CREATE\_ENEMY\_EVENT: 7 #print("敌机出现。。。") 8 # 创建敌机精灵 9 enemy = Enemy()10 # 将敌机精灵添加到敌机精灵组中11 self.enemy\_group.add(enemy)12 elif event.type == HERO\_FIRE\_EVENT:13 self.hero.fire()14 15 # 使用键盘提供的方法获得按键元组16 keys\_pressed = pygame.key.get\_pressed()17 #判断元组中对应的按键索引值18 if keys\_pressed\[pygame.K\_RIGHT\]:19 self.hero.speed = 220 elif keys\_pressed\[pygame.K\_LEFT\]:21 self.hero.speed = -222 elif keys\_pressed\[pygame.K\_DOWN\]:23 self.hero.speed1 = 224 elif keys\_pressed\[pygame.K\_UP\]:25 self.hero.speed1 = -226 else:27 self.hero.speed = 028 self.hero.speed1 = 0
View Code
具体参考pygame.event.get()方法使用
4.2 碰撞检测
pygame.sprite.groupcollide()用于两个精灵群的碰撞
pygame.sprite.spritecollide()用于精灵和精灵群的碰撞
1 def \_\_check\_collide(self): 2 3 # 1.子弹摧毁敌机 4 pygame.sprite.groupcollide(self.hero.bullets, self.enemy\_group, True, True) 5 6 # 2.敌机撞毁英雄 7 enenmy = pygame.sprite.spritecollide(self.hero, self.enemy\_group, True) 8 if len(enenmy) > 0: 9 self.hero.kill()10 print("飞机被撞毁,任务失败!")11 PlaneGame.\_\_game\_over()
View Code
4.3 更新/绘制精灵组
1 def \_\_update\_sprites(self): 2 # 更新显示背景 3 self.back\_group.update() 4 self.back\_group.draw(self.screen) 5 # 更新显示敌机 6 self.enemy\_group.update() 7 self.enemy\_group.draw(self.screen) 8 # 更新显示英雄 9 self.hero\_group.update()10 self.hero\_group.draw(self.screen)11 # 更新显示子弹12 self.hero.bullets.update()13 self.hero.bullets.draw(self.screen)
View Code
4.4 显示
1 pygame.display.update()
5、启动与结束游戏
1 class PlaneGame(object): 2 ... 3 @staticmethod 4 def \_\_game\_over(): 5 print("游戏结束") 6 7 pygame.quit() 8 exit() 9 10 if \_\_name\_\_ == '\_\_main\_\_':11 #创建游戏对象12 game = PlaneGame()13 #启动游戏14 game.start\_game()
View Code
6、游戏优化
本程序所实现的游戏还较为粗糙,可以继续优化。其方向包括但不限于:增加音效,增加飞机爆炸画面,击杀敌机增加积分模式等等。
本文转自 https://www.cnblogs.com/chenmenghu/p/12266046.html,如有侵权,请联系删除。