フィクスチャ作成のコンソール アプリケーション プロジェクトに取り組んでいますが、小さな問題があります。チーム プロパティ (名前など) を保持する Team クラスがあります。これらのプロパティの中には、チームのライバルを保持する Rivals 配列があります。それらは再び一致することはありません.(この配列からチェックします.)私は4つのリストを作成しました:
List<Team> Home = new List<Team>(9); //Holds teams which play at Home
List<Team> Away = new List<Team>(9); //Holds teams which play at Away
List<Team> TempHomeList = new List<Team>(9); //Holds teams which play at home current week(purpose is swapping teams to Home to Away week to week.)
List<Team> TempAwayList = new List<Team>(9); //Holds teams which play at away current week.
最初は、チームの半分をホームリストに、残りの半分をアウェイリストに割り当てました。それらを一致させようとすると、プログラムは数週間まで実行されますが、この週を過ぎるとクラッシュし、プログラムはその週のみを無限ループで出力します私のコードとスクリーンショットは次のとおりです。
宣言:
int counter = 0;
int[] HomeRandomHolder = new int[Home.Count];//holds random numbers 0-8
int[] AwayRandomHolder = new int[Away.Count];//holds random numbers 0-8
int[] ReplayRandomHolder = new int[MatchesPerWeek];//Holds random numbers 0-8.This array will show up for assignmets which will be after 17th week.
Competition[,] matches = new Competition[WeekNumber, MatchesPerWeek];//Competition class holds two teams which will be play with each other.
bool found=true;//checks if altenative way of match between teams have found.
コード:
for (int i = 0; i < WeekNumber / 2; i++) //There will be 34 weeks and I will assign first 17 weeks.(1st week's teams will be swapped Home to Team and will be assigned to 18.week.And it will go on so far until 34.week.)
{
Console.WriteLine("\nWeek:" + i);
Console.WriteLine("-----------------------------");
HomeCount = Home.Count;
AwayCount = Away.Count;
for (int j = 0; j < MatchesPerWeek; j++) // There will be 9 matches per week.
{
ReplayRandomHolderCounter = 0;
matchCounter = 0;
temporaryHome = Home[HomeRandomHolder[matchCounter] % HomeCount];
temporaryAway = Away[AwayRandomHolder[matchCounter] % AwayCount];
if (i == 0)
{
if (j == 0)
{
matches[i, j].FillCompetition(temporaryHome, temporaryAway);
temporaryHome.Rival[i] = temporaryAway;
temporaryAway.Rival[i] = temporaryHome;
TempHomeList.Add(temporaryHome);
TempAwayList.Add(temporaryAway);
Home.Remove(temporaryHome);
Away.Remove(temporaryAway);
HomeCount--;
AwayCount--;
matches[i + (WeekNumber / 2), ReplayRandomHolder[ReplayRandomHolderCounter]].FillCompetition(temporaryAway, temporaryHome);//FillCompetition function assigns two teams to match.
}
else
{
counter = 0;
while (temporaryHome.Rival.Contains(temporaryAway) && temporaryAway.Rival.Contains(temporaryHome))
{
if (counter == Away.Count)
{
j--;
found = false;
break;
}
temporaryAway = Away[counter];
counter++;
}
if (found)
{
matches[i, j].FillCompetition(temporaryHome, temporaryAway);
temporaryHome.Rival[i] = temporaryAway;
temporaryAway.Rival[i] = temporaryHome;
TempHomeList.Add(temporaryHome);
TempAwayList.Add(temporaryAway);
Home.Remove(temporaryHome);
Away.Remove(temporaryAway);
HomeCount--;
AwayCount--;
matches[i + (WeekNumber / 2), ReplayRandomHolder[ReplayRandomHolderCounter]].FillCompetition(temporaryAway, temporaryHome);
}
}
}
else
{
if (temporaryHome.Rival.Contains(temporaryAway) && temporaryAway.Rival.Contains(temporaryHome))
{
counter = 0;
while (temporaryHome.Rival.Contains(temporaryAway) && temporaryAway.Rival.Contains(temporaryHome))
{
if (counter == Away.Count)
{
j--;
found = false;
break;
}
temporaryAway = Away[counter];
counter++;
}
if (found)
{
matches[i, j].FillCompetition(temporaryHome, temporaryAway);
temporaryHome.Rival[i] = temporaryAway;
temporaryAway.Rival[i] = temporaryHome;
TempHomeList.Add(temporaryHome);
TempAwayList.Add(temporaryAway);
Home.Remove(temporaryHome);
Away.Remove(temporaryAway);
HomeCount--;
AwayCount--;
matches[i + (WeekNumber / 2), ReplayRandomHolder[ReplayRandomHolderCounter]].FillCompetition(temporaryAway, temporaryHome);
}
if (!found) //I think this part causes the error
{
j = 0;
i--;
Home.AddRange(TempHomeList);
Away.AddRange(TempAwayList);
TempHomeList.Clear();
TempAwayList.Clear();
found = true;
break;
}
}
else
{
matches[i, j].FillCompetition(temporaryHome, temporaryAway);
temporaryHome.Rival[i] = temporaryAway;
temporaryAway.Rival[i] = temporaryHome;
TempHomeList.Add(temporaryHome);
TempAwayList.Add(temporaryAway);
Home.Remove(temporaryHome);
Away.Remove(temporaryAway);
HomeCount--;
AwayCount--;
}
}
Console.WriteLine(temporaryHome.name + " vs " + temporaryAway.name);//Prints competition teams
}
ShuffleHomeAndAway(ref TempHomeList, ref TempAwayList, ref Home, ref Away); //It shuffles Home and Away per week.
}
}
ShuffleHomeAndAway 関数のコード:
public void ShuffleHomeAndAway(ref List<Team> TempHome, ref List<Team> TempAway, ref List<Team> Home, ref List<Team> Away)
{
Home.AddRange(TempAway);
Away.AddRange(TempHome);
TempHome.Clear();
TempAway.Clear();
}
出力: