python实现坦克大战
立即下载
资源介绍:
python写的坦克大战,有点地方不太完善
import pygame
import time
import random
import warnings
# 图片颜色配置有问题的警告,通过1.py中的方法将图片ICC配置进行删除
warnings.filterwarnings("ignore", message="iCCP: known incorrect sRGB profile")
class MainGame():
# 游戏主窗口
window = None
SCREEN_WIDTH = 800
SCREEN_HEIGHT = 500
# 创建我方坦克
TANK_P1 = None
# 存储所有敌方坦克
EnemyTank_list = []
# 创建敌方坦克的数量
EnemyTank_count = 5
# 存储我方子弹的列表
Bullet_list = []
# 存储敌方子弹的列表
Enemy_bullet_list = []
# 爆炸效果列表
Explode_list = []
# 墙壁列表
Wall_list = []
# 开始游戏方法
def startGame(self):
pygame.display.init()
# 创建窗口加载函数
MainGame.window = pygame.display.set_mode([MainGame.SCREEN_WIDTH,MainGame.SCREEN_HEIGHT])
self.createMyTank()
# 创建我方坦克
# MainGame.TANK_P1 = Tank(400,300)
# 创建敌方坦克
self.createEnemyTank()
self.createWalls()
# 设置一下游戏标题
pygame.display.set_caption("坦克大战")
# 让窗口持续刷新操作
while True:
MainGame.window.fill(pygame.Color(0,0,0))
# 在循环中完成事件的获取
self.getEvent()
# 将绘制文字得到的小画布,粘贴到窗口中
MainGame.window.blit(self.getTextSurface("剩余地方坦克%d辆"%len(MainGame.EnemyTank_list)),(5,5))
# 展示墙壁
self.blitWalls()
# 将我方坦克加入到窗口中
if MainGame.TANK_P1 and MainGame.TANK_P1.live:
MainGame.TANK_P1.displayTank()
else:
del MainGame.TANK_P1
MainGame.TANK_P1 = None
# 循环展示敌方坦克
self.blitEnemyTank()
# 根据坦克的开关调用坦克的移动方法
if MainGame.TANK_P1 and not MainGame.TANK_P1.stop:
MainGame.TANK_P1.move()
MainGame.TANK_P1.hitWalls()
MainGame.TANK_P1.hitEnemyTank()
# 调用渲染我方子弹列表的方法
self.blitBullet()
# 调用渲染我方子弹列表的方法
self.blitEnemyBullet()
# 调用爆炸效果方法
self.displayExplode()
# 给窗口完成一个填充颜色
time.sleep(0.02)
pygame.display.update()
# 创建敌方坦克
def createEnemyTank(self):
top = 100
for i in range(MainGame.EnemyTank_count):
speed = random.randint(3, 6)
left = random.randint(1, 7)
eTank = EnemyTank(left*100,top,speed)
MainGame.EnemyTank_list.append(eTank)
def createMyTank(self):
MainGame.TANK_P1 = MyTank(400, 300)
# 创建音乐对象
music = Music("tank/start.wav")
# 调用播放方法
music.play()
def createWalls(self):
for i in range(1,7):
wall = Wall(120*i,240)
MainGame.Wall_list.append(wall)
def blitWalls(self):
for wall in MainGame.Wall_list:
if wall.live:
wall.displayWall()
else:
MainGame.Wall_list.remove(wall)
# 将敌方坦克加入到窗口中
def blitEnemyTank(self):
for eTank in MainGame.EnemyTank_list:
if eTank.live:
eTank.displayTank()
eTank.randMove()
eTank.hitWalls()
# 调用敌方坦克是否碰撞我方坦克的方法
eTank.hitMyTank()
# 调用敌方坦克的射击方法
eBullet = eTank.shot()
# 如果子弹为None,不加入到列表
if eBullet:
# 将子弹加载到敌方子弹列表
MainGame.Enemy_bullet_list.append(eBullet)
else:
MainGame.EnemyTank_list.remove(eTank)
# 将我方子弹渲染到窗口中
def blitBullet(self):
for bullet in MainGame.Bullet_list:
if bullet.live:
bullet.displayBullet()
# 让子弹移动
bullet.bulletMove()
# 调用我方子弹与敌方坦克的碰撞方法
bullet.hitEnemyTank()
# 调用判断子弹是否与墙壁发生碰撞
bullet.hitWalls()
else:
MainGame.Bullet_list.remove(bullet)
# 将敌方子弹加入到窗口中
def blitEnemyBullet(self):
for eBullet in MainGame.Enemy_bullet_list:
if eBullet.live:
eBullet.displayBullet()
# 让子弹移动
eBullet.bulletMove()
# 调用判断子弹是否与墙壁发生碰撞
eBullet.hitWalls()
if MainGame.TANK_P1 and MainGame.TANK_P1.live:
eBullet.hitMyTank()
else:
MainGame.Enemy_bullet_list.remove(eBullet)
# 展示爆炸效果列表
def displayExplode(self):
for explode in MainGame.Explode_list:
if explode.live:
explode.displayExplode()
music = Music("tank/bang.wav")
music.play()
else:
MainGame.Explode_list.remove(explode)
# 获取程序运行期间所有的事件
def getEvent(self):
# 1.获取所有事件
eventList = pygame.event.get()
# 2. 对事件进行判断处理
for event in eventList:
# 判断event.type 是否为QUIT,如果退出的话,直接条用成簇结束方法
if event.type == pygame.QUIT:
self.endGame()
# 判断事件类型是否为按键按下,如果是,继续判断按键是哪一个
if event.type == pygame.KEYDOWN:
# 点击ESC按键让我方坦克重生
if event.key == pygame.K_ESCAPE and not MainGame.TANK_P1:
# 调用创建MyTank函数
self.createMyTank()
if MainGame.TANK_P1 and MainGame.TANK_P1.live:
# 具体是哪一个按键的处理
if event.key == pygame.K_LEFT:
print("坦克向左调头,移动")
# 修改坦克方向
MainGame.TANK_P1.direction = 'L'
MainGame.TANK_P1.stop = False
elif event.key == pygame.K_RIGHT:
print("坦克向右调头,移动")
# 修改坦克方向
MainGame.TANK_P1.direction = 'R'
MainGame.TANK_P1.stop = False
elif event.key == pygame.K_UP:
print("坦克向上调头,移动")
# 修改坦克方向
MainGame.TANK_P1.direction = 'U'
MainGame.TANK_P1.stop = False
elif event.key == pygame.K_DOWN:
print("坦克向下调头,移动")
# 修改坦克方向
MainGame.TANK_P1.direction = 'D'
MainGame.TANK_P1.stop = False
elif event.key == pygame.K_SPACE:
print("发射子弹")
if len(MainGame.Bullet_list) < 3:
# 产生一颗子弹
m = Bullet(MainGame.TANK_P1)
# 将子弹加入到子弹列表
MainGame