通过排除该数组的某些元素值来获取该数组元素索引



i所有错误值的以下数组

bool[] deniedMoves = new bool[64];

想到一个带有X可能动作的游戏板。进行动作后,记录下来,在下一场比赛中,某些动作变得不可能。像GO这样的游戏将适合此描述,因为您无法在已经玩过的十字路口上玩。

我希望" AI"从可能的动作列表中随机移动。第一步还可以:

Random randMove1 = new Random();
int selectedMove1 = randMove1.Next(1, deniedMoves.Length);

然后,此举将我数组中的某些值设置为true。

例如:

void Reset()
{
    if (mainBoard[0, 0] == 1)
        deniedMoves[0] = true;
    deniedMoves[3] = true;
    deniedMoves[5] = true;
}

下一个随机移动" AI"将无法从所有64种可能性中进行选择,因此我不希望它随机化为5。

我尝试了这样的事情,但是随机元不属于...

IEnumerable<bool> queryMoves = deniedMoves.Where(deniedMove => deniedMove !=             
true).RandomElement();

我的第一个问题,我为不良的代码和一般编码无知感到非常抱歉。我尝试过。

您正在做的是我所说的"彩票问题":您有很多选项。但是,当选择每个选项时,将其从可能选项的TE列表中删除。您从一组彩票球中绘制数字的方式相同。

您应该将所有选项存储在List<bool>中,并在绘制/使用它们时删除元素。示例代码主要在我的脑海中完成:

int[] input = new int[20]();
//Fill array
for(int i = 0; i < numbers.lenght; i++)
  input[i] = i;
//initialise the real work variables
List<int> Drawables = new List<int>(input);
List<int> DrawnNumbers = new List<int>();
Random rng = new Random();
while(Drawables.Count > 0){
  int temp = Random.NextInt(Drawables.Count);
  DrawnNumbers = Drawables[i];
  Drawables.Remove(temp);
}

我不确定这是您所追求的,它与NetMages的答案非常相似,但是您可以做的一件事是编写一种返回所有索引的方法包含false值的数组:

private static IEnumerable<int> GetIndexesOfFalseItems(IEnumerable<bool> allItems)
{
    return allItems
        .Select((value, index) => new { value, index })
        .Where(item => item.value == false)
        .Select(item => item.index);
}

然后,要从值为false的数组中选择一个随机项目,您可以做:

private static readonly Random Rnd = new Random();
private static void Main()
{
    // Initialize all moves to false
    bool[] allMoves = new bool[64];
    for (int i = 0; i < allMoves.Length; i++) allMoves[i] = false;
    // Pretend a move was made and set some to true
    allMoves[0] = true;
    allMoves[3] = true;
    allMoves[5] = true;
    // Get ALL indexes of 'false' items (currently everything except 0, 3, and 5)
    var validIndexes = GetIndexesOfFalseItems(allMoves).ToList();
    // Choose a random item from that list
    var randomValidIndex = validIndexes[Rnd.Next(validIndexes.Count)];
    // Now we get our next move from our main list at that index
    var nextMove = allMoves[randomValidIndex];
    // Rest if game code...
}

我会使用一些linq-这可能不是最有效的答案...

bool[] deniedMoves = new bool[64];
System.Random randMove1 = new System.Random();

首先,在允许的移动中选择随机移动:

int allowedMove = randMove1.Next(0, deniedMoves.Count(d => !d)-1);

然后获取实际移动索引:

int selectedMove = deniedMoves.Select((d, i) => new { d, i })
                              .Where(di => !di.d)
                              .Skip(allowedMove)
                              .First().i;

我将动作从0-63更改为匹配c#数组。

最新更新