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);
            }
        }
Esempio n. 4
0
        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("");
        }
Esempio n. 5
0
 public BattleSituation Clone()
 {
     Situation s = situation.Clone();
     BattleSituation bs = new BattleSituation();
     bs.situation = s;
     bs.evaluate = this.evaluate;
     return bs;
 }
Esempio n. 6
0
        // "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;
        }
Esempio n. 7
0
 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);
            }
        }