我必须解决这个问题的想法是组成一个大小为8x8的缓冲区,用指向我的检查器的指针(所有20个)填充它,其余的离开0(null),然后运行一个shuffling算法在缓冲区上,就是这样(只是把它读成8x8数组)
答案 0 :(得分:7)
为了搭载Borzio的想法,当你接近第二十件时,有三分之一的机会你需要重新生成随机数并再试一次。有20件,你可能仍然是安全的,但如果你有40件,那么你的机会就会超过两分之一,而你可能会等待一段时间。
emptySquareList
)。0
和emptySquareList.Length-1
之间生成一个随机数。emptySquareList
。这样,你总是维护一个空方块的列表,并从中进行选择。请注意,电路板阵列中的索引数组也可以更快地运行(Enumerable.Range(0,64)
)。
我鼓励你尝试使用随机和检查算法,以及这个算法;看哪一个更有效率。
答案 1 :(得分:0)
一个8x8矩阵,包含指向对象或引用(c#/ java)的指针(c ++),这似乎是一个非常合理的设计。
您可以使用64个元素的一维数组(您可以轻松地将2D索引映射到一维数组)并使用以下内容:
using System;
using System.Linq;
Piece[] board = whatever();
// New random number generator.
Random random = new Random();
// LINQ query orders each element by the next random number.
Piece[] randomBoard = (from piece in board
orderby random.Next()
select piece).ToArray();
注意:我不是c#程序员,但这似乎是合理的。
要将x,y对转换为数组索引,请使用以下算法:
int index = (y * 8) + x;
注意2:我不知道你是否必须遵守跳棋的放置规则,如果你这样做,你需要做一些更聪明的事情。你可能有一个32个元素的数组(代表所有的黑色方块)。在其中随机播放,然后将32个大数组中的每个元素分配给真实64个元素数组的每个“黑色”方块。
答案 2 :(得分:0)
如果你必须遵循放置规则,给定你的8x8矩阵示例,我也会认为它是一个1d数组,正如Evan指出的那样 - (参见他确定x& y的数学) -
黑白方块是奇数和偶数索引值;但是,嘿,你从来没有说过你需要放置规则 - 我也认为你不是在寻找c#代码而是在寻找更多“逻辑”级别的想法...
如果您正在尝试使用Linq-Challenged解决方案,请考虑以下事项;
只有一个想法肯定会很多 -
希望它有所帮助...
答案 3 :(得分:0)
回答提出的问题:
说真的,你还没有给我们足够的信息来继续回答这个问题。这是一些问题:
假设没有规则要遵循,除了你需要将所有20个放在板上,即。没有碰撞,这将做你想要的:
Piece[] pieces = ... your 20 pieces here
Piece[] board = new Piece[8 * 8];
Random r = new Random();
foreach (Piece piece in pieces)
{
while (true)
{
Int32 location = r.Next(board.Length);
if (board[location] == null)
{
board[location] = piece;
break;
}
}
}
一个更简单的解决方案,只要你已经在某处有辅助例程,就是将它们放在64元素数组的开头,然后将整个数组洗牌。这会将这20个棋子和44个空方块洗牌,并将它们有效地置于随机位置。