import pygame,time,random
BG_COLOR = pygame.Color(0,0,0) # (0,0,0)表示黑色
COLOR_text = pygame.Color(255,0,0) #文字颜色
SCREEN_HEIGHT = 500
SCREEN_WIDTH = 800
class MainGame(): #主类
window = None
TANK_P1 = None # 在window这个对象上搭建窗口,还没有开始的时候,window没有窗口,开始的时候坦克也不在窗口上
enemyTankList = [] # 创建存储敌方坦克的列表,因为是多个敌方坦克
enemyTankCount = 5 # 定义敌方坦克的数量
def __init__(self):
pass
def startGame(self): # 开始游戏
pygame.display.init() # 初始化窗口,加载主窗口
MainGame.window = pygame.display.set_mode([SCREEN_WIDTH,SCREEN_HEIGHT])
# 设置窗口的大小及显示
pygame.display.set_caption("坦克大战") # 设置一下游戏标题
MainGame.TANK_P1 = Tank(400, 300) # 初始化我们的坦克,距离左边400,距离上面300
while True:
# 让坦克慢一点,就是让循环慢一点
time.sleep(0.02)
pygame.display.update() # 让窗口持续刷新操作,一直显示
self.getEvent() # 调用这个可以关闭的程序
MainGame.window.fill(BG_COLOR) # 主窗口的背景色为黑色
MainGame.window.blit(self.getTextSurface("剩余敌方坦克%d辆"%6),(5,5))
# 在开始游戏方法中调用添加提示文字方法,%是给一个数字,(5,5)是在主窗口的位置
MainGame.TANK_P1.displayTank() # 将我方坦克加入到窗口中
self.blitEnemyTank() # 将敌方坦克加入到窗口中,一直调用这个方法
#进入循环,让坦克一直按键就一直走,如果坦克的开关是开启,才可以移动
if not MainGame.TANK_P1.stop:
MainGame.TANK_P1.move()
def creatEnemyTank(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:
enemyTank.displayTank()
def endGame(self): #结束游戏a
print("游戏结束,感谢使用")
exit()
def getTextSurface(self, text): #左上角文字绘制的功能
pygame.font.init() # 初始化字体模块
font = pygame.font.SysFont("kaiti",18)
# 选中一个合适的字体:18号大的楷体
textSurface = font.render(text,True,COLOR_text)
return textSurface
# 使用对应的字符完成相关内容的绘制,并返回这个文字
# 就是把这个文字框放在这个大的窗口上面
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.TANK_P1.direction="L"
MainGame.TANK_P1.stop = False
#MainGame.TANK_P1.move()
print('按下左键,坦克向左移动')
elif event.key == pygame.K_RIGHT:
MainGame.TANK_P1.direction = "R"
MainGame.TANK_P1.stop = False
#MainGame.TANK_P1.move()
print('按下右键,坦克向右移动')
elif event.key == pygame.K_UP:
MainGame.TANK_P1.direction = "U"
MainGame.TANK_P1.stop = False
#MainGame.TANK_P1.move()
print('按下上键,坦克向上移动')
elif event.key == pygame.K_DOWN:
MainGame.TANK_P1.direction = "D"
MainGame.TANK_P1.stop = False
#MainGame.TANK_P1.move()
print('按下下键,坦克向下移动')
elif event.key == pygame.K_SPACE:
print("发射子弹")
# 松开方向键,坦克停止移动,停止状态为真
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.TANK_P1.stop = True
class Tank(): # 坦克类
def __init__(self,left,top):
# 添加距离左边left,距离上边top
self.images = { 'U': pygame.image.load('图片/TU2/p1tankU.gif'),
'D': pygame.image.load('图片/TU2/p1tankD.gif'),
'L': pygame.image.load('图片/TU2/p1tankL.gif'),
'R': pygame.image.load('图片/TU2/p1tankR.gif') }
self.direction = 'U' # 默认的图片是朝上的图片
# 根据当前图片的方向获取图片
self.image =self.images[self.direction]
# 我们当前图片所在获取区域
self.rect=self.image.get_rect()
# 指定坦克初始化位置 分别距x,y轴的位置
self.rect.left = left
self.rect.top = top
# 速度:决定移动的快慢
self.speed = 5
#坦克移动的开关
self.stop = True
def move(self): #移动
#判断坦克方向来进行移动
if self.direction=="L":
if self.rect.left > 0:
self.rect.left -= self.speed
elif self.direction=="U":
# 不能无限移动下去,到达边界的时候要停下,即坐标距离变为0
if self.rect.top>0:
self.rect.top -= self.speed
elif self.direction=="D":
if self.rect.top+self.rect.width<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): #射击
pass
def displayTank(self): #展示坦克的方法
# 展示坦克(将坦克这个surface绘制到窗口中 blit())
self.image = self.images[self.direction] # 获取展示的对象
MainGame.window.blit(self.image,self.rect) # 调用blit展示
class MyTank(Tank): #我方坦克,继承坦克类
def __init__(self):
pass
class EnemyTank(Tank): #敌方坦克,继承坦克类
def __init__(self,left,top,speed):
self.images = {'U': pygame.image.load('图片/TU2/enemy1U.gif'),
'D': pygame.image.load('图片/TU2/enemy1D.gif'),
'L': pygame.image.load('图片/TU2/enemy1L.gif'),
'R': pygame.image.load('图片/TU2/enemy1R.gif')}
self.direction = self.randDirection() # 默认的图片是随机的方向
# 根据当前方向获取图片
self.image = self.images[self.direction]
# 我们当前图片所在获取区域
self.rect = self.image.get_rect()
# 指定坦克初始化位置 分别距x,y轴的位置
self.rect.left = left
self.rect.top = top
# 速度:决定移动的快慢,# 新增速度属性,和
self.speed = speed
# 坦克移动的开关
self.stop = True
def randDirection (self): # 生成随机的四个方向
num = random.randint(1,4) # 随机生成1-4的数
if num == 1:
return "U"
elif num == 2:
return "D"
elif num == 3:
return "L"
elif num == 4:
return "D"
class Wall (): #墙壁类
def __init__(self):
pass
def displayWall(self): #展示墙壁
pass
class Explode(): #爆炸类
def __init__(self):
pass
def displayExolode(self): #展示爆炸效果
pass
class Music(): #音乐类
def __init__(self):
pass
def play(self): #开始播放音乐
pass
class Bullet(): #子弹类
def __init__(self):
pass
def bulletMove(self): #子弹的移动方法
pass
def displayBullet(self): #展示子弹的方法
pass
def hitEnemyTank(self): #我方子弹碰撞敌方坦克的方法
pass
def hitMyTank(self): #敌方子弹碰撞我方坦克的方法
pass
def hitWalls(self): #子弹与墙壁的碰撞
pass
if __name__ == '__main__':
MainGame().startGame()
为什么我只显示了我方的坦克,敌方的坦克无法显示
