首页计算机计算机软件设计模式 08 第四部分 应用命令模式.pptx

08 第四部分 应用命令模式.pptx

页数:30页文件大小:295.4 KB来源: 设计模式ppt课件

本课件以大富翁游戏为综合案例,展示如何用中介者串起模型与视图,并用单件、模板方法、策略、状态、命令、构造器、原型与访问者等模式分别处理对象唯一性、流程骨架、AI策略、玩家状态与操作请求。

综合举例大富翁游戏封面,说明人类玩家与电脑玩家掷骰移动、买地盖房直至分出最终玩家的规则
大富翁游戏需要考虑的变化,模型侧含地图、地块、房子、骰子与玩家种类变化,视图侧含显示风格、交互与引擎变化
Model 与 View 的划分与交互方式,Game 由多个模型类与一个屏幕界面组成并负责二者交互
查看本课件的文字版(共 30 页,供检索与复制)

第1页:综合举例:大富翁游戏封面

综合举例

  • 大富翁游戏:有一个人类玩家和多个电脑玩家在地图上移动,移动后根据所在地的不同,可以买地、盖房、交费等操纵。玩家的钱为0,则出局,剩余的玩家继续玩,直至某个人类玩家成为最终玩家,或者剩余玩家全部为电脑玩家。移动的步数通过掷骰子决定;地图中的道路有多种块组成;房子有多种;

第2页:游戏中需要考虑的变化

游戏的变化

  • 模型部分
  • 地图的改变
  • 地块种类的增加
  • 房子种类的增加
  • 骰子个数的动态改变
  • 玩家种类的细分
  • …
  • 视图部分
  • 显示风格和素材的变化
  • UI交互的变化
  • 引擎的变化
  • …
  • 平台间的移植

第3页:Model与View的交互方式

Model与View

  • Game包括Model和View
  • Model中有多个类,View中只有一个屏幕界面
  • Model和View的交互

第4页:中介者模式实现的MVC结构

应用中介者和MVC模式

  • Game可与Control合并;
  • Game可使用单件模式,View也可以;

第5页:游戏中Model的单件实现

Gamepublic class Game{private static Game instance = new Game();private List<ModelElement> model;private View view;private Game() { }public static Game GetInstance(){return instance;}public bool Init(){}public bool Run(){}public bool Term(){}//其它操作}如何创建Element,以后再说

第6页:View的主循环结构

View部分

  • 负责界面显示
  • 负责与玩家的交互
主要循环结构:public void Loop(){while (running){ProcessInput();UpdateView();WaitMessage();}}

第7页:原始编码方式的问题展示

Process与UpdateView的原始编码public void ProcessInput(){if (scene == 1) {int key = GetKeyBoard();if (key == 'A' ) {//do ....} else if (key == MOUSE_CLICK ) {//do ....} else {//do ....}}else if (scene == 2) {int key = GetKeyBoard();if (key == 'D' ) {//do ....} else if (key == MOUSE_CLICK ) {//do ....} else {//do ....}} else {}}public void UpdateView(){if (scene == 1) {//do ....} else if (scene == 2) {//do ....} else {//do ....}}

第8页:改进后的主循环与模板方法

用模式改进View

  • 模版方法模式
  • 使用策略模式
  • 使用状态模式

第9页:模板方法模式:游戏主流程固化

使用模版方法模式

  • 场景数量有限,可以;
  • 易增加新的场景;
  • 场景的切换,不易实现

第10页:策略模式:出牌方式的选择

使用策略模式基本上与应用模版方法模式,有类似的效果不足:场景切换

第11页:状态模式:玩家状态与行为

应用状态模式

第12页:状态模式:状态转换的处理

续

  • 使用状态模式可以达到类似的效果
  • 场景的切换对应于状态的转换
  • 本游戏中状态的转换,需要有三个因素:前一个状态,当前状态,当前的操作。
  • 可见:一个场景不可能进行自动的切换
  • 选择:外部控制状态转换方法实现,如使用有限状态机

第13页:

第14页:DirectX环境下的图形与界面处理

View与DX的交互

  • DirectX的多个版本支持
  • OpenGL的支持
  • 第三方引擎的支持
  • 简化维护的考虑

第15页:修改Model与界面的联动实现

View修改Model的请求public void ProcessInput(){if (scene == 1) {DoChange1(ModelElement2 ele);DoChange2(ModelElement1 ele);}else if (scene == 2) {DoChange3(ModelElement2 ele);DoChange4(ModelElement4 ele);}

第16页:命令模式:把动作封装为命令

应用命令模式

  • 可将其转移到Control(Game)中
  • 使用命令模式将操作与接收者的变化单独封装

第17页:游戏命令体系与参数化请求

Game中使用命令模式

第18页:Model的构造过程说明

Model部分

  • 地图、骰子、玩家的构造
  • 玩家的主要行为

第19页:

第20页:模式选型:构造方法的确定

Model的构造

  • Map的组成复杂多变
  • 骰子简单,数量可多个
  • 房子、道路(街区)种类多且易变,地图上实例个数多;
  • 考虑:
  • 简单工厂
  • 工厂方法
  • 抽象工厂
  • 构造器方法
  • 原型方法
  • 在哪里构造

第21页:构造地图与部件的创建过程

Game中构造地图

第22页:构造器模式:地图构造过程封装

Builder中构造Block、House等

  • 可采用工厂方法
  • 可采用原型方法
  • 比较:
  • 原型方法使用简单
  • Block、House的功能和结构较为简单
  • 但数量较多,工厂方法真实创建实例,原型方法则灵活一些

第23页:原型方法模式:部件复用与克隆

使用原型方法

第24页:MapBuilder与构造过程的解耦

public class MapBuilder

  • {
  • public void BuildMap()
  • {
  • }
  • public Map GetMap() { return map; }
  • protected Map map = new Map();
  • protected NormalBlock block = new NormalBlock();
  • protected MarketBlock market = new MarketBlock();
  • protected PoliceBlock policestation = new PoliceBlock();
  • protected Level1House = new Level1House();
  • protected Level2House = new Level2House();
  • protected Level3House = new Level3House();
  • }

第25页:玩家创建与初始化过程

玩家的处理public abstract class Player{public void CastDices(intdiceCount,int fixedValue){}public void MoveOnMap(){}public void UseCard();protected Block currentPosition;}

第26页:双分派与多态的处理方式

MoveOnMap()注意双派分的使用public abstract class Player{public int CastDices(int diceCount,int fixedValue){}public void MoveOnMap(){int step = CastDices(2, 0);for (int i = 0; i < steps; i++){if (currentPosition.NextBlock() == false) break;}}public void UseCard(Player);public void UseCard(House);protected Block currentPosition;}

第27页:Block(地块)的类型与行为

Blockclass Blcok{public void NextBlock(){int dir[] = {0,1,2,3,4,5,6,7};ShuffleDir();for(int i=0;i<8;i++) {if (neighbors[dir[i]] == this) continue;SetCurrent(neighbors[dir[i]]);//其它处理,如撞上栏杆等return true;}return false;}private Block[] neighbors = new Block[8];}

第28页:UseCard(使用卡片)的处理

UseCard中的卡片子系统

  • UseCard可作用于其它玩家,也可作用于建筑物

第29页:MoneyCard(金钱卡片)的处理

public class MoneyCard : PlayerCard{public void ApplyPlayer(Player fromPlayer,Player toPlayer){toPlayer.SetMoney(toPlayer.GetMoney() / 2);}}public abstract class Player{public void UsePlayerCard(this,Player otherPlayer,PlayerCard card){card.ApplyPlayer(this,otherPlayer);}}

第30页:

顶部目录