"""
敌方坦克发射子弹
"""
from re import M
from tkinter import N
from unittest import TextTestResult
import pygame,time,random
#定义常量
SCREEN_WIDTH = 700
SCREEN_HEIGHT = 500
BG_COLOR = pygame.Color(0,0,0)
TEXT_COLOR = pygame.Color(255,0,0)
class MainGame():
myTank = None
window = None
enemyCount = 5
enemyList = []
#定义我方坦克发射的子弹列表
myBulletList = []
#定义敌方坦克发射子弹的列表
enemyBulletList = []
#初始化方法
def __init__(self) -> None:
pass
#创建敌方坦克
def createEnemyTank(self):
top = 100
for i in range(MainGame.enemyCount):
left = random.randint(0,600)
speed = random.randint(1,4)
enemyTank = EnemyTank(left,top,speed)
#添加到列表
MainGame.enemyBulletList.append(enemyTank)
#加载敌方坦克
def displayEnemyTank(self):
for enemyTank in MainGame.enemyList:
enemyTank.displayTank()
#调用move移动
enemyTank.randMove()
#初始化敌方坦克子弹
enemyBullet = enemyTank.shot()
MainGame.enemyBulletList.append(enemyBullet)
#显示我方坦克发射的子弹
def displayMyBullet(self):
for myBullet in MainGame.myBulletList:
#判断子弹是否存活
if myBullet.live :
myBullet.displayBullet()
#调用子弹的移动方法
myBullet.move()
else:
#从子弹列表里删除
MainGame.myBulletList.remove(myBullet)
#显示敌方坦克发射的子弹
def displayEnemyBullet(self):
for enemyBullet in MainGame.enemyBulletList:
#判断子弹是否存活
if enemyBullet.live:
enemyBullet.displayBullet()
#调用子弹的移动方法
enemyBullet.move()
else:
#让子弹从列表删除
MainGame.enemyBulletList.remove(enemyBullet)
#开始游戏
def startGame(self):
#初始化窗口
pygame.display.init()
#设置窗口大小
MainGame.window = pygame.display.set_mode((SCREEN_WIDTH,SCREEN_HEIGHT))
#设置窗口的标题
pygame.display.set_caption("坦克大战1.05")
#初始化我方坦克
MainGame.myTank = Tank(350,250)
#调用敌方坦克
self.createEnemyTank()
while True:
time.sleep(0.02)
#给窗口设置填充色
MainGame.window.fill(BG_COLOR)
#添加文字信息提示
textSurface = self.getTextSurface("敌方坦克剩余数量%d"%5)
#主窗口显示文字信息
MainGame.window.blit(textSurface,(10,10))
#添加事件监听
self.getEvent()
#调用坦克的显示方法
MainGame.myTank.displayTank()
#调用坦克移动方法
if not MainGame.myTank.stop:
MainGame.myTank.move()
#调用敌方坦克方法
self.displayEnemyTank()
#加载我方坦克的子弹
self.displayMyBullet()
#加载敌方坦克的子弹
self.displayEnemyBullet()
pygame.display.update()
#结束游戏
def endGame(self):
print("谢谢使用,欢迎下次游戏")
exit()
#添加文字信息提示
def getTextSurface(self,text):
#初始化字体模块
pygame.font.init()
#获取字体对象
font = pygame.font.SysFont("kaiti",18)
#绘制文字信息
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.endGame()
#判断是否是键盘事件
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("发射子弹")
#如果子弹列表的数量小于3,可以初始化子弹
if len(MainGame.myBulletList)<3:
#初始化子弹
myBullet = Bullet(MainGame.myTank)
MainGame.myBulletList.append(myBullet)
#判断键盘是否松开
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
class Tank():
def __init__(self,left,top) -> None:
#保存加载的图片
self.images = {
"U":pygame.image.load("F:\坦克大战\img\p1tankU.gif"),
"D":pygame.image.load("F:\坦克大战\img\p1tankD.gif"),
"L":pygame.image.load("F:\坦克大战\img\p1tankL.gif"),
"R":pygame.image.load("F:\坦克大战\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 = 2
#坦克移动开关
self.stop = True
#展示坦克方法
def displayTank(self):
self.image = self.images.get(self.direction)
#调用blit方法展示坦克
MainGame.window.blit(self.image,self.rect)
#移动坦克
def move(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
#我方坦克
class MyTank(Tank):
#初始化方法
def __init__(self) -> None:
pass
#敌方坦克
class EnemyTank(Tank):
def __init__(self,left,top,speed) -> None:
#加载保存的图片集
self.images= {
"U":pygame.image.load("F:\坦克大战\img\enemy1U.gif"),
"D":pygame.image.load("F:\坦克大战\img\enemy1D.gif"),
"L":pygame.image.load("F:\坦克大战\img\enemy1L.gif"),
"R":pygame.image.load("F:\坦克大战\img\enemy1R.gif"),
}
#设置敌方坦克方向
self.direction = self.randDirection()
#根据方向获取图片
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 = speed
#步数
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):
return Bullet(self)
#子弹类
class Bullet():
def __init__(self,tank) -> None:
#加载图片
self.image = pygame.image.load('F:\坦克大战\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-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
#子弹的速度
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 == 'D':
if self.rect.top + self.rect.height < SCREEN_HEIGHT:
self.rect.top += 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 == 'R':
if self.rect.left + self.rect.width < SCREEN_WIDTH:
self.rect.left += self.speed
else:
self.live = False
#墙壁类
class Wall():
def __init__(self) -> None:
pass
#展示墙壁方法
def displayWall(self):
pass
#爆炸效果类
class Explode():
def __init__(self) -> None:
pass
#展示爆炸效果
def displayExplode(self):
pass
#音效类
class Music():
def __init__(self) -> None:
pass
#播放音乐
def playMusic(self):
pass
#主方法
if __name__ == '__main__':
#调用主类中的startGame()
MainGame().startGame()