# -*- coding: utf-8 -*-
# @Author : ZX
# @File : 坦克大战
# @Software: PyCharm
# @Date : 2024/4/27
# 导入模块
import pygame, time, random
from pygame.sprite import Sprite
SCREEN_WIDTH = 800 # 宽度
SCREEN_HEIGHT = 500 # 高度
BG_COLOR = pygame.Color(0, 0, 0) # 颜色
TEXT_COLOR = pygame.Color(255, 0, 0) # 字体颜色
class Baseitem(Sprite):
def __init__(self, color, width, height):
pygame.sprite.Sprite.__init__(self)
# 坦克类
class MainGame():
window = None
my_tank = None
enemyTankList = [] # 敌方坦克列表
enemyTankCount = 5 # 敌方坦克数量
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.createWall() # 初始化墙壁
# 窗口标题设置
pygame.display.set_caption('坦克大战')
while True:
time.sleep(0.02)
# 颜色填充
MainGame.window.fill(BG_COLOR)
# 获取事件
self.getEvent()
# 绘制文字
MainGame.window.blit(self.getTextSuface('敌方坦克剩余数量%d' % len(MainGame.enemyTankList)), (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.blitEnemyTank() # 展示敌方坦克
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()
def blitWall(self):
for wall in MainGame.WallList:
if wall.live:
wall.displayWall()
else:
MainGame.WallList.remove(wall)
def createWall(self): # 初始化墙壁
for i in range(6):
wall = Wall(i * 145, 220)
MainGame.WallList.append(wall)
def createMytank(self): # 初始化我方坦克
MainGame.my_tank = MyTank(350, 300)
music = Music('img/start.wav') # 创建音乐对象
music.play() # 播放音乐
def createEnemyTank(self): # 初始化敌方坦克, 将敌方坦克添加到列表中
top = 100
for i in range(self.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:
if enemyTank.live: # 判断敌方坦克状态
enemyTank.displayTank()
enemyTank.randMove() # 调用子弹移动
enemyTank.hitWall()
if MainGame.my_tank and MainGame.my_tank.live:
enemyTank.enemyTank_hit_myTank()
enemyBullet = enemyTank.shot() # 敌方坦克射击
if enemyBullet: # 判断敌方坦克子弹是否为None
MainGame.enemyBulletList.append(enemyBullet) # 存储敌方坦克子弹
else:
MainGame.enemyTankList.remove(enemyTank)
def blitExplode(self):
for expolde in MainGame.explodeList:
if expolde.live:
expolde.displayExplode()
else:
MainGame.explodeList.remove(expolde)
def blitMyBullet(self): # 循环我方子弹列表, 并展示
for myBullet in MainGame.myBulletList:
if myBullet.live: # 判断子弹的状态
myBullet.displayBullet()
myBullet.move()
myBullet.myBullet_hit_enemyTank()
myBullet.hitWall() # 检测我方坦克子弹是否碰撞
else:
MainGame.myBulletList.remove(myBullet)
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 endGame(self):
print('游戏结束')
exit() # 退出游戏
# 文字显示
def getTextSuface(self, text):
pygame.font.init() # 字体初始化
font = pygame.font.SysFont('kaiti', 16)
# 绘制文字信息
textSurface = font.render(text, True, TEXT_COLOR)
return textSurface
# 事件获取
def getEvent(self):
# 获取所有事件
for event in pygame.event.get():
if event.type == pygame.QUIT:
# 退出游戏
self.endGame()
# 键盘按键
if event.type == pygame.KEYDOWN:
if not MainGame.my_tank: # 当我方坦克不存在时, 按下Esc键重生
if event.key == pygame.K_ESCAPE:
self.createMytank()
if MainGame.my_tank and MainGame.my_tank.live:
# 上、下、左、右键的判断
if event.key == pygame.K_LEFT:
MainGame.my_tank.direction = 'L'
MainGame.my_tank.stop = False
print('左键, 坦克向左移动')
elif event.key == pygame.K_RIGHT:
MainGame.my_tank.direction = 'R'
MainGame.my_tank.stop = False
print('右键, 坦克向右移动')
elif event.key == pygame.K_UP:
MainGame.my_tank.direction = 'U'
MainGame.my_tank.stop = False
print('上键, 坦克向上移动')
elif event.key == pygame.K_DOWN:
MainGame.my_tank.direction = 'D'
MainGame.my_tank.stop = False
print('下键, 坦克向下移动')
elif event.key == pygame.K_SPACE:
print('发射子弹')
if len(MainGame.myBulletList) < 3: # 可以同时发射子弹数量的上限
myBullet = Bullet(MainGame.my_tank)
MainGame.myBulletList.append(myBullet)
music = Music('img/fire.wav')
music.play()
# 松开键盘, 坦克停止移动
if event.type == pygame.KEYUP:
# 只有松开上、下、左、右键时坦克才停止, 松开空格键坦克不停止
if event.key == pygame.K_UP or event.key == pygame.K_DOWN or event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT:
if MainGame.my_tank and MainGame.my_tank.live:
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
《坦克大战》是由 Namco 游戏公司开发的一款平面射击游戏,于 1985 年发售。游戏以坦克战斗及保卫基地为主题,属于策略型联机类。同时也是 FC 平台上少有的内建关卡编辑器的几个游戏之一,玩家可自己创建独特的关卡,并通过获取一些道具使坦克和基地得到强化。它看似简单但变化无穷,令人上瘾。本节将介绍使用“Python+Pygame”开发一个简单坦克大战游戏
资源推荐
资源详情
资源评论
收起资源包目录
坦克大战游戏.zip (19个子文件)
坦克大战游戏
img
p1tankU.gif 3KB
blast2.gif 3KB
p1tankL.gif 4KB
enemy1D.gif 4KB
fire.wav 68KB
blast0.gif 744B
blast1.gif 2KB
enemymissile.gif 377B
p1tankR.gif 4KB
start.wav 863KB
hit.wav 23KB
enemy1R.gif 4KB
blast4.gif 6KB
enemy1L.gif 4KB
blast3.gif 4KB
steels.gif 2KB
p1tankD.gif 3KB
enemy1U.gif 4KB
坦克大战.py 17KB
共 19 条
- 1
资源评论
爱喝兽奶的荒天帝
- 粉丝: 3620
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功