首个游戏项目
'''
v1.07 敌方坦克的加载
'''
import pygame,time,random
SCREEN_WIDTH = 900
SCREEN_HEIGHT = 550
VERSION = 'V1.07'
# v1.07新增 记录敌方坦克的数量
ENEMY_TANK_COUNT = 5
# 主逻辑类
class MainGame():
# 游戏主窗口
window = None
# 我方坦克(唯一性)设置成类属性
tank1 = None
# v1.07新增存储敌方坦克的列表
enemy_tanklist = []
def startGame(self):
# 调用窗口初始化方法
pygame.display.init()
# 在窗口左上角设置游戏标题
pygame.display.set_caption('坦克大战'+VERSION)
# 创建一个窗口屏幕显示表面
MainGame.window = pygame.display.set_mode((SCREEN_WIDTH,SCREEN_HEIGHT))
# 调用创建我方坦克的方法
self.createMytank()
# 调用创建敌方坦克的方法
self.createEnemytank()
while True:
# 填充窗口背景色
MainGame.window.fill((100,100,200))
# 将获取的事件类型在填充完窗口背景色后时刻处于循环中
self.getEvents()
# 展示我方坦克
self.showMytank()
# 调用展示敌方坦克的方法
self.showEnemyTank()
if not MainGame.tank1.stop:
# 我方坦克移动
MainGame.tank1.move()
# 更新
pygame.display.update()
# v1.06 新增程序休眠,优化坦克的移动速度
time.sleep(0.025)
# 获取所有事件处理的方法
def getEvents(self):
# 获取队列中的所有事件,遍历事件,对type为QUIT和KEYDOWN的两种事件类型进行处理
eventList = pygame.event.get()
# 遍历所有事件
for e in eventList:
# 当事件类型是QUIT时,退出游戏
if e.type == pygame.QUIT:
self.showMytank()
# 退出游戏
self.gameOver()
# 当事件类型是KEYDOWN时,进行细化处理
elif e.type == pygame.KEYDOWN:
# 按下键盘上的向上按键时的处理
if e.key == pygame.K_UP:
print('向上移动')
MainGame.tank1.direction = 'U'
# v1.06修改坦克的移动状态
MainGame.tank1.stop = False
# 按下键盘上的向下按键时的处理
elif e.key == pygame.K_DOWN:
print('向下移动')
MainGame.tank1.direction = 'D'
# v1.06修改坦克的移动状态
MainGame.tank1.stop = False
# 按下键盘上的向左按键时的处理
elif e.key == pygame.K_LEFT:
print('向左移动')
MainGame.tank1.direction = 'L'
MainGame.tank1.stop = False
# 按下键盘上的向右按键时的处理
elif e.key == pygame.K_RIGHT:
print('向右移动')
MainGame.tank1.direction = 'R'
MainGame.tank1.stop = False
# 按下键盘上的空格按键时的处理
elif e.key == pygame.K_SPACE:
print('biubiu~')
#v1.06新增按键松开的事件处理
elif e.type == pygame.KEYUP:
if e.key == pygame.K_UP or e.key == pygame.K_DOWN or\
e.key == pygame.K_LEFT or e.key == pygame.K_RIGHT:
# 将坦克的移动状态改为停止
MainGame.tank1.stop = True
# 创建我方坦克
def createMytank(self):
# 创建我方坦克并赋予其位置属性坐标
MainGame.tank1 = MyTank(SCREEN_WIDTH/2,SCREEN_HEIGHT/3*2)
#展示我方坦克
def showMytank(self):
MainGame.tank1.displayTank()
# v1.07创建敌方坦克
def createEnemytank(self):
# 循环创建敌方坦克
for i in range(ENEMY_TANK_COUNT):
num = random.randint(1,7)
# 创建第一个敌方坦克,出现位置为y=150,x随机出现在(100-700)
etank = EnemyTank(100*num,150)
# 创建敌方坦克列表,存入所有的敌方坦克
MainGame.enemy_tanklist.append(etank)
# v1.07展示敌方坦克
def showEnemyTank(self):
# 遍历展示敌方坦克
for etank in MainGame.enemy_tanklist:
etank.displayTank()
def gameOver(self):
exit()
# 基本坦克类
class BaseTank():
# 基本坦克属性 位置 方向 速度 图片
def __init__(self):
self.direction = None
self.rect = None
self.images = None
self.image = None
self.speed = 0
#v1.06新增属性,用来控制坦克是否移动
self.stop = True
# v1.05 新增移动方法
def move(self):
pass
# 我方坦克类
class MyTank(BaseTank):
def __init__(self,x,y):
#引用父类属性
super(MyTank, self).__init__()
# 设置具体的图片集
self.images = {
'U':pygame.image.load('img/p1tankU.gif'),
'D':pygame.image.load('img/p1tankD.gif'),
'L':pygame.image.load('img/p1tankL.gif'),
'R':pygame.image.load('img/p1tankR.gif')
}
# 我方坦克的初始方向
self.direction = 'U'
# 设置坦克的图片(self.image 返回的是一个surface)
self.image = self.images[self.direction]
# 先基于图像获取坦克的位置和大小
self.rect = self.image.get_rect()
# 修改坦克坐标,改成自定义位置
self.rect.centerx = x
self.rect.centery = y
# 设置坦克速度
self.speed = 5
#将我方坦克加入到窗口中
def displayTank(self):
self.image = self.images[self.direction]
# 把坦克的图像(即表面)和位置放到另一个图像或表面窗口
MainGame.window.blit(self.image,self.rect)
def move(self):
# 移动,基于在指定的方向移动
if self.direction == 'U':
if self.rect.centery > self.rect.height/2:
self.rect.centery -= self.speed
elif self.direction == 'D':
if self.rect.centery < SCREEN_HEIGHT - self.rect.height/2:
self.rect.centery += self.speed
elif self.direction == 'L':
if self.rect.centerx > self.rect.height/2:
self.rect.centerx -= self.speed
elif self.direction == 'R':
if self.rect.centerx < SCREEN_WIDTH - self.rect.height/2:
self.rect.centerx += self.speed
# 敌方坦克类
class EnemyTank(BaseTank):
def __init__(self,x,y):
# 设置具体的图片集
self.images = {
'U':pygame.image.load('img/enemy1U.gif'),
'D':pygame.image.load('img/enemy1D.gif'),
'L':pygame.image.load('img/enemy1L.gif'),
'R':pygame.image.load('img/enemy1R.gif')
}
# v1.07敌方坦克的初始方向为随机方向
self.direction = self.randomDirection()
# 设置坦克的图片(self.image 返回的是一个surface)
self.image = self.images[self.direction]
# 先基于图像获取坦克的位置和大小
self.rect = self.image.get_rect()
# 修改坦克坐标,改成自定义位置
self.rect.centerx = x
self.rect.centery = y
# v1.07生成敌方坦克的随机方向
def randomDirection(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 displayTank(self):
self.image = self.images[self.direction]
# 把坦克的图像(即表面)和位置放到另一个图像或表面窗口
MainGame.window.blit(self.image, self.rect)
# 子弹类
class Bullet():
pass
# 爆炸类
class Explode():
pass
# 墙壁类
class Wall():
pass
# 音效类
class Audio():
pass
#创建一个主逻辑类的对象
game = MainGame()
# 开始游戏
game.startGame()