模块安装(安装pygame)
-
1.pip安装
- widows+R-->输入cmd-->命令行输入pip install pygame
-
2.pycharm中安装
- file-->setting-->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 MianGame: def start(self): """开始游戏""" pass def game_over(self): """结束游戏""" pass #基本坦克类 class BaseTank: pass #我方坦克类 class HeroTank(BaseTank): pass #敌方坦克类 class EnemyTank(BaseTank): 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)) while True: MainGame.window.fill((0,0,0)) #刷新 pygame.display.update() # time.sleep(2)
-
事件检测
-
获取新事件
- 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(): #鼠标点击关闭窗口事件 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("右移") if event.key==pygame.K_SPACE: print("发射子弹")
我方坦克分析
由于我方坦克和敌方坦克有相似的属性和方法,所以可以定义基本坦克类,让我方坦克和敌方坦克类继承基本坦克类
-
基本坦克类
- 属性:图片,方向,坦克位置,坦克矩形区域,移动速度,是否活着
- 方法:移动,贴图
-
参考代码
class BaseTank: def __init__(self,x,y): """基本坦克属性""" # 加载图片文件,返回图片对象 #将坦克图片储存在字典中 # image = pygame.image.load("图片路径") self.images = { "U":pygame.image.load("tank_img/p1tankU.gif"), "D": pygame.image.load("tank_img/p1tankD.gif"), "L": pygame.image.load("tank_img/p1tankL.gif"), "R": pygame.image.load("tank_img/p1tankR.gif"), } #给初始化坦克一个方向 self.direction = "U" #根据坦克方向获取坦克坦克 self.img = self.images[self.direction] #获取图片矩形区域 self.rect = self.img.get_rect() self.rect.x = x #坦克的x坐标 self.rect.y = y #坦克的y坐标 #移动速度 self.speed = 3 #坦克状态 self.live = True def display_tank(self): """贴坦克图片的方法""" # 获取图片对象 self.img = self.images[self.direction] #贴坦克图片 # 贴图(指定坐标,将图片绘制到窗口) MainGame.window.blit(self.img, self.rect) #我方坦克类 class HeroTank(BaseTank): def __init__(self,x,y): super(HeroTank, self).__init__(x,y) self.speed = 4
-
创建我方坦克,并加载图片
- 在主逻辑中,一开始就存在了我方坦克,定义类属性P记录我方坦克
- 先定义创建我方坦克的方法(create_hero_tank),再定义加载我方坦克图片的方法(load_hero_tank)
- 在游戏开始时,调用创建坦克的方法,在循环中加载坦克图片
在主逻辑中记录坦克 P1 = None def create_hero_tank(self): """创建我方坦克""" #判断是否创建了我方坦克 if not MainGame.P1: MainGame.P1 = HeroTank(500,400) #坦克的初始位置 def load_hero_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_hero_tank()
-
实现我方坦克移动的方法
在基本基本类中添加移动方法
-
判断坦克的方向属性,是哪个方向就向哪个方向移动(向右x为正,向下y为正)
- 移动方式:图片坐标+坦克速度
-
参考代码
def move(self): """坦克移动的方法""" if self.direction=="U": self.rect.y-=self.speed elif self.direction=="D": self.rect.y+=self.speed elif self.direction=="L": self.rect.x-=self.speed elif self.direction=="R": self.rect.x+=self.speed #在加载我方坦克中调用坦克移动的方法 MainGame.P1.move() #此时坦克只能向上移动
-
优化坦克移动方法
- 检测键盘长按事件,获取按键状态
- 检测到键盘改变方向后,调用父类移动方向
参考代码
#我方坦克重写move()方法 def move(self): """我方坦克移动方法""" #键盘长按事件,获取键盘上所有的按键状态,按下1,没按0 keys_status = pygame.key.get_pressed() # print(pressed_keys) if keys_status[pygame.K_UP]: #按键“上”被按下 self.direction="U" #修改方向属性 super(HeroTank, self).move() elif keys_status[pygame.K_DOWN]: #按键“下”被按下 self.direction="D" #修改方向属性 super(HeroTank, self).move() elif keys_status[pygame.K_LEFT]: #按键“左”被按下 self.direction="L" #修改方向属性 super(HeroTank, self).move() elif keys_status[pygame.K_RIGHT]: #按键“右”被按下 self.direction="R" #修改方向属性 super(HeroTank, self).move()