您现在的位置是:首页 > 新游发布
Python 游戏编程之实现飞机大战(含源代码)
星际游娱坊
2025-06-01【新游发布】211人已围观
简介不知道大家有没有打过飞机,喜不喜欢打飞机。当我第一次接触这个东西的时候,我的内心是被震撼到的。第一次接触打飞机的时候作者本人是身心愉悦的,因为周边的朋友都在打飞机,每次都会下意识彼此较量一下,看谁打得更好。打飞机也是需要有一定的技巧的,熟练的朋友一把能打上半个小时,生疏的则三五分钟就败下阵来。那么怎...
不知道大家有没有打过飞机,喜不喜欢打飞机。当我第一次接触这个东西的时候,我的内心是被震撼到的。第一次接触打飞机的时候作者本人是身心愉悦的,因为周边的朋友都在打飞机,每次都会下意识彼此较量一下,看谁打得更好。打飞机也是需要有一定的技巧的,熟练的朋友一把能打上半个小时,生疏的则三五分钟就败下阵来。
那么怎么实现自己的打飞机游戏?下面就跟大家一起来动手实现打飞机游戏。全部源代码见文末链接。
一.游戏设定游戏界面如下图所示:
游戏的基本设定:
敌方共有大中小3款飞机,分为高中低三种速度;
子弹的射程并非全屏,而大概是屏幕长度的80%;
消灭小飞机需要1发子弹,中飞机需要8发,大飞机需要20发子弹;
每消灭一架小飞机得1000分,中飞机6000分,大飞机10000分;
每隔30秒有一个随机的道具补给,分为两种道具,全屏炸弹和双倍子弹;
全屏炸弹最多只能存放3枚,双倍子弹可以维持18秒钟的效果;
游戏将根据分数来逐步提高难度,难度的提高表现为飞机数量的增多以及速度的加快。
另外还对游戏做了一些改进,比如为中飞机和大飞机增加了血槽的显示,这样玩家可以直观地知道敌机快被消灭了没有;我方有三次机会,每次被敌人消灭,新诞生的飞机会有3秒钟的安全期;游戏结束后会显示历史最高分数。
这个游戏加上基本的注释代码量在800行左右,代码看上去比较多,多打代码少动脑。所以大家不要怕,越是多的代码,逻辑就越容易看得清楚,就越好学习。好,那让我们从无到有,从简单到复杂来一起打造这个游戏吧!
二.我方飞机首先创建一个模块来定义我方飞机:
importpygame
classMyPlane():def__init__(self,bg_size):__init__(self)
=("images/").convert_alpha=("images/").convert_alpha_images=_([\("images/me_destroy_1.png").convert_alpha(),\("images/me_destroy_2.png").convert_alpha(),\("images/me_destroy_3.png").convert_alpha(),\("images/me_destroy_4.png").convert_alpha()\])=_rect,=bg_size[0],bg_size[1],=\()//2,\=10=True=False=_surface()
importpygameimportsysimporttracebackimportmyplaneimportenemyimportbulletimportsupply
*fromrandomimport*
bg_size=width,height=480,700screen=_mode(bg_size)_caption("飞机大战--FishCDemo")
background=("images/").convert
BLACK=(0,0,0)WHITE=(255,255,255)GREEN=(0,255,0)RED=(255,0,0)
生成我方飞机me=(bg_size)
enemies=
生成敌方中型飞机mid_enemies=add_mid_enemies(mid_enemies,enemies,4)
生成普通子弹bullet1=bullet1_index=0BULLET1_NUM=4foriinrange(BULLET1_NUM):(())
中弹图片索引e1_destroy_index=0e2_destroy_index=0e3_destroy_index=0me_destroy_index=0
标志是否暂停游戏paused=Falsepause_nor_image=("images/pause_").convert_alphapause_pressed_image=("images/pause_").convert_alpharesume_nor_image=("images/resume_").convert_alpharesume_pressed_image=("images/resume_").convert_alphapaused_rect=pause_nor__rectpaused_,paused_=width-paused_,10paused_image=pause_nor_image
全屏炸弹bomb_image=("images/").convert_alphabomb_rect=bomb__rectbomb_font=("font/",48)bomb_num=3
超级子弹定时器DOUBLE_BULLET_TIME=USEREVENT+1
解除我方无敌状态定时器INVINCIBLE_TIME=USEREVENT+2
用于阻止重复打开记录文件recorded=False
用于切换图片switch_image=True
根据用户的得分增加难度iflevel==1andscore50000:level=2upgrade_提升小型敌机的速度inc_speed(small_enemies,1)eliflevel==2andscore300000:level=3upgrade_提升小型敌机的速度inc_speed(small_enemies,1)inc_speed(mid_enemies,1)eliflevel==3andscore600000:level=4upgrade_提升小型敌机的速度inc_speed(small_enemies,1)inc_speed(mid_enemies,1)eliflevel==4andscore1000000:level=5upgrade_提升小型敌机的速度inc_speed(small_enemies,1)inc_speed(mid_enemies,1)
(background,(0,0))
iflife_numandnotpaused:绘制全屏炸弹补给并检测是否获得ifbomb_:bomb_(bomb_,bomb_)_mask(bomb_supply,me):get_bomb_ifbomb_num3:bomb_num+=1bomb_=False
发射子弹ifnot(delay%10):bullet_ifis_double_bullet:bullets=bullet2bullets[bullet2_index].reset((,))bullets[bullet2_index+1].reset((+30,))bullet2_index=(bullet2_index+2)%BULLET2_NUMelse:bullets=bullet1bullets[bullet1_index].reset()bullet1_index=(bullet1_index+1)%BULLET1_NUM
绘制大型敌机foreachinbig_enemies:::(_hit,)=Falseelse:ifswitch_image:(,)else:(,)
当生命大于20%显示绿色,否则显示红色energy_remain=/ifenergy_:energy_color=GREENelse:energy_color=RED(screen,energy_color,\(,),\(+*energy_remain,\),2)
毁灭ifnot(delay%3):ife3_destroy_index==0:enemy3_down_(_images[e3_destroy_index],)e3_destroy_index=(e3_destroy_index+1)%6ife3_destroy_index==0:enemy3_fly_score+=10000
绘制血槽(screen,BLACK,\(,),\(,),\2)毁灭ifnot(delay%3):ife2_destroy_index==0:enemy2_down_(_images[e2_destroy_index],)e2_destroy_index=(e2_destroy_index+1)%4ife2_destroy_index==0:score+=6000
毁灭ifnot(delay%3):ife1_destroy_index==0:enemy1_down_(_images[e1_destroy_index],)e1_destroy_index=(e1_destroy_index+1)%4ife1_destroy_index==0:score+=1000
绘制我方飞机:ifswitch_image:(,)else:(,)else:绘制全屏炸弹数量bomb_text=bomb_("×%d"%bomb_num,True,WHITE)text_rect=bomb__rect(bomb_image,(10,height-10-bomb_))(bomb_text,(20+bomb_,height-5-text_))
绘制得分score_text=score_("Score:%s"%str(score),True,WHITE)(score_text,(10,5))
背景音乐停止
停止发放补给_timer(SUPPLY_TIME,0)
ifnotrecorded:recorded=True如果玩家得分高于历史最高得分,则存档ifscorerecord_score:withopen("","w")asf:(str(score))
检测用户的鼠标操作获取鼠标坐标pos=_pos调用main函数,重新开始游戏main退出游戏
切换图片ifnot(delay%5):switch_image=notswitch_image
delay-=1ifnotdelay:delay=100
(60)
if__name__=="__main__":try:mainexceptSystemExit:passexcept:_excinput
切记:所有的模块应该放在同一个文件夹下
最后运行我们的主模块就大功告成了!
下面是运行结果:
飞机大战源代码以及素材资料github项目地址链接:
福利
入门Python的最强三件套《ThinkPython》、《简明Python教程》、《Python进阶》的PDF电子版已打包提供给大家,「P3」即可获取。
很赞哦!(120)