所有球员的所有可能动作

时间:2016-10-22 09:12:29

标签: c#

在一个简单的游戏中 我有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}}

拜托,你能帮助我吗?

3 个答案:

答案 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

     

...

     

权利,权利,权利