Exemple #1
0
        public void CalcNextAction(ReversiBoard board)
        {
            var puttables = board.ListupPuttables(this.mark);

            if (puttables.Count == 0)
            {
                this.nextAction = ReversiAction.Pass();
                return;
            }
            Random rd = new Random();
            var    p  = puttables [rd.Next(puttables.Count)];

            this.nextAction = ReversiAction.PutAt(p.X, p.Y);
        }
        // 戦うよ、君が立ち上がり続ける限りは
        public static void Battle(dynamic json)
        {
            ReversiRemotePlayer remote = new ReversiRemotePlayer(); // あいて
            ReversiRandomPlayer random = new ReversiRandomPlayer(); // じぶん
            ReversiManager      reversi;                            // こいつがリバーシと言える

            ReversiAction nextAction;                               // いろんなところで使うから先に宣言しているけどこういうの良くない

            if (!json.IsDefined("first"))
            {
                throw new Exception("first is not defined, contact to admin");
            }

            if (json.first == "true")
            {
                // 先攻
                random.SetMark(ReversiMark.BLACK);
                remote.SetMark(ReversiMark.WHITE);
                reversi = new ReversiManager(random, remote);

                // 先攻なので行動します
                nextAction = reversi.Next();
                var obj = new {
                    action = "put",
                    pos    = new int[] { nextAction.GetPutAt().X, nextAction.GetPutAt().Y }
                };
                Send(DynamicJson.Serialize(obj));

                dynamic recv = DynamicJson.Parse(Recv());
                Console.WriteLine(recv);
                string r = CheckResult(recv);
                if (r.Length > 0)
                {
                    // ここで false が返ってきててもどうにもできない
                    throw new Exception(r);
                }
            }
            else
            {
                // 後攻
                remote.SetMark(ReversiMark.BLACK);
                random.SetMark(ReversiMark.WHITE);
                reversi = new ReversiManager(remote, random);
            }

            // 戦いの渦中に身を置く
            while (true)
            {
                dynamic recv = DynamicJson.Parse(Recv());
                string  r    = CheckResult(recv);
                if (r.Length > 0)
                {
                    // ここで false が返ってきててもどうにもできない
                    throw new Exception(r);
                }
                if (CheckEnd(recv))
                {
                    break;
                }

                // あいての手をremoteに反映
                if (recv.action == "pass")
                {
                    remote.SetNextAction(ReversiAction.Pass());
                    reversi.Next();
                }
                else if (recv.action == "put")
                {
                    int x = (int)recv.pos [0];                     // double で返ってくる
                    int y = (int)recv.pos [1];
                    nextAction = ReversiAction.PutAt(x, y);
                    remote.SetNextAction(nextAction);
                    reversi.Next();
                }
                else                     // close がありうる(けどここまでこないな)
                {
                    break;
                }

                while (true)
                {
                    // 自分の番
                    nextAction = reversi.Next();
                    if (nextAction.IsPass())
                    {
                        var obj = new {
                            action = "pass"
                        };
                        Send(DynamicJson.Serialize(obj));
                    }
                    else
                    {
                        var obj = new {
                            action = "put",
                            pos    = new int[] { nextAction.GetPutAt().X, nextAction.GetPutAt().Y }
                        };
                        Send(DynamicJson.Serialize(obj));
                    }
                    recv = DynamicJson.Parse(Recv());
                    r    = CheckResult(recv);
                    if (r.Length > 0)
                    {
                        Console.WriteLine("ERROR: " + r);
                        continue;
                    }
                    break;
                }
                if (CheckEnd(recv))
                {
                    break;
                }
            }
        }