我是以下所有错误值的数组
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例如。
我尝试过类似的东西,但RandomElement并不属于......
IEnumerable<bool> queryMoves = deniedMoves.Where(deniedMove => deniedMove !=
true).RandomElement();
我的第一个问题,我非常抱歉糟糕的代码和一般的编码无知。我试过了。
答案 0 :(得分:1)
你所做的就是我所谓的“彩票问题”:你有很多选择。但是,当选择每个选项时,它将从可能的选项列表中删除。就像从一组彩票球中抽取数字一样。
您应该将所有选项存储在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);
}
答案 1 :(得分:0)
我会使用一些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#数组。
答案 2 :(得分:0)
我不确定这是否是你所追求的,它与NetMages&#39;非常相似。回答,但你可以做的一件事是编写一个方法,返回数组中包含function wrongAnswer(name)
{
document.getElementsByName(name)[0].style.backgroundColor = "red";
}
值的所有索引:
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