import random
import time
# 导入pygame模块
import pygame
from pygame.sprite import Sprite
# 窗口的大小
SCREEN_WIDTH = 1080
SCREEN_HEIGHT = 500
BG_COLOR = pygame.Color(0, 0, 0)
TEXT_COLOR = pygame.Color(255, 0, 0)
BULLET_COUNT = 3
# 所有音效路径
music_start_path = "src/start.wav"
music_end_path = "src/end.wav"
music_biu_path = "src/biu.wav"
music_fuhuo_path = "src/fuhuo.wav"
music_baozha_path = "src/baozha.wav"
# 定义一个基类
class BaseItem(Sprite):
def __init__(self, color, width, height):
pygame.sprite.Sprite.__init__(self)
# 主类
class MainGame():
window = None
my_tank = None
# 存储敌方坦克的列表
enemyTank = []
# 定义敌方坦克的数量
enemyTankNum = 3
# 存储我方子弹的列表
myBulletList = []
# 存储敌方子弹的列表
enemyBulletList = []
# 存储爆炸效果的列表
explodeList = []
# 墙壁列表
wallList = []
def __init__(self):
pass
# 游戏开始
def startGame(self):
# 加载主窗口
# 初始化窗口
pygame.display.init()
# 设置窗口的大小
MainGame.window = pygame.display.set_mode([SCREEN_WIDTH, SCREEN_HEIGHT])
# 初始化我方坦克
self.createMyTank()
# 初始化敌方坦克
self.createEnemyTank()
# 初始化墙壁
self.createWalls()
# 设置标题
pygame.display.set_caption('坦克大战1.01')
# 创建Music对象
music = Music(music_start_path)
# 播放
music.play()
while True:
time.sleep(0.05)
# 给窗口设置填充色
MainGame.window.fill(BG_COLOR)
# 获取事件
self.getEvent()
# 调用绘制文字事件
MainGame.window.blit(self.getTextSurface("敌方坦克剩余数量:%d" % len(MainGame.enemyTank)), (10, 10))
# 调用坦克的显示方法
if MainGame.my_tank and MainGame.my_tank.live:
MainGame.my_tank.displayTank()
else: # 删除我方坦克
del MainGame.my_tank
MainGame.my_tank = None
# 展示敌方坦克
self.blitEnemyTanlk()
# 循环便利显示我方坦克的子弹
self.blitMyBullet()
# 循环便利敌方子弹列表
self.blitEnemyBullet()
# 循环便利爆炸列表,展示
self.blitExplode()
# 循环显示墙壁
self.blitWall()
# 掉用移动
# 如果坦克的开关卡其才可以运动
if MainGame.my_tank and MainGame.my_tank.live:
if not MainGame.my_tank.stop:
MainGame.my_tank.move()
# 检测我方坦克是否与墙壁移动
MainGame.my_tank.hitWall()
# 检测我方坦克是否与敌方坦克碰撞
MainGame.my_tank.myTank_hit_enemyTank()
pygame.display.update()
# 判断游戏是否结束(敌方坦克没有)
if (len(MainGame.enemyTank) == 0):
Music(music_end_path).play()
time.sleep(3)
self.endGame()
# 游戏结束
def endGame(self):
print("谢谢使用,欢迎再次使用")
exit()
# 初始化墙壁
def createWalls(self):
for i in range(6):
wall = Wall(i * 200, 220)
# 将墙壁添加到列表
MainGame.wallList.append(wall)
# 循环便利爆炸列表,展示
def blitExplode(self):
for explode in MainGame.explodeList:
if explode.live:
# 展示
explode.displayExplode()
else:
# 在爆炸列表中移除
MainGame.explodeList.remove(explode)
# 循环便利敌方坦克
def blitEnemyTanlk(self):
for enemy in MainGame.enemyTank:
# 判断当前坦克是否活着
if enemy.live:
enemy.displayTank()
enemy.randMove()
enemy.hitWall()
# 检测敌方是否与我方坦克发生碰撞
if MainGame.my_tank and MainGame.my_tank.live:
enemy.enemyTank_hit_myTank()
# 发射子弹
enemyBullet = enemy.shot()
# 将敌方坦克存储到敌方子弹列表
if not enemyBullet == None:
MainGame.enemyBulletList.append(enemyBullet)
else:
MainGame.enemyTank.remove(enemy)
# 循环便利敌方坦克子弹
def blitEnemyBullet(self):
for enemyBullet in MainGame.enemyBulletList:
if enemyBullet.live: # 判断敌方子弹是否存活
enemyBullet.displayBullet()
enemyBullet.move()
# 调用敌方子单与我方坦克碰撞
enemyBullet.enemyBullet_hit_myTank()
# 检测敌方子弹是否与墙壁碰撞
enemyBullet.hitWall()
else:
MainGame.enemyBulletList.remove(enemyBullet)
# 循环便利我方坦克子弹
def blitMyBullet(self):
for bullet in MainGame.myBulletList:
# 判断当前子弹是否或者
if bullet.live:
bullet.displayBullet()
bullet.move()
# 调用我方子弹是否和敌方坦克碰撞
bullet.myBullet_hit_EnemyTank()
# 检测我方子弹是否与墙壁碰撞
bullet.hitWall()
else:
MainGame.myBulletList.remove(bullet)
# 循环便利墙壁列表
def blitWall(self):
for wall in MainGame.wallList:
if wall.live:
wall.displayWall()
else:
MainGame.wallList.remove(wall)
# 获取事件
def getEvent(self):
# 获取所有事件
eventList = pygame.event.get()
for event in eventList:
# 判断按下的键是关闭还是键盘
# 如果按的是推出
if event.type == pygame.QUIT:
self.endGame()
if event.type == pygame.KEYDOWN:
if not MainGame.my_tank:
# 判断是ESC,tank重生
if event.key == pygame.K_ESCAPE:
# 让坦克重生
self.createMyTank()
if MainGame.my_tank and MainGame.my_tank.live:
# 判断上下左右
if event.key == pygame.K_LEFT:
print("按下左键,坦克向左移动")
MainGame.my_tank.direction = 'L'
# 修改坦克开关状态
MainGame.my_tank.stop = False
# MainGame.my_tank.move()
elif event.key == pygame.K_RIGHT:
print("按下右键,坦克向右移动")
MainGame.my_tank.direction = 'R'
# 修改坦克开关状态
MainGame.my_tank.stop = False
# MainGame.my_tank.move()
elif event.key == pygame.K_UP:
print("按下上键,坦克向上移动")
MainGame.my_tank.direction = 'U'
# 修改坦克开关状态
MainGame.my_tank.stop = False
# MainGame.my_tank.move()
elif event.key == pygame.K_DOWN:
print("按下下键,坦克向下移�