public void Initialize() { DataManager clientData = DataManager.GetInstance(); frames = clientData.GetSimulateBattleData(); battleId = clientData.GetBattleId(); // Init battle situation data. deltaTime = GameConstants.LOGIC_FRAME_TIME; deltaTimeMs = Mathf.RoundToInt(deltaTime * 1000); List <Battler> battler = clientData.GetBattlers(); sideBattleSituations = new Dictionary <MatchSide, List <BattleSituation> >(); sideBattleSituations.Add(MatchSide.Blue, new List <BattleSituation>()); sideBattleSituations.Add(MatchSide.Red, new List <BattleSituation>()); for (int i = 0; i < battler.Count; i++) { BattleSituation bs = new BattleSituation(); long battlerId = battler[i].playerId; bs.playerId = battlerId; if (battler[i].side == MatchSide.Blue) { sideBattleSituations[MatchSide.Blue].Add(bs); } else if (battler[i].side == MatchSide.Red) { sideBattleSituations[MatchSide.Red].Add(bs); } } status = SimulateBattleStatus.Playing; }
private void ConvertSituantionData(BattleSituation situation, Data.BattleSituation data) { situation.fatality = data.fatality; situation.kills = data.kills; situation.mvpValue = data.mvpValue; situation.playerId = data.playerId; situation.resources = data.resources; }
private void FillSituantionData(MatchSide side, List <Data.BattleSituation> list) { List <BattleSituation> sideSituations = sideBattleSituations[side]; for (int index = 0; index < sideSituations.Count; index++) { BattleSituation battleSituation = sideSituations[index]; Data.BattleSituation situation = new Data.BattleSituation(); situation.fatality = battleSituation.fatality; situation.kills = battleSituation.kills; situation.mvpValue = battleSituation.mvpValue; situation.playerId = battleSituation.playerId; situation.resources = battleSituation.resources; list.Add(situation); } }
public static string GetResource(BattleSituation airSupremacyResult) { switch (airSupremacyResult) { case BattleSituation.なし: return(Resources.Battle_Situation_None); case BattleSituation.航戦: //Parallel Engagement return(Resources.Battle_Situation_Parallel); case BattleSituation.反航戦: //Head-on Engagement return(Resources.Battle_Situation_HeadOn); case BattleSituation.T字有利: //Crossing the T (Advantage) aka Green T return(Resources.Battle_Situation_TAdv); case BattleSituation.T字不利: //Crossing the T (Disadvantage) aka Red T return(Resources.Battle_Situation_TDis); } return(""); }
public BattleSituation Clone() { Situation s = situation.Clone(); BattleSituation bs = new BattleSituation(); bs.situation = s; bs.evaluate = this.evaluate; return bs; }
// "qsort"按历史表排序的比较函数 // static int CompareHistory(const void* lpmv1, const void* lpmv2) { // return Search.nHistoryTable[*(int*)lpmv2] - Search.nHistoryTable[*(int*)lpmv1]; //} // 超出边界(Fail-Soft)的Alpha-Beta搜索过程 int SearchFull(BattleSituation bs,int vlAlpha, int vlBeta, int nDepth,int[] historyTable) { int i, nGenMoves, pcCaptured; int vl, vlBest, mvBest; //int[] mvs = new int[MAX_GEN_MOVES]; // 一个Alpha-Beta完全搜索分为以下几个阶段 // 1. 到达水平线,则返回局面评价值 if (nDepth == 0) { //return pos.Evaluate(); //return 0; return bs.evaluate; } // 2. 初始化最佳值和最佳走法 vlBest = -MATE_VALUE; // 这样可以知道,是否一个走法都没走过(杀棋) mvBest = 0; // 这样可以知道,是否搜索到了Beta走法或PV走法,以便保存到历史表 // 3. 生成全部走法,并根据历史表排序 //nGenMoves = pos.GenerateMoves(mvs); List<int> moves = GenerateMoves(bs.situation); //qsort(mvs, nGenMoves, sizeof(int), CompareHistory); moves.Sort((int x, int y) => { return historyTable[y] - historyTable[x]; }); // 4. 逐一走这些走法,并进行递归 for (i = 0; i < nGenMoves; i++) { if (pos.MakeMove(mvs[i], pcCaptured)) { vl = -SearchFull(-vlBeta, -vlAlpha, nDepth - 1); pos.UndoMakeMove(mvs[i], pcCaptured); // 5. 进行Alpha-Beta大小判断和截断 if (vl > vlBest) { // 找到最佳值(但不能确定是Alpha、PV还是Beta走法) vlBest = vl; // "vlBest"就是目前要返回的最佳值,可能超出Alpha-Beta边界 if (vl >= vlBeta) { // 找到一个Beta走法 mvBest = mvs[i]; // Beta走法要保存到历史表 break; // Beta截断 } if (vl > vlAlpha) { // 找到一个PV走法 mvBest = mvs[i]; // PV走法要保存到历史表 vlAlpha = vl; // 缩小Alpha-Beta边界 } } } } // 5. 所有走法都搜索完了,把最佳走法(不能是Alpha走法)保存到历史表,返回最佳值 if (vlBest == -MATE_VALUE) { // 如果是杀棋,就根据杀棋步数给出评价 return pos.nDistance - MATE_VALUE; } if (mvBest != 0) { // 如果不是Alpha走法,就将最佳走法保存到历史表 Search.nHistoryTable[mvBest] += nDepth * nDepth; if (pos.nDistance == 0) { // 搜索根节点时,总是有一个最佳走法(因为全窗口搜索不会超出边界),将这个走法保存下来 Search.mvResult = mvBest; } } return vlBest; }
public BattleChessControl(BattleChessView view) : base(view.Chessboard) { this.view = view; //battleSituation = view.Chessboard.Situation.clone(); battleSituation = new BattleSituation(view.Chessboard.Situation.clone(),view.Side); InitBattle(); //InitEvaluate(); }
private void BroadCastFeedBack(Frame frames) { byte[] dataS2C = null; // Send UpdateS2C UpdateS2C updateS2C = new UpdateS2C(); updateS2C.battleId = battleId; updateS2C.timestamp = frames.frame; for (int j = 0; j < frames.operations.Count; j++) { updateS2C.ops.Add(frames.operations[j]); } dataS2C = ProtobufUtils.Serialize(updateS2C); for (int i = 0; i < updateS2C.ops.Count; i++) { DebugUtils.Log(DebugUtils.Type.SimulateBattleMessage, string.Format("Frame: Send feed back operation {0}", updateS2C.ops[i].opType)); } simMessageHandlers[MsgCode.UpdateMessage](dataS2C); for (int i = messageList.Count - 1; i >= 0; i--) { if (messageList[i].msgCode == MsgCode.NoticeMessage) { // Send NoticeMessage NoticeC2S noticeC2S = ProtobufUtils.Deserialize <NoticeC2S>(messageList[i].data); SetCurrentBattleResult(noticeC2S); } else if (messageList[i].msgCode == MsgCode.QuitBattleMessage) { // Send QuitBattleMessage DebugUtils.Log(DebugUtils.Type.SimulateBattleMessage, string.Format("Send {0} feed back succeed ", messageList[i].msgCode)); SetCurrentBattleResult(); return; } else if (messageList[i].msgCode == MsgCode.UploadSituationMessage) { // Send UploadSituationMessage UploadSituationC2S uploadSituationC2S = ProtobufUtils.Deserialize <UploadSituationC2S>(messageList[i].data); int type = uploadSituationC2S.type; if (type == 1) { // send data long id = uploadSituationC2S.battleSituation.playerId; List <Battler> battlers = DataManager.GetInstance().GetBattlers(); Battler battler = battlers.Find(p => p.playerId == id); if (battler != null) { BattleSituation situantion = sideBattleSituations[battler.side].Find(p => p.playerId == battler.playerId); ConvertSituantionData(situantion, uploadSituationC2S.battleSituation); } else { DebugUtils.LogError(DebugUtils.Type.SimulateBattleMessage, string.Format("Can't find battler {0} in playback {1}", id, DataManager.GetInstance().GetBattleId())); } } else if (type == 2) { // request data UploadSituationS2C uploadSituationS2C = new UploadSituationS2C(); uploadSituationS2C.type = uploadSituationC2S.type; FillSituantionData(MatchSide.Red, uploadSituationS2C.redBattleSituations); FillSituantionData(MatchSide.Blue, uploadSituationS2C.blueBattleSituations); dataS2C = ProtobufUtils.Serialize(uploadSituationS2C); DebugUtils.Log(DebugUtils.Type.SimulateBattleMessage, string.Format("Send {0} feed back succeed ", messageList[i].msgCode)); Action <byte[]> callback = null; if (simMessageHandlers.TryGetValue(MsgCode.UploadSituationMessage, out callback)) { callback.Invoke(dataS2C); } } } else { //DebugUtils.LogError( DebugUtils.Type.SimulateBattleMessage, string.Format( "Can't handle this local message now message code = {0} ", messageList[i].msgCode ) ); } messageList.RemoveAt(i); } }