python坦克大战游戏_Python开发的坦克大战游戏

python开发的坦克大战游戏importpygamefrom pygame.sprite importSpriteimportsysimporttimeimportrandom

SCREEN_WIDTH= 780SCREEN_HEIGHT= 500BG_COLOR=pygame.Color(0,0,0)

TEXT_COLOR= pygame.Color(255,0,0)#复活次数

#定义一个精灵类

classBaseItem(Sprite):def __init__(self, color, width, height):#Call the parent class (Sprite) constructor

pygame.sprite.Sprite.__init__(self)classMainGame ():

window=None

my_tank=None

REC_TIME=0#敌方坦克初始化

EnemyTankList =[]

EnemyTankCount= 5

#存储我方子弹列表

myBulleList =[]#存储敌方子弹

EnemyBulletList =[]#创建爆炸对象列表

explodeList =[]#创建墙壁列表

wallList =[]def __init__(self):pass

defstarGame(self):#初始化,设置标题,屏幕大小

pygame.display.init()

MainGame.window=pygame.display.set_mode((SCREEN_WIDTH,SCREEN_HEIGHT))

pygame.display.set_caption("坦克大战1.03")#初始化我方坦克

self.creatMyTank()#初始化敌方坦克

self.creatEnemyTank()#初始化墙壁

self.creatWall()whileTrue:#填充颜色

MainGame.window.fill(BG_COLOR)#获取事件

self.getEvent()#绘制文字

MainGame.window.blit(self.getTextSuface("敌方坦克剩余数量%d"%MainGame.EnemyTankCount),(SCREEN_HEIGHT/2,20))#调用我方坦克进行显示

if MainGame.my_tank andMainGame.my_tank.live:

MainGame.my_tank.displayTank()else:delMainGame.my_tank

MainGame.my_tank=None#显示我方子弹

self.blitMyBullet()#敌方坦克进行显示

self.blitEnenyTank()#显示墙壁

self.blitWall()#显示敌方子弹

self.blitEnenyBullet()#显示爆炸效果

self.blitExplode()if MainGame.my_tank andMainGame.my_tank.live:if notMainGame.my_tank.stop:

MainGame.my_tank.move()

MainGame.my_tank.hitWall()

MainGame.my_tank.myTank_hit_enemyTank()if MainGame.EnemyTankCount ==0:

MainGame.window.blit(self.getTextSuface('恭喜你,顺利通过'), (SCREEN_HEIGHT/2, SCREEN_WIDTH/2))

time.sleep(2)

self.endGame()

pygame.display.update()

time.sleep(0.02)defcreatWall(self):for i in range(0,SCREEN_WIDTH,SCREEN_WIDTH//6):

top= SCREEN_HEIGHT//3left=i

wall=Wall(left,top)

MainGame.wallList.append(wall)defcreatMyTank(self):

MainGame.my_tank= MyTank(SCREEN_WIDTH/2,SCREEN_HEIGHT/3*2)

music= Music("img/start.wav")

music.play()defcreatEnemyTank(self):

top= 100

for i inrange(MainGame.EnemyTankCount):

left= random.randint(0,600)

speed= random.randint(1,4)

enmy=EnemyTank(left,top,speed)

MainGame.EnemyTankList.append(enmy)defblitWall(self):for wall inMainGame.wallList:ifwall.live:

wall.displayWall()else:

MainGame.wallList.remove(wall)defblitEnenyTank(self):"循环遍历敌方坦克,展示敌方坦克"

for enmeyTank inMainGame.EnemyTankList:ifenmeyTank.live:

enmeyTank.displayTank()

enmeyTank.randomMove()

EnemyBullet=enmeyTank.shot()

enmeyTank.hitWall()

enmeyTank.enemyTank_hit_MyTank()#存储敌方子弹

ifEnemyBullet:

MainGame.EnemyBulletList.append(EnemyBullet)else:

MainGame.EnemyTankList.remove(enmeyTank)

MainGame.EnemyTankCount-=1

defblitMyBullet(self):for bullet inMainGame.myBulleList:ifbullet.live:

bullet.displayBullet()

bullet.move()

bullet.myBullet_hit_enemyTank()

bullet.wall_bullet()else:

MainGame.myBulleList.remove(bullet)defblitEnenyBullet(self):for bullet inMainGame.EnemyBulletList:if bullet.live: #随机会产生None

bullet.displayBullet()

bullet.move()

bullet.enemyBullet_hit_myTank()

bullet.wall_bullet()else:

MainGame.EnemyBulletList.remove(bullet)defblitExplode(self):for explode inMainGame.explodeList:ifexplode.live:

explode.displayExplode()else:

MainGame.explodeList.remove(explode)defendGame(self):print("欢迎下次游戏")

sys.exit()defgetTextSuface(self,text):

pygame.font.init()#print(pygame.font.get_fonts())

font = pygame.font.SysFont('kaiti',18)

textSurface=font.render(text,True,TEXT_COLOR)returntextSurfacedefgetEvent(self):'''获取所有事件'''eventList=pygame.event.get()for event ineventList:if event.type ==pygame.QUIT:

self.endGame()if event.type ==pygame.KEYDOWN:if notMainGame.my_tank:if event.key ==pygame.K_ESCAPE:if MainGame.REC_TIME < 3:

self.creatMyTank()

MainGame.REC_TIME+=1

if MainGame.my_tank andMainGame.my_tank.live:if event.key ==pygame.K_DOWN:

MainGame.my_tank.direction='D'

#MainGame.my_tank.move()

MainGame.my_tank.stop =Falseprint("按下向下的键,向下移动",)elif event.key ==pygame.K_UP:

MainGame.my_tank.direction= 'U'

#MainGame.my_tank.move()

MainGame.my_tank.stop =Falseprint("按下向上的键,向上移动")elif event.key ==pygame.K_LEFT:

MainGame.my_tank.direction= 'L'

#MainGame.my_tank.move()

MainGame.my_tank.stop =Falseprint("按下向左的键,向左移动", MainGame.my_tank.direction)elif event.key ==pygame.K_RIGHT:

MainGame.my_tank.direction= 'R'

#MainGame.my_tank.move()

MainGame.my_tank.stop =Falseprint("按下向右的键,向右移动", MainGame.my_tank.direction)elif event.key ==pygame.K_SPACE:print("发射子弹")#创建我方子弹

if len(MainGame.myBulleList) < 3:

myBullet=Bullet(MainGame.my_tank)

MainGame.myBulleList.append(myBullet)#发射子弹音效

ShotMusic = Music('img/hit.wav')

ShotMusic.play()elif event.type ==pygame.KEYUP:if event.key ==pygame.K_UP or event.key == pygame.K_DOWN or event.key ==pygame.K_LEFT or event.key ==pygame.K_RIGHT:if MainGame.my_tank andMainGame.my_tank.live:

MainGame.my_tank.stop=TrueclassTank(BaseItem):def __init__(self,left,top):

self.images={"U":pygame.image.load('img/p1tankU.gif'),"D": pygame.image.load('img/p1tankD.gif'),"L": pygame.image.load('img/p1tankL.gif'),"R": pygame.image.load('img/p1tankR.gif'),

}

self.direction='U'self.image=self.images[self.direction]

self.rect=self.image.get_rect()#设置放置的位置

self.rect.left=left

self.rect.top=top

self.speed= 4

#控制坦克开关

self.stop =True

self.live=True#保持原来的位置

self.oldLeft =self.rect.left

self.oldTop=self.rect.topdefhitWall(self):for wall inMainGame.wallList:ifpygame.sprite.collide_rect(wall, self):

self.stay()defstay(self):

self.rect.left=self.oldLeft

self.rect.top=self.oldTopdefshot(self):returnBullet(self)defmove(self):#保持原来的状态

self.oldLeft =self.rect.left

self.oldTop=self.rect.top#判断坦克的方向进行移动

if self.direction =='U':if self.rect.top>0:

self.rect.top-=self.speedelif self.direction =='L':if self.rect.left>0:

self.rect.left-=self.speedelif self.direction =='D':if self.rect.top +self.rect.height

self.rect.top+=self.speedelif self.direction == 'R':if self.rect.left+self.rect.height

self.rect.left+=self.speeddefdisplayTank(self):

self.image=self.images[self.direction]

MainGame.window.blit(self.image,self.rect)classMyTank(Tank):def __init__(self,left,top):

super().__init__(left,top)defmyTank_hit_enemyTank(self):for enemyTank inMainGame.EnemyTankList:ifpygame.sprite.collide_rect(enemyTank, self):

self.stay()classEnemyTank(Tank):def __init__(self,left,top,speed):

super(EnemyTank,self).__init__(left,top)

self.images={"U": pygame.image.load('img/enemy1U.gif'),"D": pygame.image.load('img/enemy1D.gif'),"L": pygame.image.load('img/enemy1L.gif'),"R": pygame.image.load('img/enemy1R.gif'),

}

self.direction=self.RandomDirction()

self.image=self.images[self.direction]

self.rect=self.image.get_rect()

self.rect.left=left

self.rect.top=top

self.speed=speed

self.EnemyFlag=False

self.step= 60

defRandomDirction(self):

num= random.randint(1,4)if num ==1:return "U"

elif num == 2:return "L"

elif num == 3:return "D"

elif num == 4:return "R"

defrandomMove(self):if self.step <0:

self.direction=self.RandomDirction()

self.step= 60

else:

self.move()

self.step-= 1

defshot(self):

num=random.randint(1,100)if num < 4:returnBullet(self)defenemyTank_hit_MyTank(self):for enemy inMainGame.EnemyTankList:if MainGame.my_tank andMainGame.my_tank.live :ifpygame.sprite.collide_rect(MainGame.my_tank,enemy):

self.stay()classBullet(BaseItem):def __init__(self,tank):

self.image=pygame.image.load('img/enemymissile.gif')

self.direction=tank.direction

self.rect=self.image.get_rect()if self.direction == 'U':

self.rect.left= tank.rect.left + tank.rect.width/2 - self.rect.width/2self.rect.top= tank.rect.top -self.rect.heightelif self.direction == 'D':

self.rect.left= tank.rect.left + tank.rect.width/2 - self.rect.width/2self.rect.top= tank.rect.top +tank.rect.heightelif self.direction == 'L':

self.rect.left= tank.rect.left - self.rect.width/2 -self.rect.width/2self.rect.top= tank.rect.top +tank.rect.height/2 - self.rect.width/2

elif self.direction == 'R':

self.rect.left= tank.rect.left +tank.rect.width

self.rect.top= tank.rect.top + tank.rect.height/2 -self.rect.width/2

#子弹的速度

self.speed =6

#子弹状态

self.live =Truedefmove(self):if self.direction == 'U':if self.rect.top>0:

self.rect.top-=self.speedelse:

self.live=Falseelif self.direction == 'R':if self.rect.left + self.rect.width

self.rect.left+=self.speedelse:

self.live=Falseelif self.direction == 'D':if self.rect.top + self.rect.height

self.rect.top+=self.speedelse:

self.live=Falseelif self.direction == 'L':if self.rect.left>0:

self.rect.left-=self.speedelse:

self.live=FalsedefdisplayBullet(self):

MainGame.window.blit(self.image,self.rect)defmyBullet_hit_enemyTank(self):for enemyTank inMainGame.EnemyTankList:ifpygame.sprite.collide_rect(enemyTank,self):

enemyTank.live=False

self.live=False#创建爆炸对象

explode =Explode(enemyTank)

MainGame.explodeList.append(explode)defenemyBullet_hit_myTank(self):if MainGame.my_tank andMainGame.my_tank.live:ifpygame.sprite.collide_rect(MainGame.my_tank,self):

MainGame.my_tank.live=False

self.live=False

explode=Explode(MainGame.my_tank)

MainGame.explodeList.append(explode)defwall_bullet(self):for wall inMainGame.wallList:ifpygame.sprite.collide_rect(wall,self):

wall.hg-=1self.live=Falseif wall.hg<=0:

wall.live=FalseclassWall():def __init__(self,left,top):

self.image= pygame.image.load('img/steels.gif')

self.rect=self.image.get_rect()

self.rect.top=top

self.rect.left=left

self.live=True

self.hg= 8

defdisplayWall(self):if self.live ==True:

MainGame.window.blit(self.image,self.rect)classExplode():def __init__(self,tank):#爆炸的位置有坦克决定

self.rect =tank.rect

self.images= [pygame.image.load('img/blast0.gif'),

pygame.image.load('img/blast1.gif'),

pygame.image.load('img/blast2.gif'),

pygame.image.load('img/blast3.gif')]

self.step=0

self.image=self.images[self.step]

self.live=TruedefdisplayExplode(self):if self.step

self.image=self.images[self.step]

self.step+=1MainGame.window.blit(self.image,self.rect)else:

self.live=False

self.step=0classMusic():def __init__(self,filename):

self.filename=filename#初始化音乐混合器

pygame.mixer.init()

pygame.mixer.music.load(filename)defplay(self):

pygame.mixer.music.play()if __name__ == '__main__':

c=MainGame()

c.starGame()

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值