
【python】使用pygame写的飞机大战游戏
发布日期:2021-05-07 07:01:07
浏览次数:19
分类:技术文章
本文共 9535 字,大约阅读时间需要 31 分钟。
制作原因
做这个小游戏是因为学校的实训内容,老师给的要求是飞机大战,当时我感觉飞机大战这个题材太多了,就做了个飞艇大战,图片也是很久之前学习前端时攒下的素材,自己用ps改了改拿来用效果还不错
因为实训项目不光这一个游戏项目,所有没有很多的事件来做,满打满算从接触pygame这个库开始学习到做完,一共经历了一天半,所以应该会有一些没发现的bug,
效果展示
玩法介绍
-
玩家控制的飞艇只能上下移动,移动按w或s(或↑与↓),按下空格发出子弹
-
敌方飞艇从屏幕右侧向玩家飞来,且会上下移动,无论是水平移动的速度还是上下移动的速度都是随机的,且移动区间也是随机的
-
游戏设计了难度,每出现五个敌方飞艇,就会增加一个难度等级,难度是有上限的,但我估计没人能看得到。。
因为最终难度是地狱模式:
代码
import pygameimport sys#导入所有pygame.locals里的变量(比如下面大写的QUIT变量)from pygame.locals import *import randomclass flyShip(object): """定义一个飞艇类""" def __init__(self): """定义初始化方法""" self.shipStatus = pygame.image.load("飞艇.png")#飞艇图片 self.width = self.shipStatus.get_width() # 飞艇宽度 self.height = self.shipStatus.get_height() # 飞艇高度 self.shipX = 50 # 飞艇所在X轴坐标 self.shipY = 220 # 飞艇所在Y轴坐标,即上下飞行高度 self.Speed = 10 # 单次移动高度 self.dead = False # 默认飞艇生命状态为活着 def isDead(self):# 检测飞艇是否需要死亡 for badship in badShips: #碰撞检测 if(badship.shipX <= self.shipX + self.width and badship.shipX + badship.width >= self.shipX and badship.shipY <= self.shipY + self.height and badship.shipY + badship.height >= self.shipY ): self.dead = True# 飞艇置死 self.shipStatus = pygame.image.load("飞艇dead.png")#更换飞艇图片class BadFlyShip(object): """定义一个敌对飞艇类""" def __init__(self): """定义初始化方法""" self.shipStatus = pygame.image.load("飞艇2.png")#飞艇图片 self.width = self.shipStatus.get_width()#飞艇宽度 self.height = self.shipStatus.get_height()#飞艇高度 self.shipX = 1030 # 飞艇所在X轴坐标,即左右飞行高度 self.shipY = random.randint(0,510-self.height) # 飞艇所在Y轴坐标,即上下飞行高度 self.Speed = random.randint(1,5) # 移动速度 self.SpeedY = random.randint(1,2) # 垂直移动速度 self.range = random.randint(50,100) # 上下移动范围 self.rangeT = self.shipY - self.range if ((self.shipY - self.range) > 0) else 0 # 上范围 self.rangeB = self.shipY + self.range if ((self.shipY + self.range) < size[1]-self.height) else size[1]-self.height # 上范围 self.dead = False # 默认飞艇生命状态为活着 def updateX(self): """水平移动""" self.shipX-=self.Speed if(self.shipX<=-50 or self.shipY>= size[1]): badShips.remove(self) def updateY(self): """垂直移动""" if(self.SpeedY>0):#向下移动 #检测是否触底 if(self.shipY+self.SpeedY>self.rangeB): self.shipY = self.rangeB self.SpeedY=-self.SpeedY else: self.shipY += self.SpeedY elif(self.SpeedY<0):#向上移动 #检测是否触顶 if (self.shipY + self.SpeedY < self.rangeT): self.shipY = self.rangeT self.SpeedY = -self.SpeedY else: self.shipY += self.SpeedY def isDead(self):# 检测飞艇是否需要死亡 for bullet in bullets: #碰撞检测 if(bullet.bulletX <= self.shipX + self.width and bullet.bulletX + bullet.width >= self.shipX and bullet.bulletY <= self.shipY + self.height and bullet.bulletY + bullet.height >= self.shipY ): self.Speed = 0#飞艇坠落 self.rangeB = size[1]#飞艇坠落 self.SpeedY = 2 #飞艇坠落 self.shipStatus = pygame.image.load("飞艇dead2.png")#更换飞艇图片 bullets.remove(bullet) # 子弹使用 if (not self.dead): global point point += 1 self.dead = True #飞艇置死class Bullet: """定义子弹飞艇类""" def __init__(self): self.bulletStatus = pygame.image.load("子弹.png") # 子弹图片 self.width = self.bulletStatus.get_width() # 子弹宽度 self.height = self.bulletStatus.get_height() # 子弹高度 self.bulletX = 50 + ship.width # 子弹所在X轴坐标,即左右飞行高度 self.bulletY = ship.shipY + ship.height / 2 # 子弹所在Y轴坐标,即上下飞行高度 self.Speed = 3 # 移动速度 self.dead = False # 检测子弹是否被激发 def updateX(self): """水平移动""" self.bulletX+=self.Speed if(self.dead or self.bulletX>= size[0]): bullets.remove(self)def createMap(): """定义创建地图的方法""" screen.blit(bg, bgPosition) # 将背景图片画到窗口上 if(not ship.dead):# 我方飞艇存活 # 显示飞艇 screen.blit(ship.shipStatus, (ship.shipX, ship.shipY)) # 显示子弹 for bullet in bullets: screen.blit(bullet.bulletStatus, (bullet.bulletX, bullet.bulletY)) # 子弹水平移动 bullet.updateX() if(Play):#检测是否点击开始游戏 play_text = "PLAY" #play play_font = pygame.font.SysFont("Arial", 70) play_surf = play_font.render(play_text, 1, (255, 255, 255)) screen.blit(play_surf, [screen.get_width() / 2 - play_surf.get_width() / 2, 200]) rule_text = "使用上下或ws键控制飞艇躲避来袭敌人,按下空格发射子弹击落敌方飞艇" # 玩法 rule_font = pygame.font.SysFont("simHei", 20) rule_surf = rule_font.render(rule_text, 1, (255, 255, 255)) screen.blit(rule_surf, [screen.get_width() / 2 - rule_surf.get_width() / 2, 50]) else: # 积分板 showPoint() createBadShip() # 向敌人列表中添加敌人对象 # 遍历敌人列表 for badShip in badShips: # 显示敌人 screen.blit(badShip.shipStatus, (badShip.shipX, badShip.shipY)) # 敌人水平移动 badShip.updateX() # 敌人垂直移动 badShip.updateY() # 检测是否被击中 badShip.isDead() # 检测飞艇是否死亡 ship.isDead() else:#我方飞艇死亡,显示结束信息等待关闭窗口 # 遍历敌人列表 for badShip in badShips: # 显示敌人 screen.blit(badShip.shipStatus, (badShip.shipX, badShip.shipY)) # 显示飞艇 screen.blit(ship.shipStatus, (ship.shipX, ship.shipY)) final_text1 = "Game Over" final_text2 = " GitHub: https://github.com/queuecat/Airship-war" final_text3 = "© QueueCat" ft1_font = pygame.font.SysFont("Arial", 70) # 设置第一行文字字体 ft1_surf = ft1_font.render(final_text1, 1, (255, 255, 255)) # 设置第一行文字颜色 ft2_font = pygame.font.SysFont("Arial", 30) # 设置第二行文字字体 ft2_surf = ft2_font.render(final_text2, 1, (255, 255, 255)) # 设置第二行文字颜色 ft3_font = pygame.font.SysFont("Arial", 30) # 设置第三行文字字体 ft3_surf = ft3_font.render(final_text3, 1, (255, 255, 255)) # 设置第三行文字颜色 screen.blit(ft1_surf, [screen.get_width() / 2 - ft1_surf.get_width() / 2, 100]) # 设置第一行文字显示位置 screen.blit(ft2_surf, [screen.get_width() / 2 - ft2_surf.get_width() / 2, 300]) # 设置第二行文字显示位置 screen.blit(ft3_surf, [screen.get_width() / 2 - ft3_surf.get_width() / 2, 400]) # 设置第三行文字显示位置 # 背景移动 if(-(bgPosition[0]-1)0) else 0 elif (key == 1073741905 or key == 115): # 下键或S键 ship.shipY = ship.shipY + ship.Speed if ((ship.shipY + ship.Speed) < size[1] - ship.shipStatus.get_height()) else size[1] - ship.shipStatus.get_height()def showPoint(): global point point_text1 = "积分:"+str(point) point_font = pygame.font.SysFont("simHei", 20) # 设置第一行文字字体 point_surf = point_font.render(point_text1, 1, (255, 255, 255)) # 设置第一行文字颜色 screen.blit(point_surf, [0, 0]) # 设置第一行文字显示位置if __name__ == '__main__': pygame.init() # 初始化pygame pygame.font.init() # 初始化字体 fpsClock = pygame.time.Clock() # 获得pygame的时钟 size = width, height = 1030, 510 # 设置窗口大小 screen = pygame.display.set_mode(size) # 显示窗口 pygame.display.set_caption('飞艇大战') # 设置标题 pygame.display.set_icon(pygame.image.load('飞艇.png')) # 设置窗口图标 font = pygame.font.SysFont("Arial", 50) # 设置字体和大小 bg = pygame.image.load('bg.jpg') # 加载背景图片 bgsize = bg.get_size() # 存储图片大小 bgPosition = [0,0]# 存储背景图片偏移量 ship = flyShip()# 实例化飞艇 #badShip = BadFlyShip()#实例化敌人 badShips = []#敌人序列 bullets = [] # 子弹序列 count = 5 # 每5个飞船后增加难度 createTime = 6 #创建飞艇间隔 fps = 60 # 更新时间 oldTime = 0 # 互斥锁 createSurface = 1 # 充当计算机时间 Play = True #显示游戏开始界面 pygame.key.set_repeat(250,50) isdowbKey = False # 上下按键检测变量 point = 0 # 积分 while True: # 循环确保窗口一直显示 # 检测上下键是否被按下,按下则调用方法使其继续运动(防止其他事件打断该事件) if(isdowbKey and not ship.dead): downKeys = pygame.key.get_pressed() if (downKeys[K_UP] == 1 or downKeys[K_w] == 1): keydown(K_UP) elif (downKeys[K_DOWN] == 1 or downKeys[K_s] == 1): keydown(K_DOWN) else: isdowbKey = False for event in pygame.event.get(): # 遍历所有事件 if event.type == pygame.QUIT: # 如果单击关闭窗口,则退出 sys.exit() if event.type == pygame.KEYDOWN and not ship.dead:# 键盘按下事件 #获取所有按键元组 keys = pygame.key.get_pressed() if(event.key==1073741906 or event.key==119):#上将或W键 # ship.shipY = ship.shipY - ship.Speed if ((ship.shipY - ship.Speed) > 0) else 0 isdowbKey = True elif(event.key==1073741905 or event.key==115):#下键或S键 # ship.shipY = ship.shipY + ship.Speed if ((ship.shipY + ship.Speed) < size[1] - ship.shipStatus.get_height()) else size[1] - ship.shipStatus.get_height() isdowbKey = True if event.type == KEYUP and not ship.dead: if (event.key == K_SPACE): bullets.append(Bullet()) if event.type == MOUSEBUTTONDOWN: pressed_array = pygame.mouse.get_pressed() for index in range(len(pressed_array)): if pressed_array[index]: if index == 0: Play = False# 鼠标点击后,进入游戏 createMap()# 更新地图 createSurface += 1 fpsClock.tick(60) # 设置时钟间隔 pygame.quit() # 退出pygame
发表评论
最新留言
逛到本站,mark一下
[***.202.152.39]2025年03月19日 05时03分21秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Linux驱动开发之PCIe Host驱动
2021-05-08
Vue.js Element Basic组件使用
2021-05-08
android MVP模式
2021-05-08
基本vi命令使用
2021-05-08
android 头像选择,裁剪全套解决方案,你值得拥有!
2021-05-08
MapReduce
2021-05-08
springboot swagger2
2021-05-08
shell(十)case的几个典型应用
2021-05-08
Linux环境变量配置错误导致命令不能使用(杂谈)
2021-05-08
openstack安装(六)镜像glance服务安装
2021-05-08
openstack安装(九)网络服务的安装--控制节点
2021-05-08
shell编程(六)语言编码规范之(变量)
2021-05-08
linux杂谈之特殊字符的打印和在各种软件如何打出
2021-05-08
vim杂谈(三)之配色方案
2021-05-08
vim杂谈(五)之vim不加载~/.vimrc
2021-05-08
Linux杂谈之终端快捷键
2021-05-08
vimscript学习笔记(二)预备知识
2021-05-08
vimscript学习笔记(三)信息打印
2021-05-08
awk杂谈之数组习题
2021-05-08