如何实现Pygame坦克大战游戏
这篇文章将为大家详细讲解有关如何实现Pygame坦克大战游戏,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
正文1)游戏规则:游戏过程是这样的,玩家操作坦克消灭电脑控制的坦克,并保护自己基地。基地图标是一只傲娇的张着翅膀的老鹰。小时候自
己失手把飞鹰轰成烧鸡的惨案经常发生。
双打的时候,为了看谁刷得分高,都争着打坦克,大本营的老鹰被烤熟了都不管。。
坦克大战中的宝贝有战车、星星、时钟等,小编当时最喜欢的是时钟,敌不能动我能动的感觉妙极了。图中的坦克图标吃了是
可以加一条命的,当时为了抢宝贝都抢先把队友的坦克打晕。。。
2)环境安装Python3、Pycharm、Pygame、以及自带或自定义的模块。
pipinstall+模块名或pipinstall-ihttps://pypi.douban.com/simple/+模块名3)代码演示
(之前不是写过的嘛,今天的话就是修改下的,这种小游戏代码肯定都很多的,所以这里直接贴主程序了。
需要完整的打包好的代码跟素材哪些的话 直接滴滴我即可或者看我主页左侧哪里有源码基地的哈!)
主程序:
importpygamefrompygame.localsimport*importsysimportsceneimportbulletimportfoodimporttanksimporthome#开始界面显示defshow_start_interface(screen,width,height):tfont=pygame.font.Font('./font/simkai.ttf',width//4)cfont=pygame.font.Font('./font/simkai.ttf',width//20)title=tfont.render(u'坦克大战',True,(255,0,0))content1=cfont.render(u'按1键进入单人游戏',True,(0,244,222))content2=cfont.render(u'按2键进入双人人游戏',True,(0,0,255))#显示字体pygame.font.Font.render(text文本,antialias是否抗锯齿,color颜色,background=None)trect=title.get_rect()#默认title左上角的坐标是(0,0)trect.midtop=(width/2,height/5)crect1=content1.get_rect()crect1.midtop=(width/2,height/1.8)crect2=content2.get_rect()crect2.midtop=(width/2,height/1.6)screen.blit(title,trect)screen.blit(content1,crect1)screen.blit(content2,crect2)#在指定位置绘制指定文字对象pygame.display.update()#更新界面whileTrue:foreventinpygame.event.get():ifevent.type==QUIT:sys.exit()elifevent.type==pygame.KEYDOWN:ifevent.key==pygame.K_1:return1ifevent.key==pygame.K_2:return2#结束界面显示defshow_end_interface(screen,width,height,is_win):bg_img=pygame.image.load("./images/others/background.png")screen.blit(bg_img,(0,0))ifis_win:font=pygame.font.Font('./font/simkai.ttf',width//10)content=font.render(u'恭喜通关!',True,(255,0,0))rect=content.get_rect()rect.midtop=(width/2,height/2)screen.blit(content,rect)else:fail_img=pygame.image.load("./images/others/gameover.png")rect=fail_img.get_rect()rect.midtop=(width/2,height/2)screen.blit(fail_img,rect)pygame.display.update()whileTrue:foreventinpygame.event.get():ifevent.type==QUIT:sys.exit()#关卡切换defshow_switch_stage(screen,width,height,stage):bg_img=pygame.image.load("./images/others/background.png")screen.blit(bg_img,(0,0))font=pygame.font.Font('./font/simkai.ttf',width//10)content=font.render(u'第%d关'%stage,True,(0,255,0))rect=content.get_rect()rect.midtop=(width/2,height/2)screen.blit(content,rect)pygame.display.update()delay_event=pygame.constants.USEREVENTpygame.time.set_timer(delay_event,1000)#定时器延时whileTrue:foreventinpygame.event.get():ifevent.type==QUIT:sys.exit()ifevent.type==delay_event:returndefmain():pygame.init()pygame.mixer.init()screen=pygame.display.set_mode((630,630))pygame.display.set_caption('坦克大战')bg_img=pygame.image.load('./images/others/background.png')#加载音效add_sound=pygame.mixer.Sound("./audios/add.wav")add_sound.set_volume(1)bang_sound=pygame.mixer.Sound("./audios/bang.wav")bang_sound.set_volume(1)blast_sound=pygame.mixer.Sound("./audios/blast.wav")blast_sound.set_volume(1)fire_sound=pygame.mixer.Sound("./audios/fire.wav")fire_sound.set_volume(1)Gunfire_sound=pygame.mixer.Sound("./audios/Gunfire.wav")Gunfire_sound.set_volume(1)hit_sound=pygame.mixer.Sound("./audios/hit.wav")hit_sound.set_volume(1)start_sound=pygame.mixer.Sound("./audios/start.wav")start_sound.set_volume(1)#开始界面num_player=show_start_interface(screen,630,630)#播放游戏开始的音乐start_sound.play()#关卡stage=0num_stage=2#游戏是否结束is_gameover=False#时钟clock=pygame.time.Clock()#主循环whilenotis_gameover:#关卡stage+=1ifstage>num_stage:breakshow_switch_stage(screen,630,630,stage)#该关卡坦克总数量enemytanks_total=min(stage*18,80)#场上存在的敌方坦克总数量enemytanks_now=0#场上可以存在的敌方坦克总数量enemytanks_now_max=min(max(stage*2,4),8)#精灵组,独立运行的动画组tanksGroup=pygame.sprite.Group()mytanksGroup=pygame.sprite.Group()enemytanksGroup=pygame.sprite.Group()bulletsGroup=pygame.sprite.Group()mybulletsGroup=pygame.sprite.Group()enemybulletsGroup=pygame.sprite.Group()myfoodsGroup=pygame.sprite.Group()#自定义事件#-生成敌方坦克事件genEnemyEvent=pygame.constants.USEREVENTpygame.time.set_timer(genEnemyEvent,100)#-敌方坦克静止恢复事件recoverEnemyEvent=pygame.constants.USEREVENTpygame.time.set_timer(recoverEnemyEvent,8000)#-我方坦克无敌恢复事件noprotectMytankEvent=pygame.constants.USEREVENTpygame.time.set_timer(noprotectMytankEvent,8000)#关卡地图map_stage=scene.Map(stage)#我方坦克tank_player1=tanks.myTank(1)tanksGroup.add(tank_player1)mytanksGroup.add(tank_player1)ifnum_player>1:tank_player2=tanks.myTank(2)tanksGroup.add(tank_player2)mytanksGroup.add(tank_player2)is_switch_tank=Trueplayer1_moving=Falseplayer2_moving=False#为了轮胎的动画效果time=0#敌方坦克foriinrange(0,3):ifenemytanks_total>0:enemytank=tanks.enemyTank(i)tanksGroup.add(enemytank)enemytanksGroup.add(enemytank)enemytanks_now+=1enemytanks_total-=1#大本营myhome=home.Home()#出场特效appearance_img=pygame.image.load("./images/others/appear.png").convert_alpha()appearances=[]appearances.append(appearance_img.subsurface((0,0),(48,48)))appearances.append(appearance_img.subsurface((48,0),(48,48)))appearances.append(appearance_img.subsurface((96,0),(48,48)))#关卡主循环whileTrue:ifis_gameoverisTrue:breakifenemytanks_total<1andenemytanks_now<1:is_gameover=Falsebreakforeventinpygame.event.get():ifevent.type==pygame.QUIT:pygame.quit()sys.exit()ifevent.type==genEnemyEvent:ifenemytanks_total>0:ifenemytanks_now<enemytanks_now_max:enemytank=tanks.enemyTank()ifnotpygame.sprite.spritecollide(enemytank,tanksGroup,False,None):tanksGroup.add(enemytank)enemytanksGroup.add(enemytank)enemytanks_now+=1enemytanks_total-=1ifevent.type==recoverEnemyEvent:foreachinenemytanksGroup:each.can_move=Trueifevent.type==noprotectMytankEvent:foreachinmytanksGroup:mytanksGroup.protected=False#检查用户键盘操作key_pressed=pygame.key.get_pressed()#玩家一#WSAD->上下左右#空格键射击ifkey_pressed[pygame.K_w]:tanksGroup.remove(tank_player1)tank_player1.move_up(tanksGroup,map_stage.brickGroup,map_stage.ironGroup,myhome)tanksGroup.add(tank_player1)player1_moving=Trueelifkey_pressed[pygame.K_s]:tanksGroup.remove(tank_player1)tank_player1.move_down(tanksGroup,map_stage.brickGroup,map_stage.ironGroup,myhome)tanksGroup.add(tank_player1)player1_moving=Trueelifkey_pressed[pygame.K_a]:tanksGroup.remove(tank_player1)tank_player1.move_left(tanksGroup,map_stage.brickGroup,map_stage.ironGroup,myhome)tanksGroup.add(tank_player1)player1_moving=Trueelifkey_pressed[pygame.K_d]:tanksGroup.remove(tank_player1)tank_player1.move_right(tanksGroup,map_stage.brickGroup,map_stage.ironGroup,myhome)tanksGroup.add(tank_player1)player1_moving=Trueelifkey_pressed[pygame.K_SPACE]:ifnottank_player1.bullet.being:fire_sound.play()tank_player1.shoot()#玩家二#↑↓←→->上下左右#小键盘0键射击ifnum_player>1:ifkey_pressed[pygame.K_UP]:tanksGroup.remove(tank_player2)tank_player2.move_up(tanksGroup,map_stage.brickGroup,map_stage.ironGroup,myhome)tanksGroup.add(tank_player2)player2_moving=Trueelifkey_pressed[pygame.K_DOWN]:tanksGroup.remove(tank_player2)tank_player2.move_down(tanksGroup,map_stage.brickGroup,map_stage.ironGroup,myhome)tanksGroup.add(tank_player2)player2_moving=Trueelifkey_pressed[pygame.K_LEFT]:tanksGroup.remove(tank_player2)tank_player2.move_left(tanksGroup,map_stage.brickGroup,map_stage.ironGroup,myhome)tanksGroup.add(tank_player2)player2_moving=Trueelifkey_pressed[pygame.K_RIGHT]:tanksGroup.remove(tank_player2)tank_player2.move_right(tanksGroup,map_stage.brickGroup,map_stage.ironGroup,myhome)tanksGroup.add(tank_player2)player2_moving=Trueelifkey_pressed[pygame.K_KP0]:ifnottank_player2.bullet.being:fire_sound.play()tank_player2.shoot()#背景screen.blit(bg_img,(0,0))#石头墙foreachinmap_stage.brickGroup:screen.blit(each.brick,each.rect)#钢墙foreachinmap_stage.ironGroup:screen.blit(each.iron,each.rect)#冰foreachinmap_stage.iceGroup:screen.blit(each.ice,each.rect)#河流foreachinmap_stage.riverGroup:screen.blit(each.river,each.rect)#树foreachinmap_stage.treeGroup:screen.blit(each.tree,each.rect)time+=1iftime==5:time=0is_switch_tank=notis_switch_tank#我方坦克iftank_player1inmytanksGroup:ifis_switch_tankandplayer1_moving:screen.blit(tank_player1.tank_0,(tank_player1.rect.left,tank_player1.rect.top))player1_moving=Falseelse:screen.blit(tank_player1.tank_1,(tank_player1.rect.left,tank_player1.rect.top))iftank_player1.protected:screen.blit(tank_player1.protected_mask1,(tank_player1.rect.left,tank_player1.rect.top))ifnum_player>1:iftank_player2inmytanksGroup:ifis_switch_tankandplayer2_moving:screen.blit(tank_player2.tank_0,(tank_player2.rect.left,tank_player2.rect.top))player1_moving=Falseelse:screen.blit(tank_player2.tank_1,(tank_player2.rect.left,tank_player2.rect.top))iftank_player2.protected:screen.blit(tank_player1.protected_mask1,(tank_player2.rect.left,tank_player2.rect.top))#敌方坦克foreachinenemytanksGroup:#出生特效ifeach.born:ifeach.times>0:each.times-=1ifeach.times<=10:screen.blit(appearances[2],(3+each.x*12*24,3))elifeach.times<=20:screen.blit(appearances[1],(3+each.x*12*24,3))elifeach.times<=30:screen.blit(appearances[0],(3+each.x*12*24,3))elifeach.times<=40:screen.blit(appearances[2],(3+each.x*12*24,3))elifeach.times<=50:screen.blit(appearances[1],(3+each.x*12*24,3))elifeach.times<=60:screen.blit(appearances[0],(3+each.x*12*24,3))elifeach.times<=70:screen.blit(appearances[2],(3+each.x*12*24,3))elifeach.times<=80:screen.blit(appearances[1],(3+each.x*12*24,3))elifeach.times<=90:screen.blit(appearances[0],(3+each.x*12*24,3))else:each.born=Falseelse:ifis_switch_tank:screen.blit(each.tank_0,(each.rect.left,each.rect.top))else:screen.blit(each.tank_1,(each.rect.left,each.rect.top))ifeach.can_move:tanksGroup.remove(each)each.move(tanksGroup,map_stage.brickGroup,map_stage.ironGroup,myhome)tanksGroup.add(each)#我方子弹fortank_playerinmytanksGroup:iftank_player.bullet.being:tank_player.bullet.move()screen.blit(tank_player.bullet.bullet,tank_player.bullet.rect)#子弹碰撞敌方子弹foreachinenemybulletsGroup:ifeach.being:ifpygame.sprite.collide_rect(tank_player.bullet,each):tank_player.bullet.being=Falseeach.being=FalseenemybulletsGroup.remove(each)breakelse:enemybulletsGroup.remove(each)#子弹碰撞敌方坦克foreachinenemytanksGroup:ifeach.being:ifpygame.sprite.collide_rect(tank_player.bullet,each):ifeach.is_red==True:myfood=food.Food()myfood.generate()myfoodsGroup.add(myfood)each.is_red=Falseeach.blood-=1each.color-=1ifeach.blood<0:bang_sound.play()each.being=FalseenemytanksGroup.remove(each)enemytanks_now-=1tanksGroup.remove(each)else:each.reload()tank_player.bullet.being=Falsebreakelse:enemytanksGroup.remove(each)tanksGroup.remove(each)#子弹碰撞石头墙ifpygame.sprite.spritecollide(tank_player.bullet,map_stage.brickGroup,True,None):tank_player.bullet.being=False#子弹碰钢墙iftank_player.bullet.stronger:ifpygame.sprite.spritecollide(tank_player.bullet,map_stage.ironGroup,True,None):tank_player.bullet.being=Falseelse:ifpygame.sprite.spritecollide(tank_player.bullet,map_stage.ironGroup,False,None):tank_player.bullet.being=False#子弹碰大本营ifpygame.sprite.collide_rect(tank_player.bullet,myhome):tank_player.bullet.being=Falsemyhome.set_dead()is_gameover=True#敌方子弹foreachinenemytanksGroup:ifeach.being:ifeach.can_moveandnoteach.bullet.being:enemybulletsGroup.remove(each.bullet)each.shoot()enemybulletsGroup.add(each.bullet)ifnoteach.born:ifeach.bullet.being:each.bullet.move()screen.blit(each.bullet.bullet,each.bullet.rect)#子弹碰撞我方坦克fortank_playerinmytanksGroup:ifpygame.sprite.collide_rect(each.bullet,tank_player):ifnottank_player.protected:bang_sound.play()tank_player.life-=1iftank_player.life<0:mytanksGroup.remove(tank_player)tanksGroup.remove(tank_player)iflen(mytanksGroup)<1:is_gameover=Trueelse:tank_player.reset()each.bullet.being=FalseenemybulletsGroup.remove(each.bullet)break#子弹碰撞石头墙ifpygame.sprite.spritecollide(each.bullet,map_stage.brickGroup,True,None):each.bullet.being=FalseenemybulletsGroup.remove(each.bullet)#子弹碰钢墙ifeach.bullet.stronger:ifpygame.sprite.spritecollide(each.bullet,map_stage.ironGroup,True,None):each.bullet.being=Falseelse:ifpygame.sprite.spritecollide(each.bullet,map_stage.ironGroup,False,None):each.bullet.being=False#子弹碰大本营ifpygame.sprite.collide_rect(each.bullet,myhome):each.bullet.being=Falsemyhome.set_dead()is_gameover=Trueelse:enemytanksGroup.remove(each)tanksGroup.remove(each)#家screen.blit(myhome.home,myhome.rect)#食物formyfoodinmyfoodsGroup:ifmyfood.beingandmyfood.time>0:screen.blit(myfood.food,myfood.rect)myfood.time-=1fortank_playerinmytanksGroup:ifpygame.sprite.collide_rect(tank_player,myfood):#消灭当前所有敌人ifmyfood.kind==0:for_inenemytanksGroup:bang_sound.play()enemytanksGroup=pygame.sprite.Group()enemytanks_total-=enemytanks_nowenemytanks_now=0#敌人静止ifmyfood.kind==1:foreachinenemytanksGroup:each.can_move=False#子弹增强ifmyfood.kind==2:add_sound.play()tank_player.bullet.stronger=True#使得大本营的墙变为钢板ifmyfood.kind==3:map_stage.protect_home()#坦克获得一段时间的保护罩ifmyfood.kind==4:add_sound.play()fortank_playerinmytanksGroup:tank_player.protected=True#坦克升级ifmyfood.kind==5:add_sound.play()tank_player.up_level()#坦克生命+1ifmyfood.kind==6:add_sound.play()tank_player.life+=1myfood.being=FalsemyfoodsGroup.remove(myfood)breakelse:myfood.being=FalsemyfoodsGroup.remove(myfood)pygame.display.flip()clock.tick(60)ifnotis_gameover:show_end_interface(screen,630,630,True)else:show_end_interface(screen,630,630,False)if__name__=='__main__':main()
4)效果展示视频展示效果——
视频播放链接:https://live.csdn.net/v/embed/181068
【Pygame实战】经典的坦克大战游戏,勾起童年无限回忆!
静态截图效果——
游戏界面:
第一关单人游戏:
双人第一关游戏:
关于“如何实现Pygame坦克大战游戏”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。