Python开发飞机大战小游戏代码开源
效果展示:
实现功能:
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()