在一个简单的游戏中 我有4种可能的动作(上,下,左,右) 对于每个球员
player1: up, player2:up, player3:up
player1: up, player2:up, player3:left
player1: up, player2:up, player3:right
player1: up, player2:up, player3:down
player1: up, player2:left, player3:up
....
....
我有n个玩家,例如3个,但这个数字不是一成不变的。
我需要枚举所有可能移动到数组中。 例如:
item[0] = {up,up,up};
item[1] = {up,up,down};
item[2] = {up,up,left};
item[3] = {up,up,right};
item[4] = {up,down,up};
....
将所有玩家的所有可能动作枚举成阵列的最佳方法是什么?
结果数组必须是:
{{1}}
拜托,你能帮助我吗?
答案 0 :(得分:1)
假设你有4个玩家,每个玩家有4个可能的动作。共有256种组合。 n个玩家,4个移动=> 4 ^ N 将您的动作映射到数字 Up - 0, 下来 - 1, 左 - 2, 右 - 3然后将256(10的基数)转换为4的基数,你将获得10000.所以从0到3333(以4为基数)迭代并提取每个数字位置并相应地为每个玩家绘制地图。 在一个例子中,2330的数字意味着 - 第一名球员 - 左,第二名球员 - 右,第三名 - 右,第四名 -
答案 1 :(得分:1)
使用此枚举:
public enum Direction
{
Up,
Down,
Right,
Left
}
尝试使用Enum.GetValues Method迭代枚举值并使用this Linq SelectMany重载(允许您从两个IEnumerables项中创建每个组合)来创建所有组合:
var options = Enum.GetValues(typeof(Direction)).Cast<Direction>()
.SelectMany(firstValue => Enum.GetValues(typeof(Direction)).Cast<Direction>(),
(firstValue, secondValue) => new { firstValue, secondValue})
.SelecyMany(firstValues => Enum.GetValues(typeof(Direction)).Cast<Direction>(),
(firstValues, lastValue) => new {firstValues.firstValue, firstValues.secondValue, lastValue}).ToList();
您也可以替换最后一个SelectMany来创建一个3长度数组作为列表项而不是匿名类型,只需用最后一行替换:
(firstValues, lastValue) => new Direction[] {firstValues.firstValue, firstValues.secondValue, lastValue}).ToList();
答案 2 :(得分:1)
假设你有一个像
这样的枚举enum Move
{
Up,
Down,
Left,
Right
}
一种方法是迭代一个整数并将此整数转换为基数4.结果将是:
<00> 0000 - &gt; 0001 ---&gt; 0002 ---&gt; 0003 - &gt; 0010 - &gt; ...... ---&gt; 3333您可以获取数字的每个数字并将其转换为枚举值。以下是生成的方法:
private static List<Move[]> GetPossibleMoves(int NumberOfPlayers)
{
int Combination = 0;
List<Move[]> PossibleMoves = new List<Move[]>();
while (true)
{
List<int> Digits = IntToString(Combination, new char[] { '0', '1', '2', '3' })
.PadLeft(NumberOfPlayers, '0')
.Select(D => Convert.ToInt32(D.ToString()))
.ToList();
if (Digits.Count() > NumberOfPlayers)
{
break;
}
else
{
Move[] Moves = new Move[NumberOfPlayers];
for (int Player = 0; Player < NumberOfPlayers; Player++)
{
Moves[Player] = (Move)Digits[Player];
}
PossibleMoves.Add(Moves);
}
Combination++;
}
return PossibleMoves;
}
作为转换为基础4的助手,您可以在this question处使用Dirk Vollmar的方法:
private static string IntToString(int value, char[] baseChars)
{
string result = string.Empty;
int targetBase = baseChars.Length;
do
{
result = baseChars[value % targetBase] + result;
value = value / targetBase;
}
while (value > 0);
return result;
}
结果将是:
Up,Up,Up,Up
Up,Up,Up,Down
向上,向上,向上,向左
Up,Up,Up,Right
Up,Up,Down,Up
...
权利,权利,权利