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#数组。