/// <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++;
     }
 }
Пример #6
0
 /// <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;
 }
Пример #7
0
 /// <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]); }
 }
Пример #8
0
 /// <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;
Пример #11
0
 /// <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;
 }