私はマルチプレイヤーゲームをコーディングしています。このゲームでは、各プレイヤーはグループ内のすべてのプレイヤーと1回だけプレイする必要があります。つまり、ジョー、メアリー、ピーターの3人のプレーヤーがいる場合、これらはジョーとメアリー、ジョーとピーター、メアリーとピーターの組み合わせになります。
ラウンド数を計算するコードは非常に簡単でした。ラウンド数はnに等しいので!/ r!*(n-r)!ここで、nはプレーヤーの数に等しく、rは2に等しくなります(ゲームは各ラウンドで2人のプレーヤーでプレイされているため)。
public int factorial(int n)
{
if (n == 0)
return 1;
return n * factorial(n - 1);
}
public int calcNoOfRounds()
{
return factorial(noOfPlayers) / (factorial(2) * factorial(noOfPlayers -2));
}
ただし、実際のプレーヤーの組み合わせを返す効率的な方法を作成することに固執しています。次のコードを試しました。動作しますが、手作業が多すぎて改善したいことがあります。このコードでは、p1とp2、p2とp3、p3とp4 ... p(n-1)とp(n)をペアリングしています。次に、3番目のプレーヤーから始めて、それらのプレーヤーを、前のプレーヤーを除く上記のすべてのプレーヤーと照合します。つまり、p3対p1、p4対p1、p4対p2、p5対p1、p5対p2、p5対p3などです。 。もっと良い方法でできると思いますか?
public void calcPlayerCombinations()
{
List<string> playerNames = new List<string>();
for (int i = 0; i < noOfPlayers; i++)
{
playerNames.Add(players[i].PlayerName);
}
for (int i = 0; i < noOfPlayers - 1; i++)
{
playerCombinations.Add(playerNames[i] + " " + playerNames[i + 1]);
}
for (int j = 3; j <= noOfPlayers; j++)
{
int counter = 1;
do
{
playerCombinations.Add(playerNames[j -1] + " " + playerNames[counter -1]);
counter++;
} while (counter != (j - 1));
}
}
ゲームが実際にプレイされている場合、同じプレーヤーが6つの連続したゲームをどのようにプレイするのか、この方法は好きではありません。はい、ラウンドの組み合わせをランダムに選ぶことができましたが、それでも、将来の参照のためのより良い方法を知りたいです。
助けてくれてありがとう!