package com.boyiju.game.siguo.util { /** 四国军模可能用到的常量值 @author Administrator * / public class Enum { //棋局状态 public static const GAME_LAYOUT:int=0;//布局 public static const GAME_WAIT:int=1;//完成布局,等待棋它玩家 public static const GAME_PLAYING:int=2;//游戏中 public static const GAME_END:int=3;//游戏结束 //玩家颜色 public static const COLOR_PLAYER_BOTTOM:int=0X34699d;//下 public static const COLOR_PLAYER_RIGHT:int=0Xd86c00;//右 public static const COLOR_PLAYER_TOP:int=0X8f449f;//上 public static const COLOR_PLAYER_LEFT:int=0X709c00;//左 //棋子 public static const QIZHI_SINING:int=40;//司令 public static const QIZHI_JUNZHANG:int=39; public static const QIZHI_SHIZHANG:int=38; public static const QIZHI_LVZHANG:int=37; public static const QIZHI_TUANZHANG:int=36; public static const QIZHI_YINGZHANG:int=35; public static const QIZHI_LIANGZHANG:int=34; public static const QIZHI_PAIZHANG:int=33; public static const QIZHI_GONGBING:int=32; public static const QIZHI_DILEI:int=31; public static const QIZHI_JUQI:int=30; //最小为军棋,谁都可以吃 public static const QIZHI_ZHADAN:int=100; //可视 public static const QIZHI_STATE_NONE:int=-1;//不可见 public static const QIZHI_STATE_SELF:int=0; //自己可见 public static const QIZHI_STATE_TEAM:int=1;//队友可见 public static const QIZHI_STATE_ALL:int=2;//全部可见 //位置类型 public static const POSITION_NORAML:int=0; public static const POSITION_YING:int=1; //行营 public static const POSITION_DABENYING:int=2; //大本营 //布局移动 public static const LAYOUT_MOVE_ALL:int=0; public static const LAYOUT_MOVE_LAST_TWO:int=1;//地雷只能在后两排 public static const LAYOUT_MOVE_NOT_FRONT:int=2;//×××不能在前排铁道上 public static const LAYOUT_MOVE_JUNQI:int=3;//军棋只能在大本营内 } }
package com.boyiju.game.siguo.vo { import asds.map.HashMap; import com.boyiju.game.siguo.components.Qizhi; import com.boyiju.game.siguo.util.Enum; import mx.collections.ArrayCollection; / 棋子类,每个棋子核心数值仅包括棋子的值,棋子的位置,棋子是否显示与棋子的玩家, 其它的辅助值主要用于交互与显示,将通过核心值获得并可进行绑定显示 */ [Bindable] public class QizhiVO { private var _value:int=-1; private var _deskpos:int=-1; private var _display:int=-1; public var positionVO:PositionVO; public var name:String; public var bgColor:int; public var layoutMoveType:int; public function get display():int { return _display; } public function set display(value:int):void { _display = value; } public function get deskpos():int { return _deskpos; } public function set deskpos(value:int):void { _deskpos = value; this.bgColor=getColor(value); } public function get value():int { return _value; } public function set value(value:int):void { _value = value; this.name=getQizhiName(value); this.layoutMoveType=getLayoutMoveType(value); } private function isTeam(deskpos:int):Boolean { var teamdeskpos:int=(this.deskpos+2)%4; return deskpos==teamdeskpos; } /** 获得棋子的显示名称,与棋子的显示类进行绑定 @param value * @return / private function getQizhiName(value:int):String{ if (value==40) return "司令"; if (value==39) return "军长"; if (value==38) return "师长"; if (value==37) return "旅长"; if (value==36) return "团长"; if (value==35) return "营长"; if (value==34) return "连长"; if (value==33) return "排长"; if (value==32) return "工兵"; if (value==31) return "地雷"; if (value==30) return "军棋"; if (value==100) return "×××"; return ""; } /** 棋子的颜色,通过棋子的玩家获得 @param player * 玩家 @return 颜色值 * */ private function getColor(player:int):int{ if (player==0) return Enum.COLOR_PLAYER_BOTTOM; else if(player==1) return Enum.COLOR_PLAYER_RIGHT; else if (player==2) return Enum.COLOR_PLAYER_TOP; else if (player==3) return Enum.COLOR_PLAYER_LEFT; return 0x000000; } /** 棋子本身在布局阶段的移动限制 @param value 棋子的值 * @return / private function getLayoutMoveType(value:int):int{ if (value==Enum.QIZHI_GONGBING) return Enum.LAYOUT_MOVE_LAST_TWO; if (value==Enum.QIZHI_ZHADAN) return Enum.LAYOUT_MOVE_NOT_FRONT; if (value==Enum.QIZHI_DILEI) return Enum.LAYOUT_MOVE_JUNQI; return Enum.LAYOUT_MOVE_ALL; } /** 与目标棋子比较大小 @param target * @return / public function Compare(target:QizhiVO):int { if (this.value==Enum.QIZHI_ZHADAN||target.value==Enum.QIZHI_ZHADAN||this.value==target.value) { trace("很壮烈,您的 "+this.name+" 与敌人的 "+target.name+" 同归于尽"); return 0; } if (target.value==Enum.QIZHI_DILEI&&this.value!=Enum.QIZHI_GONGBING||this.value<target.value) { trace("很悲剧,您的 "+this.name+" 被敌人的 "+target.name+" 吃掉了"); return -1; } if (this.value>target.value) { trace("很爽,您的 "+this.name+" 吃掉了敌人的 "+target.name); return 1; } return 1; } /** 布局阶段与目标棋子交换 @param target * */ public function exchange(target:QizhiVO):void { if (target==null) return; if (target.value==-1) return; if (target.deskpos!=this.deskpos) return; //军棋只能放大本营 if (this.layoutMoveType==Enum.LAYOUT_MOVE_JUNQI) { if (target.positionVO.index==11) { }else if (target.positionVO.index==23) { } else return; } if (target.layoutMoveType==Enum.LAYOUT_MOVE_JUNQI) { if (this.positionVO.index==11) { }else if (this.positionVO.index==23) { } else return; } //地雷只能放在后两排 if (this.layoutMoveType==Enum.LAYOUT_MOVE_LAST_TWO) { if (target.positionVO.index%6<4) return; } if (target.layoutMoveType==Enum.LAYOUT_MOVE_LAST_TWO) { if (this.positionVO.index%6<4) return; } //×××不能放在第一排三个位置 if (this.layoutMoveType==Enum.LAYOUT_MOVE_NOT_FRONT) { if (target.positionVO.index==0||target.positionVO.index==12||target.positionVO.index==24) return; } if (target.layoutMoveType==Enum.LAYOUT_MOVE_NOT_FRONT) { if (this.positionVO.index==0||this.positionVO.index==12||this.positionVO.index==24) return; } var temp:int=target.value; target.value=this.value; this.value=temp; } /** 可否移动到目标位置,主要包括棋子的可移动性,棋子的移动目标值,目标位置的内容等。 @param targetPos * @param qizhiMap @return */ public function canMoveTo(targetPos:PositionVO,qizhiMap:HashMap):Boolean{ //位置无法移动 if (this.positionVO.moveAC.length==0||this.value==Enum.QIZHI_DILEI||this.value==Enum.QIZHI_JUQI) { trace("该位置无法移动:"+this.positionVO.index); return false; } //目标位置不在可移动区内 if (!this.positionVO.moveAC.contains(targetPos.index)) { if (this.positionVO.moveRailAC.length==0){ trace(targetPos.index+" 不在该位置的可移动路径内:"+this.positionVO.index); return false; } for each (var railAC:ArrayCollection in this.positionVO.moveRailAC) { var targetindex:int=railAC.getItemIndex(targetPos.index); //目标棋子不在铁路中 if (targetindex==-1) continue; //目标棋子在铁路中.再找原始棋子的位置 var sourceindex:int=railAC.getItemIndex(this.positionVO.index); //从原始棋子到目标棋子的通路中没有其它子 if (sourceindex>targetindex) { for(var i:int=targetindex+1;i<sourceindex;i++) { //到达目标区的通路有其它的棋子 var qizhiVO:QizhiVO=qizhiMap.get(railAC.getItemAt(i)) as QizhiVO; if (qizhiVO.value!=-1) { trace("路径不通:"+qizhiVO.positionVO.index+" 有子 "+qizhiVO.name); return false; } trace("经过:"+qizhiVO.positionVO.index); } } else { for(var j:int=sourceindex+1;j<targetindex;j++) { //到达目标区的通路有其它的棋子 var qizhiVO2:QizhiVO=qizhiMap.get(railAC.getItemAt(j)) as QizhiVO; if (qizhiVO2.value!=-1) { trace("路径不通:"+qizhiVO2.positionVO.index+" 有子 "+qizhiVO2.name); return false; } trace("经过:"+qizhiVO2.positionVO.index); } } trace(this.name+" 从 "+this.positionVO.index+ " 移动至:"+targetPos.index); return true; } } trace(this.name+" 从 "+this.positionVO.index+ " 移动至:"+targetPos.index); return true; } / 与目标棋子碰撞 @param target * @return / public function eat(target:QizhiVO,qizhiMap:HashMap):int{ //不能吃自己的子 if (target==null) { return -6; } if (target.value==-1) { trace( "目标位置无棋子"); return -5; } if (target.deskpos==this.deskpos) { trace( "不能吃自己的子"); return -4; } //不能吃队友的子 if (isTeam(target.deskpos)) { trace( "位于"+target.positionVO.index+" 的棋子是您的队友的 "+target.name); return -3; } if (!canMoveTo(target.positionVO,qizhiMap)) { return -2; } //比较大小 return this.Compare(target); } } }
package com.boyiju.game.siguo.model { import asds.map.HashMap; import com.adobe.cairngorm.model.IModelLocator; import com.boyiju.game.siguo.components.LayoutSelect; import com.boyiju.game.siguo.components.Qizhi; import com.boyiju.game.siguo.util.Enum; import com.boyiju.game.siguo.vo.LayoutVO; import com.boyiju.game.siguo.vo.PositionVO; import com.boyiju.game.siguo.vo.QizhiVO; import com.boyiju.game.siguo.vo.UserVO; import mx.collections.ArrayCollection; import mx.core.FlexGlobals; / 四国军棋游戏的全局控制类,使用了cairngoarm类设计 / [Bindable] public class GameEngine implements IModelLocator { private static var _model:GameEngine; public var gameOwner:int;//游戏桌主 public var gameWaitTime:int=30;//等待时间 秒 public var gameStatus:int;//游戏状态 public var currentPlayer:UserVO;//当前玩家 public var currentTurn:int;//当前回合玩家 public var currentSelectedQZ:Qizhi; //选中的棋子 public var sourceQZ:Qizhi; //源棋子,用于棋子之间产鲜红用 public var layoutAC:ArrayCollection;//布局文件组合 public var currentLayout:LayoutVO;//当前布局文件 public var playerAC:HashMap; //玩家组合 public var qizhiMap:HashMap; //所有棋子有组合,与服务器交互的主要类 /** 初始化四国军棋棋局 @param enforcer * */ public function GameEngine(enforcer:SingletonEnforcer) { gameStatus=Enum.GAME_LAYOUT; layoutAC=new ArrayCollection(); layoutAC.addItem(new LayoutVO("守型",LayoutSelect.LAYOUT_COOL,"偏防守")); layoutAC.addItem(new LayoutVO("攻型",LayoutSelect.LAYOUT_HOT,"偏进攻")); layoutAC.addItem(new LayoutVO("基本",LayoutSelect.LAYOUT_NORMAL,"攻守平衡")); currentLayout=layoutAC.getItemAt(0) as LayoutVO; qizhiMap=new HashMap(); playerAC =new HashMap(); createAndInitUser(); currentPlayer=playerAC.get(0) as UserVO; } /** 将布局文件添加到全局布局列表中 @param layout * / public function addLayout(layout:LayoutVO,deskpos:int):void{ for (var i:int=0;i<layout.lyAC.length;i++) { if (layout.lyAC[i]!=-1) { var positionVO:PositionVO=new PositionVO(); positionVO.index=30deskpos+i; var qizhiVO:QizhiVO=new QizhiVO(); qizhiVO.value=(layout.lyAC[i]); qizhiVO.deskpos=deskpos; qizhiVO.positionVO=positionVO; qizhiMap.put(qizhiVO.positionVO.index,qizhiVO); } } } public static function get intance():GameEngine { if (_model ==null) { _model=new GameEngine(new SingletonEnforcer()); } return _model; } /** 测试用,加入一些用户 */ private function createAndInitUser():void { var user:UserVO=new UserVO(); user.name="张柏枝"; user.picture="assets/p_w_picpaths/zbz.jpg"; user.score=0; user.win=0; user.lost=0; user.points=2100; user.deskpos=0; playerAC.put(user.deskpos,user); user=new UserVO(); user.name="王菲"; user.picture="assets/p_w_picpaths/wf.jpg"; user.score=0; user.win=0; user.lost=0; user.points=500; user.deskpos=1; playerAC.put(user.deskpos,user); user=new UserVO(); user.name="林志玲"; user.picture="assets/p_w_picpaths/lzl.jpg"; user.score=0; user.win=0; user.lost=0; user.points=2250; user.deskpos=2; playerAC.put(user.deskpos,user); user=new UserVO(); user.name="阿娇"; user.picture="assets/p_w_picpaths/aj.jpg"; user.score=0; user.win=0; user.lost=0; user.points=350; user.deskpos=3; playerAC.put(user.deskpos,user); } / 获得下一位玩家, @param num * @return / public function getNextUser(num:int):UserVO{ var nextid:int=(currentPlayer.deskpos+num)%4; return playerAC.get(nextid) as UserVO; } } } class SingletonEnforcer { }
3.4 LayoutVO 类 布局文件类
package com.boyiju.game.siguo.vo { import mx.collections.ArrayCollection; [Bindable] public class LayoutVO { public var name:String; public var lyAC:ArrayCollection; public var catalog:String; public function LayoutVO(name:String,lyAC:Array,catalog:String) { this.name=name; this.lyAC=new ArrayCollection(lyAC); this.catalog=catalog; } } }
一个典型的博命型的划攻布局可以描述如下。够简单了吧,看看我们下QQ游戏的布局文件,几个K,我汗。。
public static const LAYOUT_HOT:Array=[40,39,38,38,37,37,36,-1,100,-1,36,30,35,35,-1,34,34,34,33,-1,33,-1,33,32,32,32,31,31,31,100]; 四)下一节可能做的工作 核心部分基本就包括在这四个类内,应该来讲够简单吧,最终完成的效果如图