C# 在棋盘上随机放置20个棋子的最佳方法是什么?
我必须解决这个问题的一个想法是,组成一个8x8大小的缓冲区,用指向我的跳棋的指针(全部20个)填充它,其余的保留0(null),然后在缓冲区上运行一个洗牌算法,就是这样(只需将它作为8x8数组读取)C# 在棋盘上随机放置20个棋子的最佳方法是什么?,c#,arrays,algorithm,random,C#,Arrays,Algorithm,Random,我必须解决这个问题的一个想法是,组成一个8x8大小的缓冲区,用指向我的跳棋的指针(全部20个)填充它,其余的保留0(null),然后在缓冲区上运行一个洗牌算法,就是这样(只需将它作为8x8数组读取) 我想知道有没有更好的办法 我需要用C#来写,我的建议不会像我描述的那样有效 有人吗 一个8x8矩阵包含指向分段对象的指针(c++)或引用(c#/java)似乎是一个非常合理的设计 您可以使用64个元素大的1D数组(您可以轻松地将2D索引映射到1D数组),并使用如下内容: using System;
有人吗 一个8x8矩阵包含指向分段对象的指针(c++)或引用(c#/java)似乎是一个非常合理的设计 您可以使用64个元素大的1D数组(您可以轻松地将2D索引映射到1D数组),并使用如下内容:
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个元素数组的“黑色”方块。 < P>如果你必须遵循放置规则,考虑到你的8x8矩阵例子,我也会认为它是一维数组,正如埃文指出的(参见他的数学决定X和Y)- 黑白方块是奇数和偶数索引值;但是,嘿,你从来没有说过你需要放置规则——我也认为你不是在寻找c代码,而是更多的“逻辑”层次的想法
如果您正在尝试一个LINQ挑战的解决方案,请考虑下面的内容;p>
希望这有助于……借助Borzio的想法,当你接近第二十首曲子时,有三分之一的几率你必须重新生成随机数,然后再试一次。有了20件,你可能还是安全的,但如果你有,比如说,40件,那就有比1/2的机会更好的机会,你可能会等上一段时间
emptySquareList
)0
和emptySquareList.Length-1
之间生成一个随机数空方块列表中删除方块
Enumerable.Range(0,64)
)
我鼓励您尝试随机和检查算法,以及这个算法;看看哪一个更有效率。要回答提出的问题:
- 哪些棋子
- 哪种颜色(每种有16种),颜色重要吗?白人是否必须避免被黑人俘虏,反之亦然
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个空方块混在一起,并有效地将它们放在随机点上。“提案不会像我描述的那样有效”,这意味着什么?你有具体的问题吗?不起作用的代码段?你有没有一个例子说明什么东西不能按照你描述的方式工作?这些作品必须遵循它们的正常规则吗?i、 一个白人和一个黑人方形主教等等?@Mitch:问得好!我也没想到,你暗示要同时使用跳棋和棋子(标题是国际象棋,内容是跳棋)。也就是说,我假设checkers.S.Lott:我写的东西是有效的,但我认为有一种更聪明的方法。米奇:没有规则,就像我说的,只是在随机的地方填充它们,但是全部20个。这种算法的问题是它是不确定的。如果你碰巧特别不走运,它可能永远不会结束。如果随机真的是随机的,那么是的,你非常非常不走运。不幸的是(对于您的评论),在这种情况下,Random将生成0到63之间的所有数字,而不管启动种子。是的,确保您的算法退出总是更好的,即使您运气不好。