文章目录
- 一、游戏运行效果
- 二、代码实现
- 2.1 项目搭建
- 2.2 加载我方坦克
- 2.3 加载敌方坦克
- 2.4 添加爆炸效果
- 2.5 坦克大战之音效处理
- 三、完整代码
一、游戏运行效果
二、代码实现
坦克大战游戏
2.1 项目搭建
本游戏主要分为两个对象,分别是我方坦克和敌方坦克。用户可以通过控制我方的坦克来摧毁敌方的坦克保护自己的“家”,把所有的敌方坦克消灭完达到胜利。敌方的坦克在初始的时候是默认 5 个的(这可以自己设置),当然,如果我方坦克被敌方坦克的子弹打中,游戏结束。从面向对象分析该项目有以下类组成:
- 主类:主要包括开始游戏、结束游戏的功能。
class MainGame(): def __init__(self): pass # 开始游戏 def startGame(self): pass # 结束游戏 def endGame(self): pass
- 坦克类:主要包括坦克的创建、显示、移动及射击的功能。
class Tank(): def __init__(self): pass # 移动 def move(self): pass # 射击 def shot(self): pass # 展示坦克的方法 def displayTank(self): pass
- 我方坦克类继承坦克类,主要包括创建、与敌方坦克的碰撞方法。
# 我方坦克 class MyTank(Tank): def __init__(self): pass
- 敌方坦克类继承坦克类,主要包括创建、与我方坦克碰撞方法。
# 敌方坦克 class EnemyTank(Tank): def __init__(self): pass
- 子弹类:主要包括子弹的创建、显示及移动的功能。
# 子弹类 class Bullet(): def __init__(self): pass # 移动 def move(self): pass # 展示子弹的方法 def displayBullet(self): pass
- 墙壁类:主要包括墙壁的创建、显示的功能。
class Wall(): def __init__(self): pass # 展示墙壁的方法 def displayWall(self): pass
- 爆炸效果类:主要展示爆炸效果。
class Explode(): def __init__(self): pass # 展示爆炸效果的方法 def displayExplode(self): pass
- 音效类:主要播放音乐。
class Music(): def __init__(self): pass # 播放音乐 def play(self): pass
显示游戏窗口
在游戏设计的前期,要先创建游戏的界面,也就是要为所设计的游戏创建一个窗口。
【示例】:显示游戏窗口
def startGame(self): # 加载主窗口 # 初始化窗口 pygame.display.init() # 设置窗口的大小及显示 MainGame.window = pygame.display.set_mode([SCREEN_WIDTH, SCREEN_HEIGHT]) # 设置窗口的标题 pygame.display.set_caption('坦克大战1.03') while True: # 给窗口设置填充色 MainGame.window.fill(BG_COLOR) pygame.display.update() MainGame().startGame()
运行效果:
添加提示文字
在运行代码时会发现,创建的窗口没有任何提示。然而在实际中希望窗口提示敌方坦克的数量,因此,需要在现有窗口进行必须的改进,添加敌方坦克数量提示。
# 文字显示 def getTextSuface(self, text): pygame.font.init() # 字体初始化 font = pygame.font.SysFont('kaiti', 16) # 绘制文字信息 textSurface = font.render(text, True, TEXT_COLOR) return textSurface
2.2 加载我方坦克
通过加载一张图片来表示游戏中的坦克,此坦克代表我方坦克,完善坦克类。
class Tank(): # 添加距离左边left 距离上边top def __init__(self, left, top): # 保存加载的图片 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 = 'L' # 根据当前图片的方向获取图片 surface self.image = self.images[self.direction] # 根据图片获取区域 self.rect = self.image.get_rect() # 设置区域的left 和top self.rect.left = left self.rect.top = top
添加事件监听
上面创建的坦克还不能动,显示不是创建游戏的目的,因此,要给创建的坦克赋予“生命”。添加事件监听,控制上、下、左、右四个方向键,实现针对不同的键改变坦克的方向及移动功能,点击关闭退出游戏。
实现退出方法:
# 结束游戏 def endGame(self): print('游戏结束') exit() # 退出游戏
坦克类中添加移动开关属性,按下上、下、左、右四个方向键修改坦克的方向及开关状态,按下关闭键,调用关闭方法退出游戏。
# 获取程序期间所有事件(鼠标事件,键盘事件) 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('按下左键,坦克向左移动') elif event.key == pygame.K_RIGHT: print('按下右键,坦克向右移动') elif event.key == pygame.K_UP: print('按下上键,坦克向上移动') elif event.key == pygame.K_DOWN: print('按下左键,坦克向下移动')
按下上、下、左、右之后控制台上会打印对应的信息。
随机生成敌方坦克
初始化敌方坦克,随机在不同坐标生成敌方坦克。
# 敌方坦克 class EnemyTank(Tank): def __init__(self, left, top, speed): super(EnemyTank, self).__init__(left, top) # 加载图片集 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'), } # 随机生成方向 self.direction = self.randDirection() self.image = self.images[self.direction] # 根据方向获取图片 self.rect = self.image.get_rect() # 获取区域 self.rect.left, self.rect.top = left, top # 对left和top赋值 self.speed = speed # 速度 self.flag = True # 坦克移动开关 self.step = 50 # 敌方坦克步数
2.3 加载敌方坦克
在MainGame类中创建敌方坦克:
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 randMove(self): # 坦克的随机方向移动 if self.step
在开始游戏方法,加载敌方坦克
self.creatEnemyTank()
我方坦克发射子弹
在子弹类中初始化子弹,每个子弹在不同的方向发射会有不同的运动轨迹,每个子弹在坦克方向上的不同子弹发射的坐标也会有所不同。需要计算四个不同方向上的子弹发射坐标。
def __init__(self, tank): self.image = pygame.image.load('img/enemymissile.gif') # 图片加载 self.direction = tank.direction # 子弹的方向 self.rect = self.image.get_rect() # 获取区域 if self.direction == 'U': # 子弹的left和top与方向有关 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 = 5 # 子弹的速度 self.live = True # 子弹的状态
敌方坦克随机发射子弹
def shot(self): num = random.randint(1,1000) if num '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 = 'L' # 方向 self.image = self.images[self.direction] # 根据图片方向获取图片 self.rect = self.image.get_rect() # 根据图片获取区域 self.rect.left, self.rect.top = left, top self.speed = 5 # 移动速度 self.stop = True # 坦克移动开关 self.live = True self.OldLeft = self.rect.left self.OldTop = self.rect.top # 移动 def move(self): self.OldLeft = self.rect.left self.OldTop = self.rect.top # 判断坦克方向进行移动 if self.direction == 'L': if self.rect.left 0: 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 0: self.rect.top -= self.speed else: self.live = False # 修改子弹的状态 elif self.direction == 'R': if self.rect.left + self.rect.width 0: self.rect.left -= self.speed else: self.live = False # 修改子弹的状态 def hitWall(self): for wall in MainGame.WallList: # 循环遍历墙壁列表 if pygame.sprite.collide_rect(self, wall): # 检测子弹是否碰撞墙壁 self.live = False # 修改子弹状态 wall.hp -= 1 # 碰撞后墙壁生命值减少 if wall.hp
- 音效类:主要播放音乐。
- 爆炸效果类:主要展示爆炸效果。
- 墙壁类:主要包括墙壁的创建、显示的功能。
- 子弹类:主要包括子弹的创建、显示及移动的功能。
- 敌方坦克类继承坦克类,主要包括创建、与我方坦克碰撞方法。
- 我方坦克类继承坦克类,主要包括创建、与敌方坦克的碰撞方法。
- 坦克类:主要包括坦克的创建、显示、移动及射击的功能。
- 主类:主要包括开始游戏、结束游戏的功能。
文章版权声明:除非注明,否则均为VPS857原创文章,转载或复制请以超链接形式并注明出处。
还没有评论,来说两句吧...