坦克大战
Posted markshui
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了坦克大战相关的知识,希望对你有一定的参考价值。
模块安装(安装pygame)
-
1.pip 安装
- windows+R-->cmd-->命令行输入 pip install pygame
-
2.pycharm中安装
- file-->settting-->Project Interpreter-->右侧+--install-->搜索框输入pygame-->下方 install package
-
3.下载好安装包之后直接安装
- 在Python官网下载好pygame-1.9.6-cp37-cp37m-win_amd64.whl,打开命令窗口,切换到安装包目录,执行 pip install pygame-1.9.6-cp37-cp37m-win_amd64.whl
-
使用 pip list 查看是否有pygame
面向对象分析
-
游戏原理分析
- 游戏原理:和动画原理相同,快速切换图片,为了避免上一次贴图,每次刷新前,重贴所有图片
-
实现框架的搭建(类的设计)
-
主逻辑类
-
基本坦克类
-
我方坦克类
-
敌方坦克类
-
子弹类
-
墙壁类
-
爆炸类
-
框架搭建
-
参考代码
- 主逻辑类 class MainGame: def start(self): """开始游戏""" pass def game_over(self): """结束游戏""" pass # - 基本坦克类 class BaseTank: pass # - 我方坦克类 class HeroTank: pass # - 敌方坦克类 class EnemyTank: pass # - 子弹类 class Bullet: pass # - 墙壁类 class Wall: pass # - 爆炸类 class Bomb: pass
主逻辑类
-
属性:游戏主窗口
-
方法:开始游戏
-
窗口初始化
-
设置窗口
-
设置标题(坦克大战v_1.0)
-
窗口背景
-
游戏应该在无限循环中
class MainGame: #游戏主窗口 window = None def start(self): """开始游戏""" # 调用窗口初始化 pygame.display.init() # 创建窗口 MainGame.window = pygame.display.set_mode((900,500)) # 设置窗口标题 pygame.display.set_caption("坦克大战v_1.0") while True: #窗口背景颜色 MainGame.window.fill((0,0,0)) #刷新 pygame.display.update() def game_over(self): """结束游戏""" pass
-
主逻辑内进行事件检测
-
获取新事件
- pygame.event.get():
- 鼠标点击窗口事件 pygame.QUIT
- 键盘按下事件 pygame.KEYDOWN
- pygame.event.get():
-
键盘长按事件
- pygame.key.getpressed()
-
参考代码(在主逻辑代码中添加)
def deal_event(self): """事件检测""" # print(pygame.event.get()) for event in pygame.event.get(): # 1. 鼠标点击关闭窗口事件 if event.type == pygame.QUIT: print("点击关闭窗口按钮") sys.exit() elif event.type==pygame.KEYDOWN: # print("按下键盘") if event.key==pygame.K_LEFT: print("左移") elif event.key==pygame.K_RIGHT: print("右移") elif event.type==pygame.MOUSEBUTTONDOWN: print("鼠标点击事件")
我方坦克分析
-
由于我方坦克和敌方坦克有相似属性和方法,所以可以定义基本坦克类,让我方坦克和敌方坦克继承基本坦克类
-
基本坦克类:
- 属性:图片、方向、图片矩形区域、坦克位置、移动速度、是否活着
- 方法:移动、贴图
-
参考代码(定义基本坦克类,让我方坦克类继承)
class BaseTank: def __init__(self,x,y): """基本坦克类的属性""" # 加载图片文件,返回图片对象 #将坦克图片储存在字典中 self.images = { "U":pygame.image.load("tank_img/p1tankU.gif"), "D":pygame.image.load("tank_img/p1tankU.gif"), "L":pygame.image.load("tank_img/p1tankU.gif"), "R":pygame.image.load("tank_img/p1tankU.gif"), } #给初始化坦克一个方向 self.direction = "U" #根据坦克方向获取坦克图片 self.image = self.images[self.direction] #获取图片矩形区域 self.rect = self.image.get_rect() #根据传入的参数,决定坦克的位置 self.rect.x = x #坦克的x坐标 self.rect.y = y #坦克的y坐标 #移动速度 self.speed = 3 #是否活着 self.live = True def display_tank(self): """贴坦克图片的方法""" #先获取坦克图片 self.image = self.images[self.direction] #贴坦克图片 MainGame.window.blit(self.image,self.rect) # - 我方坦克类 class HeroTank(BaseTank): def __init__(self,x,y): super(HeroTank, self).__init__(x,y) self.speed = 2
-
创建我方坦克,并加载图片
- 在主逻辑中,一开始就存在我方坦克,定义P类属性记录
- 先定义创建我方坦克的方法(create_hero_tank),再定义加载坦克图片的方法(load_hero_tank)
- 在开始游戏时,调用创建坦克对象的方法,在循环中加载坦克图片
#主逻辑中记录坦克 P1 = None def create_tank(self): """创建我方坦克""" #判断是否创建了我方坦克 if not MainGame.P1: MainGame.P1 = HeroTank(500,400) #坦克的初始位置 def load_heor_tank(self): """加载我方坦克""" if MainGame.P1 and MainGame.P1.live: #如果坦克活着就调用坦克贴图的方法 MainGame.P1.display_tank() else: #如果坦克死了,就删除坦克对象 del MainGame.P1 MainGame.P1 = None #在开始游戏时调用 self.create_tank() #在开始游戏循环中调用 self.load_heor_tank()
以上是关于坦克大战的主要内容,如果未能解决你的问题,请参考以下文章