求各位大佬看看坦克大战的代码哪错了
#encoding=gbk
import pygame
import time
import random
SCREEN_WIDTH=1000
SCREEN_HEIGHT=750
BG_COLOR=pygame.Color(0,0,0)#背景颜色
TEXT_COLOR=pygame.Color(255,0,0)#字体颜色
class Tank(object):
'''该类会显示坦克的移动,进攻,显示和摧毁'''
def __init__(self,left,top):
#保存加载图片
self.images={
'U':pygame.image.load("D:\BaiduNetdiskDownload\源码\坦克大战\img\p1tankU.gif"),
'D':pygame.image.load("D:\BaiduNetdiskDownload\源码\坦克大战\img\p1tankD.gif"),
'L':pygame.image.load("D:\BaiduNetdiskDownload\源码\坦克大战\img\p1tankL.gif"),
'R':pygame.image.load("D:\BaiduNetdiskDownload\源码\坦克大战\img\p1tankR.gif"),
}
#设置坦克方向
self.direction='U'
#获取加载图片
self.image=self.images.get(self.direction)
#获取矩形区域
self.rect=self.image.get_rect()
#设置图片left和top
self.rect.left=left
self.rect.top=top
self.speed=1
#是否停止
self.stop=True
def disTank(self):
self.image=self.images.get(self.direction)
#调用blit方法展示坦克
MainGame.window.blit(self.image,self.rect)
def moveTank(self):
if 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
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
def destoryTank(self):
pass
def shot(self):
pass
class MyBullet(object):
'''子弹动画,飞行,命中'''
def __init__(self,tank):
self.image=pygame.image.load("D:\BaiduNetdiskDownload\源码\坦克大战\img\enemymissile.gif")
#子弹方向
self.direction=tank.direction
#获取图片区域
self.rect=self.image.get_rect()
#设置left,top
if self .direction=="U":
self.rect.left=tank.rect.left+(tank.rect.width)/2-(self.rect.width)/2
self.rect.top=tank.rect.top+tank.rect.height+self.rect.height
if 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.height
if self.direction=="L":
self.rect.left=tank.rect.left+tank.rect.width+self.rect.width
self.rect.top=tank.rect.top+(tank.rect.height)/2-(self.rect.height)/2
if self.direction=="R":
self.rect.left=tank.rect.left-self.rect.width
self.rect.top=tank.rect.top+(tank.rect.height)/2-(self.rect.height)/2
#子弹速度
self.speed=10
self.live=True
def disMyBullet(self):
#将图片加载到窗口
MainGame.window.blit(self.image,self.rect)
def moveBullet(self):
if self.direction=="U":
if self.rect.top+self.rect.height<=SCREEN_HEIGHT:
self.rect.top+=self.speed
else:#碰到墙壁
self.live=False
elif self.direction=="D":
if self.rect.top>=0:
self.rect.top-=self.speed
else:#碰到墙壁
self.live=False
elif self.direction=="L":
if self.rect.left+self.rect.width<=SCREEN_WIDTH:
self.rect.left+=self.speed
else:#碰到墙壁
self.live=False
elif self.direction=="R":
if self.rect.left>=0:
self.rect.left-=self.speed
else:#碰到墙壁
self.live=False
class EnemyBullet():
'''子弹动画,飞行,命中'''
def __init__(self,tank):
self.image=pygame.image.load("D:\BaiduNetdiskDownload\源码\坦克大战\img\enemymissile.gif")
#子弹方向
self.direction=tank.direction
#获取图片区域
self.rect=self.image.get_rect()
#设置left,top
if 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+self.rect.height
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
if self.direction=="R":
self.rect.left=tank.rect.left+tank.rect.width+self.rect.width
self.rect.top=tank.rect.top+(tank.rect.height)/2-(self.rect.height)/2
if self.direction=="L":
self.rect.left=tank.rect.left-self.rect.width
self.rect.top=tank.rect.top+(tank.rect.height)/2-(self.rect.height)/2
#子弹速度
self.speed=10
self.live=True
def disEnemyBullet(self):
#将图片加载到窗口
MainGame.window.blit(self.image,self.rect)
def moveBullet(self):
if self.direction=="D":
if self.rect.top+self.rect.height<=SCREEN_HEIGHT:
self.rect.top+=self.speed
else:#碰到墙壁
self.live=False
elif 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
class Wall(object):
'''墙体摧毁,障碍'''
def __init__(self) -> None:
pass
def disWall(self):
pass
def destoryWall(self):
pass
def stopWall(self):#墙壁阻挡
pass
class Music(object):
'''发射,爆炸等音效'''
def __init__(self) -> None:
pass
def backMusic(self):
pass
def boomMusic(self):
pass
class Boom(object):
'''爆炸效果'''
def __init__(self) -> None:
pass
def disBoom(self):
pass
class MainGame:
'''开始,结束,模式转换'''
window=None
myTank=None
enemyCount=1
enemyList=[]
myBulletList=[]
enemyBullentList=[]
def __init__(self) -> None:
pass
#创建敌方坦克
def createEnemyTank(self):
for i in range(MainGame.enemyCount):
left=random.randint(0,1000)
speed=random.randint(1,9)
top=random.randint(0,50)
enemyTank=EnemyTank(left,top,speed)
#添加到列表
MainGame.enemyList.append(enemyTank)
#加载敌方坦克
def disEnemyTank(self):
for enemyTank in MainGame.enemyList:
#调用moveTank进行移动
enemyTank.randMove()
#展示敌方坦克
enemyTank.disTank()
#初始化敌方坦克发射的子弹
enemyBullent=enemyTank.shot()
MainGame.enemyBullentList.append(enemyBullent)
#显示敌方子弹
def disEnemyBullet(self):
for enemyBullet in MainGame.enemyBullentList:
if enemyBullet.live:
enemyBullet.disEnemyBullet()
enemyBullet.moveBullet()
else:
MainGame.enemyBullentList.remove(enemyBullet)
#显示我方子弹
def disMyBullet(self):
for myBullet in MainGame.myBulletList:
#判断子弹是否存活
if myBullet.live:
myBullet.disMyBullet()
myBullet.moveBullet()
else:
MainGame.myBulletList.remove(myBullet)
def startgame(self):
pygame.init()
MainGame.window=pygame.display.set_mode((SCREEN_WIDTH,SCREEN_HEIGHT))
pygame.display.set_caption("变态的坦克大战")
MainGame.myTank=Tank(0,0)
self.createEnemyTank()
while True:
time.sleep(0.005)
MainGame.window.fill(BG_COLOR)
#文字提示信息
textSurface=self.getTextSurface("敌方坦克剩余数量%d"%100)
#主窗口显示文字信息
MainGame.window.blit(textSurface,(6,6))
#关闭游戏事件监听
self.getEvent()
#调用坦克显示方法
MainGame.myTank.disTank()
if not MainGame.myTank.stop:
MainGame.myTank.moveTank()
#加载敌方坦克
self.disEnemyTank()
#加载我方子弹
self.disMyBullet()
#加载敌方子弹
self.disEnemyBullet()
pygame.display.update()
def overgame(self):
print("关闭游戏")
exit()
#文字信息编辑
def getTextSurface(self,text):
#文字模块初始化
pygame.font.init()
#获取所有字体
#print(pygame.font.get_fonts())
#获取字体对象
font=pygame.font.SysFont("fangsong",20)
#绘制文字信息
textSurface=font.render(text,True,TEXT_COLOR)
return textSurface
#添加事件监听
def getEvent(self):
#获取所有事件
eventlist=pygame.event.get()
#遍历事件
for event in eventlist:
#关闭游戏
if event.type==pygame.QUIT:
self.overgame()
if event.type==pygame.KEYDOWN:
#上,下,左,右
if event.key==pygame.K_LEFT:
print("按下左键")
MainGame.myTank.direction='L'
MainGame.myTank.stop=False
elif event.key==pygame.K_RIGHT:
print("按下右键")
MainGame.myTank.direction='R'
MainGame.myTank.stop=False
elif event.key==pygame.K_UP:
print("按下上键")
MainGame.myTank.direction='U'
MainGame.myTank.stop=False
elif event.key==pygame.K_DOWN:
print("按下下键")
MainGame.myTank.direction='D'
MainGame.myTank.stop=False
elif event.key==pygame.K_SPACE:
print("发射子弹")
#判断子弹数量是否小于2
if len(MainGame.myBulletList)<2:
#初始化子弹
myBullet=(MainGame.myTank)
MainGame.myBulletList.append(myBullet)
if event.type==pygame.KEYUP:
if event.key == pygame.K_LEFT or event.key == pygame.K_UP or event.key == pygame.K_RIGHT or event.key == pygame.K_DOWN:
MainGame.myTank.stop=True
class MyTank(Tank):
def __init__(self) -> None:
super().__init__()
pass
class EnemyTank(Tank):
def __init__(self,left,top,speed):
self.images={
'U':pygame.image.load("D:\BaiduNetdiskDownload\源码\坦克大战\img\enemy1U.gif"),
'D':pygame.image.load("D:\BaiduNetdiskDownload\源码\坦克大战\img\enemy1D.gif"),
'L':pygame.image.load("D:\BaiduNetdiskDownload\源码\坦克大战\img\enemy1L.gif"),
'R':pygame.image.load("D:\BaiduNetdiskDownload\源码\坦克大战\img\enemy1R.gif"),
}
#设置敌方坦克方向
self.direction=self.randDirection()
#根据方向获取图片
self.image=self.images.get(self.direction)
#获取矩形区域
self.rect=self.image.get_rect()
#设置left,top,speed
self.rect.left=left
self.rect.top=top
self.speed=speed
self.step=60
#随机生成方向
def randDirection(self):
num=random.randint(1,4)
if num==1:
return"U"
if num==2:
return"D"
if num==3:
return"L"
if num==4:
return"R"
#随机移动敌方坦克
def randMove(self):
if self.step<=0:
#修改坦克方向
self.direction=self.randDirection()
#步数复位
self.step=30
else:
self.moveTank()
#步数递减
self.step-=1
def shot(self):
return EnemyBullet(self)
if __name__=="__main__":
MainGame().startgame()
#MainGame().getTextSurface("aa")