/// <summary> /// 指定したところにエージェントが移動します。 /// </summary> /// <param name="team">移動させるチーム</param> /// <param name="agent">移動させるエージェント</param> /// <param name="agentActivityData"></param> public void MoveAgent(Team team, AgentNumber agent, AgentActivityData agentActivityData) { var agentActivityDatas = new AgentsActivityData(AgentStatusCode.RequestNotToDoAnything); agentActivityDatas[team, agent] = agentActivityData; MoveAgent(agentActivityDatas); }
/// <summary> /// エージェントを動かしたときに、状態がどう変化するか計算します。 /// </summary> /// <param name="action">どうエージェントが動くか指定します。</param> /// <returns>エージェントを動かしたときの計算データが返ってきます。</returns> public Calc Simulate(Team team, AgentNumber agentNumber, AgentActivityData action) { var c = new Calc(Calc); c.MoveAgent(team, agentNumber, action.DeepClone()); return(c); }
/// <summary> /// エージェントを動かしたときに、状態がどう変化するか計算します。 /// </summary> /// <param name="team">どのチームが動くか指定します。</param> /// <param name="agentNumber">どのエージェントが動くか指定します。</param> /// <param name="action">どうエージェントが動くか指定します。</param> /// <returns>エージェントを動かしたときの計算データが返ってきます。</returns> public Calc Simulate(Team team, AgentNumber agentNumber, AgentActivityData action) { var c = new Calc(this); c.MoveAgent(team, agentNumber, new AgentActivityData(action)); return(c); }
/// <summary> /// 指定したところにエージェントが移動します。 /// </summary> /// <param name="team">移動するチーム</param> /// <param name="agent">移動するエージェント</param> /// <param name="where">移動する場所</param> public void MoveAgent(Team team, AgentNumber agent, Coordinate where) { bool movable = false; movable = Field[where.X, where.Y].IsTileOn[team.Opponent()]; if (movable) { RemoveTile(point: where); CheckEnclosedArea(team.Opponent()); } else { Agents[team, agent].Position = where; PutTile(team: team, agent: agent); } CheckEnclosedArea(team); foreach (Cell item in Field) { if (item.IsTileOn[Team.A]) { item.IsEnclosed[Team.A] = false; } if (item.IsTileOn[Team.B]) { item.IsEnclosed[Team.B] = false; } } }
/// <summary> /// ターンエンドします。 /// </summary> public void TurnEnd() { if (Turn < MaxTurn) { // TurnData作成 var a = new Agents(); for (Team team = 0; (int)team < Enum.GetValues(typeof(Team)).Length; team++) { for (AgentNumber agent = 0; (int)agent < Enum.GetValues(typeof(AgentNumber)).Length; agent++) { a[team, agent] = new Agent(Agents[team, agent]); } } History.Add(new TurnData(new Field(Field), a)); Turn++; } }
/// <summary> /// AgentDataの初期化します。 /// </summary> /// <param name="name">名前を設定します</param> /// <param name="team">チーム名を設定します</param> /// <param name="agentNumber">エージェント番号を設定します</param> public Agent(string name, Team team, AgentNumber agentNumber) { Name = name; Team = team; AgentNumber = agentNumber; }
/// <summary> /// フルーツフェアリーを取得または設定します /// </summary> /// <param name="team">対象となる所属チーム</param> /// <param name="agent">対象となるエージェント番号</param> /// <returns></returns> public FruitFairy this[Team team, AgentNumber agent] { set { Array[(int)team, (int)agent] = value; } get { return(Array[(int)team, (int)agent]); } }
/// <summary> /// エージェントアクティビティデータを取得または設定します /// </summary> /// <param name="team">対象となる所属チーム</param> /// <param name="agent">対象となるエージェント番号</param> /// <returns></returns> public AgentActivityData this[Team team, AgentNumber agent] { set { Array[(int)team, (int)agent] = value; } get { return(Array[(int)team, (int)agent]); } }
/// <summary> /// 自分のフィールドにタイルを置きます。 /// </summary> /// <param name="team">対象となるチーム</param> /// <param name="agent">対象となるエージェント</param> public void PutTile(Team team, AgentNumber agent) => Field[Agents[team, agent].Position].IsTileOn[team] = true;
/// <summary> /// 対象となるマスに対象となるエージェントがいるか、またはムーア近傍にいるかを判定します /// </summary> /// <param name="team">対象となるチーム</param> /// <param name="agentNumber">対象となるエージェント</param> /// <param name="point">対象となるマス</param> /// <returns>対象となるマスにエージェントがいるか、またはムーア近傍にいたら真、そうでなければ偽</returns> public bool IsAgentHereOrInMooreNeighborhood(Team team, AgentNumber agentNumber, Coordinate point) => (Agents[team, agentNumber].Position.ChebyshevDistance(point) <= 1) ? true : false;
/// <summary> /// フルーツフェアリーを初期化します。 /// </summary> /// <param name="name">名前を設定します</param> /// <param name="team">チーム名を設定します</param> /// <param name="agentNumber">エージェント番号を設定します</param> public FruitFairy(string name, Team team, AgentNumber agentNumber) { Name = name; Team = team; AgentNumber = agentNumber; }