效果展示: 实现功能: 1:飞机的移动,发射子弹,手雷,生命值,生命条 2:敌飞机有3种形态(小,中,大)不同的飞机大小不一样,生命值不一样,爆炸动画也不一样 3:背景音乐,子弹击中敌机会发生碰撞的爆炸动画和音效 4:随机产生补给(双射子弹和全屏炸弹) 5:难度逐渐增加(同一屏幕出现的飞机更多) 代码如下:(一个类文件(800行代码)) importpygame importsys importtraceback frompygame。localsimport fromrandomimport pygame。init() pygame。mixer。init() bgsizewidth,height480,700 screenpygame。display。setmode(bgsize) pygame。display。setcaption(飞机大战) backgroundpygame。image。load(imagesbackground。png)。convert() 定义颜色 BLACK(0,0,0) GREEN(0,255,0) RED(255,0,0) WHITE(255,255,255) 载入音乐 pygame。mixer。music。load(soundbjmusic。wav) pygame。mixer。music。setvolume(0。1) bulletsoundpygame。mixer。Sound(soundbullet。wav) bulletsound。setvolume(0。2) bombsoundpygame。mixer。Sound(soundusebomb。wav) bombsound。setvolume(0。2) supplysoundpygame。mixer。Sound(soundsupply。wav) supplysound。setvolume(0。2) getbombsoundpygame。mixer。Sound(soundgetbomb。wav) getbombsound。setvolume(0。2) getbulletsoundpygame。mixer。Sound(soundgetbullet。wav) getbulletsound。setvolume(0。2) upgradesoundpygame。mixer。Sound(soundupgrade。wav) upgradesound。setvolume(0。2) enemy3flysoundpygame。mixer。Sound(soundenemy3flying。wav) enemy3flysound。setvolume(0。6) enemy1downsoundpygame。mixer。Sound(soundenemy1down。wav) enemy1downsound。setvolume(0。2) enemy2downsoundpygame。mixer。Sound(soundenemy2down。wav) enemy2downsound。setvolume(0。2) enemy3downsoundpygame。mixer。Sound(soundenemy3down。wav) enemy3downsound。setvolume(0。2) medownsoundpygame。mixer。Sound(soundmedown。wav) medownsound。setvolume(0。2) 设置我的飞机类:设置我的飞机类:设置我的飞机类:设置我的飞机类:设置我的飞机类 classMyPlane(pygame。sprite。Sprite): definit(self,bgsize): super(MyPlane,self)。init() self。image1pygame。image。load(imagesme1。png)。convertalpha() self。image2pygame。image。load(imagesme2。png)。convertalpha() self。destroyimages〔〕 self。destroyimages。extend(〔 pygame。image。load(imagesmedestroy1。png)。convertalpha(), pygame。image。load(imagesmedestroy2。png)。convertalpha(), pygame。image。load(imagesmedestroy3。png)。convertalpha(), pygame。image。load(imagesmedestroy4。png)。convertalpha() 〕) self。rectself。image1。getrect() self。width,self。heightbgsize〔0〕,bgsize〔1〕 self。activeTrue self。invincibleFalse self。maskpygame。mask。fromsurface(self。image2) self。rect。left,self。rect。top(self。widthself。rect。width)2,self。heightself。rect。height60 self。speed10 defmoveUp(self): ifself。rect。top0: self。rect。topself。speed else: self。rect。top0 defmoveDown(self): ifself。rect。bottomself。height60: self。rect。bottomself。speed else: self。rect。bottomself。height60 defmoveLeft(self): ifself。rect。left0: self。rect。leftself。speed else: self。rect。left0 defmoveRight(self): ifself。rect。rightself。width: self。rect。rightself。speed else: self。rect。rightself。width defreset(self): self。rect。left,self。rect。top(self。widthself。rect。width)2,self。heightself。rect。height60 self。activeTrue self。invincibleTrue 设置敌人的飞机:设置敌人的飞机:设置敌人的飞机:设置敌人的飞机:设置敌人的飞机 classSmallEnemy(pygame。sprite。Sprite): energy1 definit(self,bgsize): super(SmallEnemy,self)。init() self。imagepygame。image。load(imagesenemy1。png)。convertalpha() self。destroyimages〔〕 self。destroyimages。extend(〔 pygame。image。load(imagesenemy1down1。png)。convertalpha(), pygame。image。load(imagesenemy1down2。png)。convertalpha(), pygame。image。load(imagesenemy1down3。png)。convertalpha(), pygame。image。load(imagesenemy1down4。png)。convertalpha() 〕) self。rectself。image。getrect() self。width,self。heightbgsize〔0〕,bgsize〔1〕 self。activeTrue self。maskpygame。mask。fromsurface(self。image) self。speed2 self。reset() self。energySmallEnemy。energy self。hitFalse defmove(self): ifself。rect。topself。height: self。rect。topself。speed else: self。reset() defreset(self): self。rect。left,self。rect。toprandint(0,self。widthself。rect。width),randint(5self。height,0) self。activeTrue self。energySmallEnemy。energy classMidEnemy(pygame。sprite。Sprite): energy8 definit(self,bgsize): super(MidEnemy,self)。init() self。imagepygame。image。load(imagesenemy2。png)。convertalpha() self。destroyimages〔〕 self。destroyimages。extend(〔 pygame。image。load(imagesenemy2down1。png)。convertalpha(), pygame。image。load(imagesenemy2down2。png)。convertalpha(), pygame。image。load(imagesenemy2down3。png)。convertalpha(), pygame。image。load(imagesenemy2down4。png)。convertalpha() 〕) self。imagehitpygame。image。load(imagesenemy2hit。png)。convertalpha() self。rectself。image。getrect() self。width,self。heightbgsize〔0〕,bgsize〔1〕 self。activeTrue self。speed1 self。maskpygame。mask。fromsurface(self。image) self。reset() self。energyMidEnemy。energy self。hitFalse defmove(self): ifself。rect。topself。height: self。rect。topself。speed else: self。reset() defreset(self): self。rect。left,self。rect。toprandint(0,self。widthself。rect。width),randint(10self。height,self。height) self。activeTrue self。energyMidEnemy。energy classBigEnemy(pygame。sprite。Sprite): energy20 definit(self,bgsize): super(BigEnemy,self)。init() self。image1pygame。image。load(imagesenemy3n1。png)。convertalpha() self。image2pygame。image。load(imagesenemy3n2。png)。convertalpha() self。destroyimages〔〕 self。destroyimages。extend(〔 pygame。image。load(imagesenemy3down1。png)。convertalpha(), pygame。image。load(imagesenemy3down2。png)。convertalpha(), pygame。image。load(imagesenemy3down3。png)。convertalpha(), pygame。image。load(imagesenemy3down4。png)。convertalpha(), pygame。image。load(imagesenemy3down5。png)。convertalpha(), pygame。image。load(imagesenemy3down6。png)。convertalpha() 〕) self。imagehitpygame。image。load(imagesenemy3hit。png)。convertalpha() self。rectself。image1。getrect() self。width,self。heightbgsize〔0〕,bgsize〔1〕 self。activeTrue self。speed1 self。maskpygame。mask。fromsurface(self。image1) self。appearFalse self。reset() self。energyBigEnemy。energy self。hitFalse defmove(self): ifself。rect。topself。height: self。rect。topself。speed else: self。reset() defreset(self): self。rect。left,self。rect。toprandint(0,self。widthself。rect。width),randint(20self。height,10self。height) self。activeTrue self。energyBigEnemy。energy 设置补给:设置补给:设置补给:设置补给:设置补给 classBulletSupply(pygame。sprite。Sprite): definit(self,bgsize): super(BulletSupply,self)。init() self。imagepygame。image。load(imagesbulletsupply。png)。convertalpha() self。rectself。image。getrect() self。width,self。heightbgsize〔0〕,bgsize〔1〕 self。rect。left,self。rect。bottomrandint(0,self。widthself。rect。width),100 self。speed5 self。activeFalse self。maskpygame。mask。fromsurface(self。image) defmove(self): ifself。rect。topself。height: self。rect。topself。speed else: self。activeFalse defreset(self): self。activeTrue self。rect。left,self。rect。bottomrandint(0,self。widthself。rect。width),100 classBombSupply(pygame。sprite。Sprite): definit(self,bgsize): super(BombSupply,self)。init() self。imagepygame。image。load(imagesbombsupply。png)。convertalpha() self。rectself。image。getrect() self。width,self。heightbgsize〔0〕,bgsize〔1〕 self。rect。left,self。rect。bottomrandint(0,self。widthself。rect。width),100 self。speed5 self。activeFalse self。maskpygame。mask。fromsurface(self。image) defmove(self): ifself。rect。topself。height: self。rect。topself。speed else: self。activeFalse defreset(self): self。activeTrue self。rect。left,self。rect。bottomrandint(0,self。widthself。rect。width),100 设置我方发射子弹类 classBullet1(pygame。sprite。Sprite): definit(self,position): super(Bullet1,self)。init() self。imagepygame。image。load(imagesbullet1。png)。convertalpha() self。rectself。image。getrect() self。rect。left,self。rect。topposition self。speed12 self。activeTrue self。maskpygame。mask。fromsurface(self。image) defmove(self): self。rect。topself。speed ifself。rect。top0: self。activeFalse defreset(self,position): self。rect。left,self。rect。topposition self。activeTrue classBullet2(pygame。sprite。Sprite): definit(self,position): super(Bullet2,self)。init() self。imagepygame。image。load(imagesbullet2。png)。convertalpha() self。rectself。image。getrect() self。rect。left,self。rect。topposition self。speed14 self。activeFalse self。maskpygame。mask。fromsurface(self。image) defmove(self): self。rect。topself。speed ifself。rect。top0: self。activeFalse defreset(self,position): self。rect。left,self。rect。topposition self。activeTrue 主程序的实现:主程序的实现:主程序的实现:主程序的实现:主程序的实现 defaddsmallenemies(group1,group2,num): foriinrange(num): e1SmallEnemy(bgsize) group1。add(e1) group2。add(e1) defaddmidenemies(group1,group2,num): foriinrange(num): e2MidEnemy(bgsize) group1。add(e2) group2。add(e2) defaddbigenemies(group1,group2,num): foriinrange(num): e3BigEnemy(bgsize) group1。add(e3) group2。add(e3) defincspeed(target,inc): foreachintarget: each。speedinc defmain(): 播放音乐 pygame。mixer。music。play(1) 实例化我方飞机 meMyPlane(bgsizebgsize) 实例化敌方飞机 enemiespygame。sprite。Group() 实例化敌方小型飞机 smallenemiespygame。sprite。Group() addsmallenemies(smallenemies,enemies,15) 实例化敌方中型飞机 midenemiespygame。sprite。Group() addmidenemies(midenemies,enemies,4) 实例化敌方大型飞机 bigenemiespygame。sprite。Group() addbigenemies(bigenemies,enemies,2) 实例化普通子弹 bullet1〔〕 bullet1index0 BULLET1NUM4 foriinrange(BULLET1NUM): bullet1。append(Bullet1((me。rect。centerx10,me。rect。centery))) 实例超级子弹 bullet2〔〕 bullet2index0 BULLET2NUM8 foriinrange(BULLET2NUM2): bullet2。append(Bullet2((me。rect。centerx33,me。rect。centery))) bullet2。append(Bullet2((me。rect。centerx30,me。rect。centery))) 中弹图片索引 e1destroyindex0 e2destroyindex0 e3destroyindex0 medestroyindex0 统计得分 score0 scorefontpygame。font。Font(fontfont1。ttf,36) 标志是否暂停游戏 pausedFalse pausednorimagepygame。image。load(imagespausenor。png)。convertalpha() pausedpressedimagepygame。image。load(imagespausepressed。png)。convertalpha() resumenorimagepygame。image。load(imagesresumenor。png)。convertalpha() resumepressedimagepygame。image。load(imagesresumepressed。png)。convertalpha() pausedrectpausednorimage。getrect() pausedrect。left,pausedrect。topwidthpausedrect。width10,10 pausedimagepausednorimage 设置难度 level1 全屏炸弹 bombimagepygame。image。load(imagesbomb。png)。convertalpha() bombrectbombimage。getrect() bombfontpygame。font。Font(fontfont1。ttf,48) bombnum3 每20秒发放一个补给包 bulletsupplyBulletSupply(bgsize) bombsupplyBombSupply(bgsize) SUPPLYTIMEUSEREVENT pygame。time。settimer(SUPPLYTIME,201000) DOUBLEBULLTETTIMEUSEREVENT1 INVINCIBLETIMEUSEREVENT2 标志是否使用超级子弹 isdoublebulletFalse 生命数量 lifeimagepygame。image。load(imageslife。png)。convertalpha() liferectlifeimage。getrect() lifenum3 用于切换我方飞机图片 switchplaneTrue 游戏结束画面 gameoverfontpygame。font。Font(fontfont1。TTF,48) againimagepygame。image。load(imagesagain。png)。convertalpha() againrectagainimage。getrect() gameoverimagepygame。image。load(imagesgameover。png)。convertalpha() gameoverrectgameoverimage。getrect() 用于延迟切换 delay100 recordedFalse clockpygame。time。Clock() runningTrue whilerunning: foreventinpygame。event。get(): ifevent。typeQUIT: pygame。quit() sys。exit() elifevent。typeMOUSEBUTTONDOWN: ifevent。button1andpausedrect。collidepoint(event。pos): pausednotpaused ifpaused: pygame。time。settimer(SUPPLYTIME,0) pygame。mixer。music。pause() pygame。mixer。pause() else: pygame。time。settimer(SUPPLYTIME,201000) pygame。mixer。music。unpause() pygame。mixer。unpause() elifevent。typeMOUSEMOTION: ifpausedrect。collidepoint(event。pos): ifpaused: pausedimageresumepressedimage else: pausedimagepausedpressedimage else: ifpaused: pausedimageresumenorimage else: pausedimagepausednorimage elifevent。typeKEYDOWN: ifevent。keyKSPACE: ifbombnum: bombnum1 bombsound。play() foreachinenemies: ifeach。rect。bottom0: each。activeFalse elifevent。typeSUPPLYTIME: supplysound。play() ifchoice(〔True,False〕): bombsupply。reset() else: bulletsupply。reset() elifevent。typeDOUBLEBULLTETTIME: isdoublebulletFalse pygame。time。settimer(DOUBLEBULLTETTIME,0) elifevent。typeINVINCIBLETIME: me。invincibleFalse pygame。time。settimer(INVINCIBLETIME,0) 根据用户得分增加难度 iflevel1andscore5000: level2 upgradesound。play() 增加3架小型敌机,2架中型敌机和1架大型敌机 addsmallenemies(smallenemies,enemies,3) addmidenemies(midenemies,enemies,2) addbigenemies(bigenemies,enemies,1) 提升小型敌机的速度 incspeed(targetsmallenemies,inc1) eliflevel2andscore30000: level3 upgradesound。play() 增加5架小型敌机,3架中型敌机和2架大型敌机 addsmallenemies(smallenemies,enemies,5) addmidenemies(midenemies,enemies,3) addbigenemies(bigenemies,enemies,2) 提升小型敌机的速度 incspeed(targetsmallenemies,inc1) incspeed(targetmidenemies,inc1) eliflevel3andscore60000: level4 upgradesound。play() 增加5架小型敌机,3架中型敌机和2架大型敌机 addsmallenemies(smallenemies,enemies,5) addmidenemies(midenemies,enemies,3) addbigenemies(bigenemies,enemies,2) 提升小型敌机的速度 incspeed(targetsmallenemies,inc1) incspeed(targetmidenemies,inc1) eliflevel4andscore100000: level5 upgradesound。play() 增加5架小型敌机,3架中型敌机和2架大型敌机 addsmallenemies(smallenemies,enemies,5) addmidenemies(midenemies,enemies,3) addbigenemies(bigenemies,enemies,2) 提升小型敌机的速度 incspeed(targetsmallenemies,inc1) incspeed(targetmidenemies,inc1) incspeed(targetbigenemies,inc1) screen。blit(background,(0,0)) iflifenumandnotpaused: 检测键盘按键操作 keypressedpygame。key。getpressed() ifkeypressed〔Kw〕orkeypressed〔KUP〕: me。moveUp() ifkeypressed〔Ks〕orkeypressed〔KDOWN〕: me。moveDown() ifkeypressed〔Ka〕orkeypressed〔KLEFT〕: me。moveLeft() ifkeypressed〔Kd〕orkeypressed〔KRIGHT〕: me。moveRight() 绘制全屏炸弹补给 ifbombsupply。active: bombsupply。move() screen。blit(bombsupply。image,bombsupply。rect) ifpygame。sprite。collidemask(me,bombsupply): getbombsound。play() ifbombnum3: bombnum1 bombsupply。activeFalse 绘制超级子弹补给 ifbulletsupply。active: bulletsupply。move() screen。blit(bulletsupply。image,bulletsupply。rect) ifpygame。sprite。collidemask(me,bulletsupply): getbulletsound。play() 发射超级子弹 isdoublebulletTrue pygame。time。settimer(DOUBLEBULLTETTIME,181000) bulletsupply。activeFalse 发射子弹 ifnot(delay10): bulletsound。play() ifisdoublebullet: bulletsbullet2 bullets〔bullet2index〕。reset( (me。rect。centerx40,me。rect。centery)) bullets〔bullet2index 1〕。reset((me。rect。centerx20,me。rect。centery)) bullet2index(bullet2index2)BULLET2NUM else: bulletsbullet1 bullets〔bullet1index〕。reset((me。rect。centerx10,me。rect。centery10)) bullet1index(bullet1index1)BULLET1NUM 碰撞检测检测子弹是否击中敌机 forbinbullets: ifb。active: b。move() screen。blit(b。image,b。rect) enemyhitpygame。sprite。spritecollide( b,enemies,False,pygame。sprite。collidemask) ifenemyhit: b。activeFalse foreachinenemyhit: each。hitTrue each。energy1 ifeach。energy0: each。activeFalse 绘制敌方大型机 foreachinbigenemies: ifeach。active: each。move() ifeach。hit: screen。blit(each。imagehit,each。rect) each。hitFalse else: ifswitchplane: screen。blit(each。image1,each。rect) else: screen。blit(each。image2,each。rect) 绘制血条 pygame。draw。line(screen,BLACK, (each。rect。left,each。rect。top5), (each。rect。right,each。rect。top5), 2) energyremaineach。energyBigEnemy。energy ifenergyremain0。2: energycolorGREEN else: energycolorRED pygame。draw。line(screen,energycolor, (each。rect。left,each。rect。top5), (each。rect。lefteach。rect。widthenergyremain, each。rect。top5), 2) ifeach。rect。bottom10: enemy3flysound。play(1) each。appearTrue 离开画面,关闭音效 iflifenum: foriinrange(lifenum): screen。blit(lifeimage, ((width10(i1)liferect。width), height10liferect。height)) 绘制得分 ifeach。rect。bottom10andeach。appear: enemy3flysound。stop() each。appearFalse else: 毁灭 ife3destroyindex0: enemy3downsound。play() ifnot(delay2): screen。blit(each。destroyimages〔 e3destroyindex〕,each。rect) e3destroyindex(e3destroyindex1)6 ife3destroyindex0: enemy3flysound。stop() score1000 each。reset() 绘制敌方中型机 foreachinmidenemies: ifeach。active: each。move() ifeach。hit: screen。blit(each。imagehit,each。rect) each。hitFalse else: screen。blit(each。image,each。rect) 绘制血槽 pygame。draw。line(screen,BLACK, (each。rect。left,each。rect。top5), (each。rect。right,each。rect。top5), 2) 当生命大于20显示绿色,否则显示红色 energyremaineach。energyMidEnemy。energy ifenergyremain0。2: energycolorGREEN else: energycolorRED pygame。draw。line(screen,energycolor, (each。rect。left,each。rect。top5), (each。rect。lefteach。rect。widthenergyremain, each。rect。top5), 2) else: 毁灭 ife2destroyindex0: enemy2downsound。play() ifnot(delay2): screen。blit(each。destroyimages〔 e2destroyindex〕,each。rect) e2destroyindex(e2destroyindex1)4 ife2destroyindex0: score600 each。reset() 绘制敌方小型机 foreachinsmallenemies: ifeach。active: each。move() screen。blit(each。image,each。rect) else: 毁灭 ife1destroyindex0: enemy1downsound。play() ifnot(delay2): screen。blit(each。destroyimages〔 e1destroyindex〕,each。rect) e1destroyindex(e1destroyindex1)4 ife1destroyindex0: score100 each。reset() 检测我方飞机碰撞 enemiesdownpygame。sprite。spritecollide( me,enemies,False,pygame。sprite。collidemask) ifenemiesdownandnotme。invincible: me。activeFalse foreachinenemiesdown: each。activeFalse 绘制我方飞机 ifme。active: ifswitchplane: screen。blit(me。image1,me。rect) else: screen。blit(me。image2,me。rect) else: 毁灭 ifmedestroyindex0: medownsound。play() ifnot(delay2): screen。blit(me。destroyimages〔medestroyindex〕,me。rect) medestroyindex(medestroyindex1)4 ifmedestroyindex0: lifenum1 me。reset() pygame。time。settimer(INVINCIBLETIME,31000) 绘制全屏炸弹数量 bombtextbombfont。render(dbombnum,True,WHITE) textrectbombtext。getrect() screen。blit(bombimage,(10,height10bombrect。height)) screen。blit(bombtext,(20bombrect。width,height5textrect。height)) 绘制剩余生命数量 scoretextscorefont。render(Score:dscore,True,WHITE) screen。blit(scoretext,(10,5)) 绘制游戏结束画面 eliflifenum0: 背景音乐停止 pygame。mixer。music。stop() pygame。mixer。stop() 停止发放补给 pygame。time。settimer(SUPPLYTIME,0) ifnotrecorded: recordedTrue 读取历史最高分 withopen(record。txt,r)asf: recordscoreint(f。read()) 判断是否高于历史最高分 ifscorerecordscore: withopen(record。txt,w)asf: f。write(str(score)) 绘制结束界面 recordscoretextscorefont。render(Best:drecordscore,True,(255,255,255)) screen。blit(recordscoretext,(10,45)) gameovertext1gameoverfont。render(YourScore,True,(255,255,255)) gameovertext1rectgameovertext1。getrect() gameovertext1rect。left,gameovertext1rect。top(widthgameovertext1rect。width)2,height3 screen。blit(gameovertext1,gameovertext1rect) gameovertext2gameoverfont。render(str(score),True,(255,255,255)) gameovertext2rectgameovertext2。getrect() gameovertext2rect。left,gameovertext2rect。top(widthgameovertext2rect。width)2,gameovertext1rect。bottom10 screen。blit(gameovertext2,gameovertext2rect) againrect。left,againrect。top(widthagainrect。width)2,gameovertext2rect。bottom50 screen。blit(againimage,againrect) gameoverrect。left,gameoverrect。top(widthagainrect。width)2,againrect。bottom10 screen。blit(gameoverimage,gameoverrect) 如果用户按下鼠标左键 ifpygame。mouse。getpressed()〔0〕: 获取鼠标坐标 pospygame。mouse。getpos() ifagainrect。leftpos〔0〕againrect。rightandagainrect。toppos〔1〕againrect。bottom: main() elifgameoverrect。leftpos〔0〕gameoverrect。rightandgameoverrect。toppos〔1〕gameoverrect。bottom: pygame。quit() sys。exit() screen。blit(pausedimage,pausedrect) ifnot(delay11): switchplanenotswitchplane delay1 ifnotdelay: delay100 pygame。display。flip() clock。tick(60) ifnamemain: main()