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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。