python+pygame实现坦克大战小游戏的示例代码(可以自定义子弹速度)
- python+pygame实现坦克大战小游戏—可以自定义子弹速度:
- 运行环境–python3.7、pycharm;
- 源码需要请:点赞留言邮箱;
- 正常版子弹速度:
普通速度版
加速版子弹速度:
子弹加速版
另外还有多种道具,支持两人一起玩。main()方法如下:
defmain(): pygame.init() pygame.mixer.init() resolution=630,630 screen=pygame.display.set_mode(resolution) pygame.display.set_caption("TankGame") #加载图片,音乐,音效. background_image=pygame.image.load(r"..\image\background.png") home_image=pygame.image.load(r"..\image\home.png") home_destroyed_image=pygame.image.load(r"..\image\home_destroyed.png") bang_sound=pygame.mixer.Sound(r"..\music\bang.wav") bang_sound.set_volume(1) fire_sound=pygame.mixer.Sound(r"..\music\Gunfire.wav") start_sound=pygame.mixer.Sound(r"..\music\start.wav") start_sound.play() #定义精灵组:坦克,我方坦克,敌方坦克,敌方子弹 allTankGroup=pygame.sprite.Group() mytankGroup=pygame.sprite.Group() allEnemyGroup=pygame.sprite.Group() redEnemyGroup=pygame.sprite.Group() greenEnemyGroup=pygame.sprite.Group() otherEnemyGroup=pygame.sprite.Group() enemyBulletGroup=pygame.sprite.Group() #创建地图 bgMap=wall.Map() #创建食物/道具但不显示 prop=food.Food() #创建我方坦克 myTank_T1=myTank.MyTank(1) allTankGroup.add(myTank_T1) mytankGroup.add(myTank_T1) myTank_T2=myTank.MyTank(2) allTankGroup.add(myTank_T2) mytankGroup.add(myTank_T2) #创建敌方坦克 foriinrange(1,4): enemy=enemyTank.EnemyTank(i) allTankGroup.add(enemy) allEnemyGroup.add(enemy) ifenemy.isred==True: redEnemyGroup.add(enemy) continue ifenemy.kind==3: greenEnemyGroup.add(enemy) continue otherEnemyGroup.add(enemy) #敌军坦克出现动画 appearance_image=pygame.image.load(r"..\image\appear.png").convert_alpha() appearance=[] appearance.append(appearance_image.subsurface((0,0),(48,48))) appearance.append(appearance_image.subsurface((48,0),(48,48))) appearance.append(appearance_image.subsurface((96,0),(48,48))) #自定义事件 #创建敌方坦克延迟200 DELAYEVENT=pygame.constants.USEREVENT pygame.time.set_timer(DELAYEVENT,200) #创建敌方子弹延迟1000 ENEMYBULLETNOTCOOLINGEVENT=pygame.constants.USEREVENT+1 pygame.time.set_timer(ENEMYBULLETNOTCOOLINGEVENT,1000) #创建我方子弹延迟200 MYBULLETNOTCOOLINGEVENT=pygame.constants.USEREVENT+2 pygame.time.set_timer(MYBULLETNOTCOOLINGEVENT,200) #敌方坦克静止8000 NOTMOVEEVENT=pygame.constants.USEREVENT+3 pygame.time.set_timer(NOTMOVEEVENT,8000) delay=100 moving=0 movdir=0 moving2=0 movdir2=0 enemyNumber=3 enemyCouldMove=True switch_R1_R2_image=True homeSurvive=True running_T1=True running_T2=True clock=pygame.time.Clock() whileTrue: foreventinpygame.event.get(): ifevent.type==pygame.QUIT: pygame.quit() sys.exit() #我方子弹冷却事件 ifevent.type==MYBULLETNOTCOOLINGEVENT: myTank_T1.bulletNotCooling=True #敌方子弹冷却事件 ifevent.type==ENEMYBULLETNOTCOOLINGEVENT: foreachinallEnemyGroup: each.bulletNotCooling=True #敌方坦克静止事件 ifevent.type==NOTMOVEEVENT: enemyCouldMove=True #创建敌方坦克延迟 ifevent.type==DELAYEVENT: ifenemyNumber<4: enemy=enemyTank.EnemyTank() ifpygame.sprite.spritecollide(enemy,allTankGroup,False,None): break allEnemyGroup.add(enemy) allTankGroup.add(enemy) enemyNumber+=1 ifenemy.isred==True: redEnemyGroup.add(enemy) elifenemy.kind==3: greenEnemyGroup.add(enemy) else: otherEnemyGroup.add(enemy) ifevent.type==pygame.KEYDOWN: ifevent.key==pygame.K_candpygame.KMOD_CTRL: pygame.quit() sys.exit() ifevent.key==pygame.K_e: myTank_T1.levelUp() ifevent.key==pygame.K_q: myTank_T1.levelDown() ifevent.key==pygame.K_3: myTank_T1.levelUp() myTank_T1.levelUp() myTank_T1.level=3 ifevent.key==pygame.K_2: ifmyTank_T1.speed==3: myTank_T1.speed=24 else: myTank_T1.speed=3 ifevent.key==pygame.K_1: forx,yin[(11,23),(12,23),(13,23),(14,23),(11,24),(14,24),(11,25),(14,25)]: bgMap.brick=wall.Brick() bgMap.brick.rect.left,bgMap.brick.rect.top=3+x*24,3+y*24 bgMap.brickGroup.add(bgMap.brick) ifevent.key==pygame.K_4: forx,yin[(11,23),(12,23),(13,23),(14,23),(11,24),(14,24),(11,25),(14,25)]: bgMap.iron=wall.Iron() bgMap.iron.rect.left,bgMap.iron.rect.top=3+x*24,3+y*24 bgMap.ironGroup.add(bgMap.iron) #检查用户的键盘操作 key_pressed=pygame.key.get_pressed() #玩家一的移动操作 ifmoving: moving-=1 ifmovdir==0: allTankGroup.remove(myTank_T1) ifmyTank_T1.moveUp(allTankGroup,bgMap.brickGroup,bgMap.ironGroup): moving+=1 allTankGroup.add(myTank_T1) running_T1=True ifmovdir==1: allTankGroup.remove(myTank_T1) ifmyTank_T1.moveDown(allTankGroup,bgMap.brickGroup,bgMap.ironGroup): moving+=1 allTankGroup.add(myTank_T1) running_T1=True ifmovdir==2: allTankGroup.remove(myTank_T1) ifmyTank_T1.moveLeft(allTankGroup,bgMap.brickGroup,bgMap.ironGroup): moving+=1 allTankGroup.add(myTank_T1) running_T1=True ifmovdir==3: allTankGroup.remove(myTank_T1) ifmyTank_T1.moveRight(allTankGroup,bgMap.brickGroup,bgMap.ironGroup): moving+=1 allTankGroup.add(myTank_T1) running_T1=True ifnotmoving: ifkey_pressed[pygame.K_w]: moving=7 movdir=0 running_T1=True allTankGroup.remove(myTank_T1) ifmyTank_T1.moveUp(allTankGroup,bgMap.brickGroup,bgMap.ironGroup): moving=0 allTankGroup.add(myTank_T1) elifkey_pressed[pygame.K_s]: moving=7 movdir=1 running_T1=True allTankGroup.remove(myTank_T1) ifmyTank_T1.moveDown(allTankGroup,bgMap.brickGroup,bgMap.ironGroup): moving=0 allTankGroup.add(myTank_T1) elifkey_pressed[pygame.K_a]: moving=7 movdir=2 running_T1=True allTankGroup.remove(myTank_T1) ifmyTank_T1.moveLeft(allTankGroup,bgMap.brickGroup,bgMap.ironGroup): moving=0 allTankGroup.add(myTank_T1) elifkey_pressed[pygame.K_d]: moving=7 movdir=3 running_T1=True allTankGroup.remove(myTank_T1) ifmyTank_T1.moveRight(allTankGroup,bgMap.brickGroup,bgMap.ironGroup): moving=0 allTankGroup.add(myTank_T1) ifkey_pressed[pygame.K_j]: ifnotmyTank_T1.bullet.lifeandmyTank_T1.bulletNotCooling: fire_sound.play() myTank_T1.shoot() myTank_T1.bulletNotCooling=False #玩家二的移动操作 ifmoving2: moving2-=1 ifmovdir2==0: allTankGroup.remove(myTank_T2) myTank_T2.moveUp(allTankGroup,bgMap.brickGroup,bgMap.ironGroup) allTankGroup.add(myTank_T2) running_T2=True ifmovdir2==1: allTankGroup.remove(myTank_T2) myTank_T2.moveDown(allTankGroup,bgMap.brickGroup,bgMap.ironGroup) allTankGroup.add(myTank_T2) running_T2=True ifmovdir2==2: allTankGroup.remove(myTank_T2) myTank_T2.moveLeft(allTankGroup,bgMap.brickGroup,bgMap.ironGroup) allTankGroup.add(myTank_T2) running_T2=True ifmovdir2==3: allTankGroup.remove(myTank_T2) myTank_T2.moveRight(allTankGroup,bgMap.brickGroup,bgMap.ironGroup) allTankGroup.add(myTank_T2) running_T2=True ifnotmoving2: ifkey_pressed[pygame.K_UP]: allTankGroup.remove(myTank_T2) myTank_T2.moveUp(allTankGroup,bgMap.brickGroup,bgMap.ironGroup) allTankGroup.add(myTank_T2) moving2=7 movdir2=0 running_T2=True elifkey_pressed[pygame.K_DOWN]: allTankGroup.remove(myTank_T2) myTank_T2.moveDown(allTankGroup,bgMap.brickGroup,bgMap.ironGroup) allTankGroup.add(myTank_T2) moving2=7 movdir2=1 running_T2=True elifkey_pressed[pygame.K_LEFT]: allTankGroup.remove(myTank_T2) myTank_T2.moveLeft(allTankGroup,bgMap.brickGroup,bgMap.ironGroup) allTankGroup.add(myTank_T2) moving2=7 movdir2=2 running_T2=True elifkey_pressed[pygame.K_RIGHT]: allTankGroup.remove(myTank_T2) myTank_T2.moveRight(allTankGroup,bgMap.brickGroup,bgMap.ironGroup) allTankGroup.add(myTank_T2) moving2=7 movdir2=3 running_T2=True ifkey_pressed[pygame.K_KP0]: ifnotmyTank_T2.bullet.life: #fire_sound.play() myTank_T2.shoot() #画背景 screen.blit(background_image,(0,0)) #画砖块 foreachinbgMap.brickGroup: screen.blit(each.image,each.rect) #花石头 foreachinbgMap.ironGroup: screen.blit(each.image,each.rect) #画home ifhomeSurvive: screen.blit(home_image,(3+12*24,3+24*24)) else: screen.blit(home_destroyed_image,(3+12*24,3+24*24)) #画我方坦克1 ifnot(delay%5): switch_R1_R2_image=notswitch_R1_R2_image ifswitch_R1_R2_imageandrunning_T1: screen.blit(myTank_T1.tank_R0,(myTank_T1.rect.left,myTank_T1.rect.top)) running_T1=False else: screen.blit(myTank_T1.tank_R1,(myTank_T1.rect.left,myTank_T1.rect.top)) #画我方坦克2 ifswitch_R1_R2_imageandrunning_T2: screen.blit(myTank_T2.tank_R0,(myTank_T2.rect.left,myTank_T2.rect.top)) running_T2=False else: screen.blit(myTank_T2.tank_R1,(myTank_T2.rect.left,myTank_T2.rect.top)) #画敌方坦克 foreachinallEnemyGroup: #判断5毛钱特效是否播放 ifeach.flash: #判断画左动作还是右动作 ifswitch_R1_R2_image: screen.blit(each.tank_R0,(each.rect.left,each.rect.top)) ifenemyCouldMove: allTankGroup.remove(each) each.move(allTankGroup,bgMap.brickGroup,bgMap.ironGroup) allTankGroup.add(each) else: screen.blit(each.tank_R1,(each.rect.left,each.rect.top)) ifenemyCouldMove: allTankGroup.remove(each) each.move(allTankGroup,bgMap.brickGroup,bgMap.ironGroup) allTankGroup.add(each) else: #播放5毛钱特效 ifeach.times>0: each.times-=1 ifeach.times<=10: screen.blit(appearance[2],(3+each.x*12*24,3)) elifeach.times<=20: screen.blit(appearance[1],(3+each.x*12*24,3)) elifeach.times<=30: screen.blit(appearance[0],(3+each.x*12*24,3)) elifeach.times<=40: screen.blit(appearance[2],(3+each.x*12*24,3)) elifeach.times<=50: screen.blit(appearance[1],(3+each.x*12*24,3)) elifeach.times<=60: screen.blit(appearance[0],(3+each.x*12*24,3)) elifeach.times<=70: screen.blit(appearance[2],(3+each.x*12*24,3)) elifeach.times<=80: screen.blit(appearance[1],(3+each.x*12*24,3)) elifeach.times<=90: screen.blit(appearance[0],(3+each.x*12*24,3)) ifeach.times==0: each.flash=True #绘制我方子弹1 ifmyTank_T1.bullet.life: myTank_T1.bullet.move() screen.blit(myTank_T1.bullet.bullet,myTank_T1.bullet.rect) #子弹碰撞子弹 foreachinenemyBulletGroup: ifeach.life: ifpygame.sprite.collide_rect(myTank_T1.bullet,each): myTank_T1.bullet.life=False each.life=False pygame.sprite.spritecollide(myTank_T1.bullet,enemyBulletGroup,True,None) #子弹碰撞敌方坦克 ifpygame.sprite.spritecollide(myTank_T1.bullet,redEnemyGroup,True,None): prop.change() bang_sound.play() enemyNumber-=1 myTank_T1.bullet.life=False elifpygame.sprite.spritecollide(myTank_T1.bullet,greenEnemyGroup,False,None): foreachingreenEnemyGroup: ifpygame.sprite.collide_rect(myTank_T1.bullet,each): ifeach.life==1: pygame.sprite.spritecollide(myTank_T1.bullet,greenEnemyGroup,True,None) bang_sound.play() enemyNumber-=1 elifeach.life==2: each.life-=1 each.tank=each.enemy_3_0 elifeach.life==3: each.life-=1 each.tank=each.enemy_3_2 myTank_T1.bullet.life=False elifpygame.sprite.spritecollide(myTank_T1.bullet,otherEnemyGroup,True,None): bang_sound.play() enemyNumber-=1 myTank_T1.bullet.life=False #ifpygame.sprite.spritecollide(myTank_T1.bullet,allEnemyGroup,True,None): #bang_sound.play() #enemyNumber-=1 #myTank_T1.bullet.life=False #子弹碰撞brickGroup ifpygame.sprite.spritecollide(myTank_T1.bullet,bgMap.brickGroup,True,None): myTank_T1.bullet.life=False myTank_T1.bullet.rect.left,myTank_T1.bullet.rect.right=3+12*24,3+24*24 #子弹碰撞brickGroup ifmyTank_T1.bullet.strong: ifpygame.sprite.spritecollide(myTank_T1.bullet,bgMap.ironGroup,True,None): myTank_T1.bullet.life=False myTank_T1.bullet.rect.left,myTank_T1.bullet.rect.right=3+12*24,3+24*24 else: ifpygame.sprite.spritecollide(myTank_T1.bullet,bgMap.ironGroup,False,None): myTank_T1.bullet.life=False myTank_T1.bullet.rect.left,myTank_T1.bullet.rect.right=3+12*24,3+24*24 #绘制我方子弹2 ifmyTank_T2.bullet.life: myTank_T2.bullet.move() screen.blit(myTank_T2.bullet.bullet,myTank_T2.bullet.rect) #子弹碰撞敌方坦克 ifpygame.sprite.spritecollide(myTank_T2.bullet,allEnemyGroup,True,None): bang_sound.play() enemyNumber-=1 myTank_T2.bullet.life=False #子弹碰撞brickGroup ifpygame.sprite.spritecollide(myTank_T2.bullet,bgMap.brickGroup,True,None): myTank_T2.bullet.life=False myTank_T2.bullet.rect.left,myTank_T2.bullet.rect.right=3+12*24,3+24*24 #子弹碰撞brickGroup ifmyTank_T2.bullet.strong: ifpygame.sprite.spritecollide(myTank_T2.bullet,bgMap.ironGroup,True,None): myTank_T2.bullet.life=False myTank_T2.bullet.rect.left,myTank_T2.bullet.rect.right=3+12*24,3+24*24 else: ifpygame.sprite.spritecollide(myTank_T2.bullet,bgMap.ironGroup,False,None): myTank_T2.bullet.life=False myTank_T2.bullet.rect.left,myTank_T2.bullet.rect.right=3+12*24,3+24*24 #绘制敌人子弹 foreachinallEnemyGroup: #如果子弹没有生命,则赋予子弹生命 ifnoteach.bullet.lifeandeach.bulletNotCoolingandenemyCouldMove: enemyBulletGroup.remove(each.bullet) each.shoot() enemyBulletGroup.add(each.bullet) each.bulletNotCooling=False #如果5毛钱特效播放完毕并且子弹存活则绘制敌方子弹 ifeach.flash: ifeach.bullet.life: #如果敌人可以移动 ifenemyCouldMove: each.bullet.move() screen.blit(each.bullet.bullet,each.bullet.rect) #子弹碰撞我方坦克 ifpygame.sprite.collide_rect(each.bullet,myTank_T1): bang_sound.play() myTank_T1.rect.left,myTank_T1.rect.top=3+8*24,3+24*24 each.bullet.life=False moving=0#重置移动控制参数 foriinrange(myTank_T1.level+1): myTank_T1.levelDown() ifpygame.sprite.collide_rect(each.bullet,myTank_T2): bang_sound.play() myTank_T2.rect.left,myTank_T2.rect.top=3+16*24,3+24*24 each.bullet.life=False #子弹碰撞brickGroup ifpygame.sprite.spritecollide(each.bullet,bgMap.brickGroup,True,None): each.bullet.life=False #子弹碰撞ironGroup ifeach.bullet.strong: ifpygame.sprite.spritecollide(each.bullet,bgMap.ironGroup,True,None): each.bullet.life=False else: ifpygame.sprite.spritecollide(each.bullet,bgMap.ironGroup,False,None): each.bullet.life=False #最后画食物/道具 ifprop.life: screen.blit(prop.image,prop.rect) #我方坦克碰撞食物/道具 ifpygame.sprite.collide_rect(myTank_T1,prop): ifprop.kind==1:#敌人全毁 foreachinallEnemyGroup: ifpygame.sprite.spritecollide(each,allEnemyGroup,True,None): bang_sound.play() enemyNumber-=1 prop.life=False ifprop.kind==2:#敌人静止 enemyCouldMove=False prop.life=False ifprop.kind==3:#子弹增强 myTank_T1.bullet.strong=True prop.life=False ifprop.kind==4:#家得到保护 forx,yin[(11,23),(12,23),(13,23),(14,23),(11,24),(14,24),(11,25),(14,25)]: bgMap.iron=wall.Iron() bgMap.iron.rect.left,bgMap.iron.rect.top=3+x*24,3+y*24 bgMap.ironGroup.add(bgMap.iron) prop.life=False ifprop.kind==5:#坦克无敌 prop.life=False pass ifprop.kind==6:#坦克升级 myTank_T1.levelUp() prop.life=False ifprop.kind==7:#坦克生命+1 myTank_T1.life+=1 prop.life=False #延迟 delay-=1 ifnotdelay: delay=100 pygame.display.flip() clock.tick(60)
总结
到此这篇关于python+pygame实现坦克大战小游戏---可以自定义子弹速度的文章就介绍到这了,更多相关python+pygame实现坦克大战小游戏内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。