} //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
} //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
} //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
} //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
} //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
} //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