protected override void Turn(int turn, Action <Intent> agent1, Action <Intent> agent2) { Intent intent1 = Agent1.NextIntent(CalculateProhibitedPoints(Team.Agent1).ToArray()), intent2 = Agent2.NextIntent(CalculateProhibitedPoints(Team.Agent2).ToArray()); ScoringEfficiency scoringEfficiency1 = Agent1.Evaluate() , scoringEfficiency2 = Agent2.Evaluate(); //自エージェント同士の移動先が重なってしまった場合 if (intent1.GetNextPoint(Team.Agent1.Position) == intent2.GetNextPoint(Team.Agent2.Position)) { //点数が低い方のエージェントの移動を変える if (scoringEfficiency1.Efficiency > scoringEfficiency2.Efficiency) {//2を変える List <Point> list = CalculateProhibitedPoints(Team.Agent2); list.Add(intent1.GetNextPoint(Team.Agent1.Position)); intent2 = Agent2.NextIntent(list.ToArray()); scoringEfficiency2 = Agent2.Evaluate(); } else {//1を変える List <Point> list = CalculateProhibitedPoints(Team.Agent1); list.Add(intent2.GetNextPoint(Team.Agent2.Position)); intent1 = Agent1.NextIntent(list.ToArray()); scoringEfficiency1 = Agent1.Evaluate(); } } //盤面に表示 InvokeOnUIThread(() => Label1.Content = string.Format("Agent1 Effic:{0,4:F2} NTurn:{1,4:F2} Total:{2,4:F2}", scoringEfficiency1.Efficiency, scoringEfficiency1.ExpectedTurns, scoringEfficiency1.Efficiency * scoringEfficiency1.ExpectedTurns)); InvokeOnUIThread(() => Label2.Content = string.Format("Agent2 Effic:{0,4:F2} NTurn:{1,4:F2} Total:{2,4:F2}", scoringEfficiency2.Efficiency, scoringEfficiency2.ExpectedTurns, scoringEfficiency2.Efficiency * scoringEfficiency2.ExpectedTurns)); agent1(intent1); agent2(intent2); }