老师,昨晚代码粘贴错了,你看看这个代码,我的问题是,我根据课堂讲的一步一步写的坦克大战游戏,然后写到我方子弹和敌方坦克碰撞后消失的效果的程序,运行后,碰撞不消失!
import pygame,time,random
from pygame.sprite import Sprite
screen_width=700
screen_height=600
bg_color=pygame.Color(0,0,0)
text_color=pygame.Color(255,0,0)
class BaseItem(Sprite):
def __init__(self, color, width, height):
# Call the parent class (Sprite) constructor
pygame.sprite.Sprite.__init__(self)
class MainGame():
window=None
mytank=None
enemytanklist=[]
enemytankcount=5
mytankbulletlist=[]
enemytankbulletlist=[]
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.0")
MainGame.mytank=Tank(350,300)#这是初始化加载一次,不能一直加载,一直加载岂不是不死了,加载就是生成
self.createenemytank()
while True:
time.sleep(0.02)
MainGame.window.fill(bg_color)
#要一直获取事件
self.getEvent()
MainGame.window.blit(self.textfont("敌方坦克剩余数量{0}".format(MainGame.enemytankcount)),(10,10))
MainGame.mytank.dispalygame()#这是把加载的图片一直显示,并不是一直加载
self.blitenemytank()
self.enemytankbulletdisplay()
self.mytankbulletdisplay()
if not MainGame.mytank.stop:
MainGame.mytank.move()
pygame.display.update()
def enemytankbulletdisplay(self):
for enemytankbullet in MainGame.enemytankbulletlist:
if enemytankbullet.bulletcount:
enemytankbullet.displayBullet()
enemytankbullet.move()
else:
MainGame.enemytankbulletlist.remove(enemytankbullet)
def mytankbulletdisplay(self):
for mytankbullet in MainGame.mytankbulletlist:
if mytankbullet.bulletcount:
mytankbullet.displayBullet()
mytankbullet.move()
print("你大爷的")
mytankbullet.mybullet_hit_enemytank()
else: #bulletcount为False的时候,是子弹走到边界的时候,这子弹都是相对单个,不是列表里的所有
MainGame.mytankbulletlist.remove(mytankbullet)
def createenemytank(self):
top = 100
for i in range(MainGame.enemytankcount):
left = random.randint(50, 600)
speed = random.randint(1, 3)
enemytank1=EnemyTank(left,top,speed)
MainGame.enemytanklist.append(enemytank1)
def blitenemytank(self):
for enemytank in MainGame.enemytanklist:#遍历生成敌方坦克
if enemytank.live:
enemytank.dispalygame()
enemytank.randmove()
enemytankbullet = enemytank.shot() # 遍历生成的所有坦克发射子弹,shot()返回了个Bullet(),所以相应的也生成了子弹
if enemytankbullet: # 返回的不是None的才可以加入列表,要不然报错的
MainGame.enemytankbulletlist.append(enemytankbullet)
else:
MainGame.enemytanklist.remove(enemytank)
#结束游戏
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.KEYUP:
if event.key==pygame.K_LEFT or event.key==pygame.K_RIGHT or event.key==pygame.K_UP or event.key==pygame.K_DOWN:
MainGame.mytank.stop=True
if event.type==pygame.KEYDOWN:#表示按下的是键盘按键
if event.key==pygame.K_LEFT:
MainGame.mytank.direction = "L"
MainGame.mytank.stop=False
# MainGame.mytank.move()
print('按下左键,坦克向左移动')
elif event.key==pygame.K_RIGHT:
MainGame.mytank.direction="R"
MainGame.mytank.stop = False
#MainGame.mytank.move()
print('按下右键,坦克向右移动')
elif event.key==pygame.K_UP:
print("按下上键,坦克向上移动")
MainGame.mytank.direction="U"
MainGame.mytank.stop = False
# MainGame.mytank.move()
elif event.key==pygame.K_DOWN:
print("按下下键,坦克向下移动")
MainGame.mytank.direction="D"
MainGame.mytank.stop = False
#MainGame.mytank.move()
elif event.key==pygame.K_SPACE:
if len(MainGame.mytankbulletlist)<4:
print("发射子弹")
mytankbullet=Bullet(MainGame.mytank)
MainGame.mytankbulletlist.append(mytankbullet)
def textfont(self,text):
pygame.font.init()
font=pygame.font.SysFont('kaiti',18)#创建字体对象
text_win=font.render(text,True,text_color)
return text_win
class Tank(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="L"
self.image=self.images[self.direction]
self.rect=self.image.get_rect()#获取图片区域
self.rect.left=left
self.rect.top=top
self.speed=5
self.stop=True
self.live=True
#射击
def shot(self):
pass
#移动
def move(self):
if 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 == "L":
if self.rect.left>0:
self.rect.left -= self.speed
elif self.direction == "R":
if self.rect.left+self.rect.height<screen_width:
self.rect.left += self.speed
#加载坦克的方法
def dispalygame(self):
self.image=self.images[self.direction]
MainGame.window.blit(self.image,self.rect)
#我方坦克
class MyTank(Tank):
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("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.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.stop=True
self.step=60
def randdirection(self):
num=random.randint(1,4)#生成四个随机数,将这四个随机书与方向字典的建关联,则方向也就随机了
if num==1:
return "U"
elif num==2:
return "D"
elif num==3:
return "L"
elif num==4:
return "R"
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<5:
return Bullet(self) #因为是随机生成的数。所有如果不是大于5的数,则返回的是None
class Bullet(BaseItem):
def __init__(self,tank):
self.direction=tank.direction
self.speed=6
self.image=pygame.image.load("img/enemymissile.gif")
self.rect=self.image.get_rect()
self.bulletcount=True
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.height
elif self.direction == 'D':
self.rect.left = tank.rect.left + tank.rect.width / 2 - self.rect.width / 2
self.rect.top = tank.rect.top + tank.rect.height
elif self.direction == 'L':
self.rect.left = tank.rect.left - self.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
def move(self):
if self.direction=="U":
if self.rect.top>0:
self.rect.top-=self.speed
else:
# 这就是子弹走到边界的时候,将bulletcount置为False,也就是说bulletcount为False的时候,是子弹走到边界的时候
self.bulletcount=False
elif self.direction=="D":
if self.rect.top+self.rect.height<screen_height:
self.rect.top+=self.speed
else:
self.bulletcount = False
elif self.direction=="L":
if self.rect.left>0:
self.rect.left-=self.speed
else:
self.bulletcount = False
elif self.direction=="R":
if self.rect.left+self.rect.width<screen_width:
self.rect.left+=self.speed
else:
self.bulletcount = False
def mybullet_hit_enemytank(self):
for enemytank in MainGame.enemytankbulletlist:#这个敌方坦克列表存放的是敌方坦克。所以遍历敌方坦克就是所有的敌方坦克
#生成的这个坦克也就是敌方的坦克,
if pygame.sprite.collide_rect(enemytank,self):
#修改敌方坦克和我方子弹的状态,即修改成消失的状态
enemytank.live=False
self.bulletcount=False
#展示子弹的方法
def displayBullet(self):
MainGame.window.blit(self.image,self.rect)
class Wall():
def __init__(self):
pass
#展示墙壁的方法
def displayWall(self):
pass
#展示效果
class Explode():
def __init__(self):
pass
#展示爆炸效果的方法
def displayExplode(self):
pass
class Music():
def __init__(self):
pass
#播放音乐的方法
def displayMusic(self):
pass
if __name__=="__main__":
MainGame().startgame()