Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在棋盘上随机放置20个棋子的最佳方法是什么?_C#_Arrays_Algorithm_Random - Fatal编程技术网

C# 在棋盘上随机放置20个棋子的最佳方法是什么?

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大小的缓冲区,用指向我的跳棋的指针(全部20个)填充它,其余的保留0(null),然后在缓冲区上运行一个洗牌算法,就是这样(只需将它作为8x8数组读取)

  • 我想知道有没有更好的办法

  • 我需要用C#来写,我的建议不会像我描述的那样有效

  • 有人吗

    一个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>

  • 构建“board”数组,全部为空;(64个要素)
  • 构建由你的棋子组成的“游戏棋子”阵列
  • 创建一个从1到#的循环
  • 生成一个介于1和#个板空间(64)之间的随机数
  • 如果#4所指的板空间为!0,重做步骤4(或者您可以“while”!0)
  • 将工件(第3步中的环)放入第4步中的方形X中
  • 只有一个想法肯定会有很多--


    希望这有助于……

    借助Borzio的想法,当你接近第二十首曲子时,有三分之一的几率你必须重新生成随机数,然后再试一次。有了20件,你可能还是安全的,但如果你有,比如说,40件,那就有比1/2的机会更好的机会,你可能会等上一段时间

  • 构建电路板阵列,全部为空
  • 将对每个板正方形的引用复制到列表中(
    emptySquareList
  • 为要添加的每件物品循环:
  • 0
    emptySquareList.Length-1
    之间生成一个随机数
  • 把这块放在那个正方形里
  • 空方块列表中删除方块
  • 这样,您总是维护一个空方块列表,并从中进行选择。请注意,板阵列中的索引数组也可以工作,并且可能更快(
    Enumerable.Range(0,64)


    我鼓励您尝试随机和检查算法,以及这个算法;看看哪一个更有效率。

    要回答提出的问题:

  • 将第一个棋子放置在尚未占用的任意位置
  • 对其他19件重复上述步骤
  • 说真的,你没有给我们足够的信息来回答这个问题。这里有一些问题:

    • 哪些棋子
    • 哪种颜色(每种有16种),颜色重要吗?白人是否必须避免被黑人俘虏,反之亦然
    假设没有规则可遵循,除了需要将所有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个空方块混在一起,并有效地将它们放在随机点上。

    “提案不会像我描述的那样有效”,这意味着什么?你有具体的问题吗?不起作用的代码段?你有没有一个例子说明什么东西不能按照你描述的方式工作?这些作品必须遵循它们的正常规则吗?i、 一个白人和一个黑人方形主教等等?@Mitch:问得好!我也没想到,你暗示要同时使用跳棋和棋子(标题是国际象棋,内容是跳棋)。也就是说,我假设checkers.S.Lott:我写的东西是有效的,但我认为有一种更聪明的方法。米奇:没有规则,就像我说的,只是在随机的地方填充它们,但是全部20个。这种算法的问题是它是不确定的。如果你碰巧特别不走运,它可能永远不会结束。如果随机真的是随机的,那么是的,你非常非常不走运。不幸的是(对于您的评论),在这种情况下,Random将生成0到63之间的所有数字,而不管启动种子。是的,确保您的算法退出总是更好的,即使您运气不好。