import pygame
from pygame.sprite import Sprite
import time
import random
SCREEN_WIDTH=700
SCREEN_HEIGHT=500
BG_COLOR=pygame.Color(0,0,0)
TEXT_COLOR=pygame.Color(255,0,0)
class BaseItem(Sprite):
def __init__(self,color,width,height):
pygame.sprite.Sprite.__init__(self)
class Maingame():
window=None
my_tank=None
enemyTankList=[]
enemyTankcount=5
myBulletList=[]
enemyBulletList=[]
explodeList=[]
def createEnemyTank(self):
top=100
#循环生成敌方坦克
for i in range(Maingame.enemyTankcount):
left=random.randint(0,600)
speed=random.randint(1,4)
enemy=Enemytank(left,top,speed)
Maingame.enemyTankList.append(enemy)
def blitEnemyTank(self):
#判断敌方坦克是否活着
for enemyTank in Maingame.enemyTankList:
if enemyTank.live:
enemyTank.displayTank()
enemyTank.randMove()
enemyBullet=enemyTank.shot()
if enemyBullet:
Maingame.enemyBulletList.append(enemyBullet)
else:
Maingame.enemyTankList.remove(enemyTank)
def blitMyBullet(self):
#判断当前子弹是否为活着的状态,如果不是则在列表中删除
for myBullet in Maingame.myBulletList:
if myBullet.live:
myBullet.displayBullet()
myBullet.move()
myBullet.myBullet_hit_enemyTank()
else:
Maingame.myBulletList.remove(myBullet)
def blitEnemyBullet(self):
for enemyBullet in Maingame.enemyBulletList:
if enemyBullet.live:
enemyBullet.displayBullet()
enemyBullet.move()
else:
Maingame.enemyBulletList.remove(enemyBullet)
def __init__(self):
pass
def startgame(self):
pygame.display.init()
Maingame.window = pygame.display.set_mode([SCREEN_WIDTH, SCREEN_HEIGHT])
pygame.display.set_caption("坦克大战1.03")
Maingame.my_tank=Tank(350,250)
self.createEnemyTank()
while True:
time.sleep(0.02)
pygame.display.update()
Maingame.window.fill(BG_COLOR)
Maingame.window.blit(self.getTextSurface("敌方坦克剩余数量%d"%len(Maingame.enemyTankList)),(10,10))# 后一个位置可接元组
self.getEvent()
Maingame.my_tank.displayTank()
self.blitEnemyTank()
self.blitMyBullet()
self.blitEnemyBullet()
self.blitExplode()
def blitExplode(self):
for explode in Maingame.explodeList:
if explode.live:
explode.displayExplode()
else:
Maingame.explodeList.remove(explode)
if not Maingame.my_tank.stop:
Maingame.my_tank.move()
def endgame(self):
print("谢谢使用哦")
exit()
def getEvent(self):
eventList=pygame.event.get()
for event in eventList:
if event.type == pygame.QUIT:
self.endgame()
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
Maingame.my_tank.direction="L"
Maingame.my_tank.stop=False
#Maingame.my_tank.move()
print("坦克向左移动")
elif event.key == pygame.K_UP:
Maingame.my_tank.direction = "U"
Maingame.my_tank.stop=False
#Maingame.my_tank.move()
print("坦克向上移动")
elif event.key == pygame.K_RIGHT:
Maingame.my_tank.direction = "R"
Maingame.my_tank.stop = False
#Maingame.my_tank.move()
print("坦克向右移动")
elif event.key == pygame.K_DOWN:
Maingame.my_tank.direction = "D"
Maingame.my_tank.stop = False
print("坦克向下移动")
elif event.key == pygame.K_SPACE:
print("发射子弹")
#Maingame.my_tank.move()
if len(Maingame.myBulletList)<=3:
myBullet=Bullet(Maingame.my_tank)
Maingame.myBulletList.append(myBullet)
if event.type == pygame.KEYUP:
if event.key== pygame.K_UP or event.key==pygame.K_DOWN or event.key==pygame.K_RIGHT or event.key==pygame.K_LEFT:
Maingame.my_tank.stop=True
def getTextSurface(self,text):
#初始化字体模块
pygame.font.init()
font=pygame.font.SysFont("kaiti",18)
textSurface=font.render(text,True,TEXT_COLOR)
return textSurface
class Tank(BaseItem):
def __init__(self,top,left):
self.images={
"U":pygame.image.load("imgs/p1tankU.gif"),
"D": pygame.image.load("imgs/p1tankD.gif"),
"L": pygame.image.load("imgs/p1tankL.gif"),
"R": pygame.image.load("imgs/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=10
self.stop = True
self.live = True
def move(self):
if self.direction =="L":
if self.rect.left>0:
self.rect.left -= self.speed
elif self.direction =="U":
if self.rect.top>0:
self.rect.top -= self.speed
elif self.direction =="D":
if self.rect.top+self.rect.height<SCREEN_HEIGHT:
self.rect.top += self.speed
elif self.direction =="R":
if self.rect.left+self.rect.height<SCREEN_WIDTH:
self.rect.left += self.speed
def shot(self):
return Bullet(self)
def displayTank(self):
self.image=self.images[self.direction]
Maingame.window.blit(self.image,self.rect)
#我方坦克
class Mytank():
def __init__(self):
pass
class Enemytank(Tank):
def __init__(self,left,top,speed):
super(Enemytank,self).__init__(left,top)
self.images={"U":pygame.image.load("imgs/enemy1U.gif"),
"R": pygame.image.load("imgs/enemy1R.gif"),
"L":pygame.image.load("imgs/enemy1L.gif"),
"D":pygame.image.load("imgs/enemy1D.gif")
}
self.direction=self.randDirection()
self.image = self.images[self.direction]
self.rect=self.image.get_rect()
self.rect.left=left
self.rect.top=top
self.speed=speed
self.flag=True
self.step=60
def randDirection(self):
num = random.randint(1,4)
if num==1:
return "U"
elif num ==2:
return "R"
elif num ==3:
return "L"
elif num==4:
return "D"
#敌方坦克随机移动的方法
def randMove(self):
if self.step <=0:
self.direction=self.randDirection()
self.step=60
else:
self.move()
self.step-=1
def shot(self):
num=random.randint(1,100)
if num <10:
return Bullet(self)
class Wall():
def __init__(self):
pass
def display(self):
pass
class Explode():
#爆炸同tank的位置相同
def __init__(self,tank):
self.rect= tank.rect
self.images=[pygame.image.load("imgs/blast0.gif"),
pygame.image.load("imgs/blast1.gif"),
pygame.image.load("imgs/blast2.gif"),
pygame.image.load("imgs/blast3.gif"),
pygame.image.load("imgs/blast4.gif"),
]
self.step=0
self.image=self.images[self.step]
self.live=True
def displayExplode(self):
if self.step <len(self.images):
self.image=self.images[self.step]
self.step+=1
Maingame.window.blit(self.image,self.rect)
else:
self.live=False
self.step=0
class music():
def __init__(self):
pass
def play(self):
pass
class Bullet(BaseItem):
def __init__(self,tank):
self.image=pygame.image.load("imgs/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/2
self.rect.top = tank.rect.top-self.rect.top
elif self.direction=="D":
self.rect.left= tank.rect.left+tank.rect.width/2-self.rect.width/2
self.rect.top = tank.rect.top+self.rect.top
elif self.direction=="L":
self.rect.left= tank.rect.left-tank.rect.width/2-self.rect.width/2
self.rect.top = tank.rect.top+tank.rect.width/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.width/2-self.rect.width/2
self.speed=6
#增加子弹的状态是否碰到墙壁
self.live=True
def displayBullet(self):
Maingame.window.blit(self.image,self.rect)
def move(self):
if self.direction =="U":
if self.rect.top >0:
self.rect.top -=self.speed
else:
self.live=False
elif self.direction == "R":
if self.rect.left+self.rect.width<SCREEN_WIDTH:
self.rect.left+=self.speed
else:
self.live=False
elif self.direction == "L":
if self.rect.left>0:
self.rect.left-=self.speed
else:
self.live=False
elif self.direction == "D":
if self.rect.top+self.rect.height<SCREEN_HEIGHT:
self.rect.top+=self.speed
else:
self.live=False
#我方子弹与敌方坦克的碰撞
def myBullet_hit_enemyTank(self):
for enemyTank in Maingame.enemyTankList:
if pygame.sprite.collide_rect(enemyTank,self):
enemyTank.live=False
self.live=False
explode=Explode(enemyTank)
Maingame.explodeList.append(explode)
if __name__== '__main__':
Maingame().startgame()
#老师,请问我这个代码跑的时候为什么会出现我方坦克只能打中对方才能移动的情况呢