Ejemplo n.º 1
0
        }         //End_Method

        /// <summary>
        /// 作戦ターン中,定期的にサーバに現在のエージェント情報を送信する
        /// </summary>
        private static void ProcessOfActionSend()
        {
            //情報送信
            var json = JsonToMyFormat.AgentBehaviorsToJsonForSendToServer(GameMaster.Table.MyTeam.Agents);

            Console.WriteLine("jsondata");
            Console.WriteLine(json);
            bool flag;

            Task.Run(() => ComuSaba.SendActionInformationAsync(json, out flag));
        }         //End_Method
Ejemplo n.º 2
0
        }         //End_Method

        /// <summary>
        /// 試合事前情報を取得する
        /// </summary>
        private static bool GetAdvancedGameInfo()
        {
            bool flag;
            var  json = ComuSaba.GetAdvanceInformation(out flag);

            //正常に取得できればGameMasterに反映
            if (flag && json != "")
            {
                JsonToMyFormat.AdvancedGameInfoToVariableOfMyGameMaster(json);
                GameMaster.IsAlreadyGotGameInfo = true;
            }             //ガバ
            else
            {
                Console.ForegroundColor = ConsoleColor.Red;
                Console.WriteLine("試合事前情報取得失敗");
                Console.ForegroundColor = ConsoleColor.White;
            }     //End_IfElse
            return(flag);
        }         //End_Method
Ejemplo n.º 3
0
        }         //End_Method

        /// <summary>
        /// 現在の盤面情報を取得する
        /// </summary>
        /// <returns></returns>
        private static bool GetFieldInfo()
        {
            //すでに取得してたらなにもしない
            if (GameMaster.IsAlreadyGotFiledInfo)
            {
                Console.WriteLine("このターンはすでにフィールド情報を取得していますよ");
                return(false);
            }             //End_If
            bool flag;
            var  json = ComuSaba.GetFieldInformationEachTurn(out flag);

            //正常に取得できればフィールドを更新
            if (flag && json != "")
            {
                GameMaster.Table = JsonToMyFormat.FieldInfoToMyGameTable(json);
            }             //ガバ
            else
            {
                Console.ForegroundColor = ConsoleColor.Red;
                Console.WriteLine("フィールド情報取得失敗");
                Console.ForegroundColor = ConsoleColor.White;
            }     //End_IfElse
            return(flag);
        }         //End_Method
Ejemplo n.º 4
0
        }         //End_Method

        /// <summary>
        /// 送受信,表示等のコマンドを受け付ける
        /// </summary>
        /// <returns></returns>
        public static bool CommandRequest()
        {
            Console.WriteLine("コマンド入力受付開始____");
            while (true)
            {
                var input = Console.ReadLine();

                //終了コマンド
                if (input == "kill")
                {
                    return(true);
                }                                                     //End_If

                //試合事前情報取得
                else if (input == "gameinfo" || input == "game" || input == "g")
                {
                    GameMaster.GetAdvancedGameInfo();
                }                 //End_ElseIf

                //フィールド情報取得
                else if (input == "fieldinfo" || input == "field" || input == "f")
                {
                    GameMaster.GetFieldInfo();
                    GameMaster.IsAlreadyGotFiledInfo = true;
                }                 //End_ElseIf

                //現在のエージェントの行動情報を送信
                else if (input == "sendaction" || input == "send" || input == "s")
                {
                    //正常動作(オブジェクトが作られている(gameinfo,fieldinfoが実行されている)
                    if (GameMaster.Table != null && GameMaster.Table.MyTeam != null && GameMaster.Table.MyTeam.Agents != null)
                    {
                        var  json = JsonToMyFormat.AgentBehaviorsToJsonForSendToServer(GameMaster.Table.MyTeam.Agents);
                        bool flag;
                        var  task = Task.Run(() => {
                            ComuSaba.SendActionInformationAsync(json, out flag);
                            Console.WriteLine("Send Action JSON");
                            Console.WriteLine(json);
                        });
                    }                     //だめです
                    else
                    {
                        Console.WriteLine("GameMaster.Table.MyTeam.Agents がnullです");
                        Console.WriteLine("gameinfo, fieldinfoがすでに実行されているか確認してください");
                    }             //End_IfElse
                }                 //End_ElseIf

                //接続確認
                else if (input == "ping" || input == "p")
                {
                    bool flag;
                    var  json = ComuSaba.SendPing(out flag);
                    Console.WriteLine("Ping : " + json);
                }                 //End_ElseIf

                //試合開始
                else if (input == "gamestart")
                {
                    if (GameMaster.IsAlreadyStartedGame)
                    {
                        Console.WriteLine("すでに試合開始コマンドは受理されてますよ");
                        continue;
                    }                     //End_If

                    GameMaster.GameStart();
                    GameMaster.IsAlreadyStartedGame = true;
                }                 //End_ElseIf

                //ガバ入力
                else
                {
                    Console.ForegroundColor = ConsoleColor.Red;
                    Console.WriteLine("Unexpected Input");
                    Console.ForegroundColor = ConsoleColor.White;
                    Console.WriteLine("試合開始 :gamestart");
                    Console.WriteLine("試合事前情報取得 : gameinfo  or  game  or  g");
                    Console.WriteLine("試合状態取得 : fieldinfo  or  field  or  f");
                    Console.WriteLine("行動情報送信 : sendaction  or  send  or  s");
                    Console.WriteLine("接続確認 : ping  or  p");
                }                 //End_IfElse

                //整形
                Console.WriteLine();
            }     //End_Whille
        }         //End_Method
Ejemplo n.º 5
0
        }         //End_Method

        /// <summary>
        //	遷移ターン終了時の処理
        /// </summary>
        private static void ProcessOfEndOfInterval()
        {
            //作戦ターンタイマーを起動
            Console.ForegroundColor = ConsoleColor.Yellow;
            Console.WriteLine("作戦ターン時間");
            Console.WriteLine("StartedAt : " + GameMaster.StartedAtUnixTime);
            Console.WriteLine("TurnMills : " + GameMaster.TurnMillis);
            Console.WriteLine("IntervalM : " + GameMaster.IntervalMillis);
            Console.WriteLine("ElapsedTu : " + GameMaster.GetNowUnixTimeMilliSeconds());
            Console.WriteLine("ElapsedTu : " + GameMaster.Table.ElapsedTurn);
            Console.WriteLine("TimerTurn : " + (GameMaster.StartedAtUnixTime + (GameMaster.TurnMillis * (GameMaster.Table.ElapsedTurn + 1)) + (GameMaster.IntervalMillis * (GameMaster.Table.ElapsedTurn)) - GameMaster.GetNowUnixTimeMilliSeconds()));
            Console.ForegroundColor       = ConsoleColor.White;
            GameMaster.TurnTimer.Interval = GameMaster.StartedAtUnixTime + (GameMaster.TurnMillis * (GameMaster.Table.ElapsedTurn + 1)) + (GameMaster.IntervalMillis * (GameMaster.Table.ElapsedTurn)) - GameMaster.GetNowUnixTimeMilliSeconds();
            GameMaster.TurnTimer.Start();

            //フィールド情報を取得
            Console.WriteLine("フィールド情報を取得します");
            while (!GameMaster.GetFieldInfo())
            {
                System.Threading.Thread.Sleep(100);
                Console.WriteLine("再度,フィールド情報を取得します");
            }             //End_While
            GameMaster.IsAlreadyGotFiledInfo = true;

            //各Solverのフィールド情報を更新
            for (int i = 0; i < GameMaster.Table.AgentNum; ++i)
            {
                //Solverの型情報を取得
                var type = GameMaster.Table.MyTeam.Agents[i].Solver.GetType();
                //GameMaster.Table.MyTeam.Agents[i].Solver.Dispose();
                var seed = GameMaster.RandomToSolver.Next();

                GameMaster.Table.MyTeam.Agents[i].Solver = (Solver_Abstract)Activator.CreateInstance(type, new object[] { GameMaster.Table, seed });
            }             //End_For
                          //GUIからSolver自体の更新がある場合(上書き)
            for (int i = 0; i < GameMaster.RequestsChangeAgentType.Count; ++i)
            {
                for (int j = 0; j < GameMaster.Table.MyTeam.Agents.Length; ++j)
                {
                    if (GameMaster.RequestsChangeAgentType[i].AgentID == GameMaster.Table.MyTeam.Agents[j].AgentID)
                    {
                        //攻撃型のとき
                        if (GameMaster.RequestsChangeAgentType[i].Tactics == "Attack")
                        {
                            GameMaster.Table.MyTeam.Agents[j].Solver = new Solver_Bebebe(GameMaster.Table);
                        }                         //End_If
                        else if (GameMaster.RequestsChangeAgentType[i].Tactics == "Deffence")
                        {
                        }
                        else if (GameMaster.RequestsChangeAgentType[i].Tactics == "Obstruction")
                        {
                        }
                    }     //End_If
                }         //End_For
            }             //End_For
            GameMaster.RequestsChangeAgentType = new List <_ReceiveChangeAgentType>();
            Console.WriteLine("Solverの更新を完了しました");

            //データ送信用タイマーを起動
            GameMaster.ActionSendTimer.Start();

            //遷移ターンタイマーをリセット
            GameMaster.IntervalTimer.Stop();

            //GUI更新(非同期)
            var task = ComuShow.SendFieldInfoToComuShowAsync(JsonToMyFormat.FieldInfoToComuShowField());

            Console.ForegroundColor = ConsoleColor.Green;
            Console.WriteLine();
            Console.WriteLine("ターン:" + (GameMaster.Table.ElapsedTurn) + " 作戦ターン開始!\r\n");
            Console.ForegroundColor = ConsoleColor.White;
        }         //End_Method
Ejemplo n.º 6
0
        }         //End_Method

        //-----------------------publicメソッド-----------------------
        /// <summary>
        /// 接続要求待ち
        /// 常時起動しておく
        /// </summary>
        public static async Task <bool> StartWaitingForReceptionFromGUI()
        {
            //HttpListenerで待ち受け
            var listener = new HttpListener();

            listener.Prefixes.Add("http://localhost:" + ComuShow.PortNo + "/");
            listener.Start();

            Console.WriteLine("WebSocket接続受付開始");

            //接続待ちループ
            while (true)
            {
                //接続待機
                var listenerContext = await listener.GetContextAsync();

                //WebSocketでのリクエスト時
                if (listenerContext.Request.IsWebSocketRequest)
                {
                    //接続先のWebSocketを取得
                    WebSocketClient = (await listenerContext.AcceptWebSocketAsync(subProtocol: null)).WebSocket;
                    Console.WriteLine("{0} : New Session", DateTime.Now.ToString("yyyy:mm:dd_hh:MM:ss.fff"));

                    //WebSocketの接続が取れたのでデータ受信待機
                    try {
                        while (true)
                        {
                            //受信用配列
                            var buff = new ArraySegment <byte>(new byte[ComuShow.MaxBuffer]);
                            //受信待機
                            var ret = await ComuShow.WebSocketClient.ReceiveAsync(buff, System.Threading.CancellationToken.None);

                            //正常に
                            if (ret.MessageType == WebSocketMessageType.Text)
                            {
                                var json = Encoding.UTF8.GetString(buff.Take(ret.Count).ToArray());
                                JsonToMyFormat.ComuShowRequestToChangeSolver(json);
                            }                             //End_If
                            else if (ret.MessageType == WebSocketMessageType.Close)
                            {
                                Console.WriteLine("接続終了要求を受信,接続を終了します");
                                ComuShow.WebSocketClient.Dispose();
                                break;
                            }                             //呼ばれないと思うけど
                            else
                            {
                                Console.WriteLine("想定外のメッセージタイプ : " + ret.MessageType.ToString());
                                Console.WriteLine("このまま受信を続けますが想定外の動作をする可能性があります");
                            }             //End_Else
                        }                 //End_While
                    }                     //End_Try
                    catch (Exception e) {
                        Console.WriteLine("WebSocketで例外");
                        Console.WriteLine(e.ToString());
                    }             //End_TryCatch
                }                 //他の要求が来たときはHTTPレスポンス
                else
                {
                    listenerContext.Response.StatusCode = 400;
                    listenerContext.Response.Close();
                }         //End_IfElse
            }             //End_While

            return(true);
        }         //End_Method