【问题标题】:How to randomize a place in array如何随机化数组中的位置
【发布时间】:2020-06-05 20:48:52
【问题描述】:

我正在尝试编写扫雷游戏代码,为此我需要随机化炸弹位置。

有人可以帮助改变一下功能,以便随机放置炸弹吗?

代码:

void Createbomb(int*** bord, int size)//size+1
{
    //bomb num.1
    (*bord)[size - 5][size - 1] = 9;
    //bomb num.2
    (*bord)[size - 4][size - 4] = 9;
    //bomb num.3
    (*bord)[size - 3][size - 2] = 9;
    //bomb num.4
    (*bord)[size - 2][size - 2] = 9;
    //bomb num.5
    (*bord)[size - 1][size - 5] = 9;
}

【问题讨论】:

标签: c arrays random minesweeper


【解决方案1】:

很久以前(大约 1993 年)我写了一个基于 ncurses 的扫雷。它是开源的,现在在 Github 中,如果你想知道如何实现它的某些部分,你有完整的源代码there。您可以免费下载、克隆,甚至可以向我展示更好的方法来实现某些东西。

我的方法是对现场单元使用矩阵,并在它们上存储相邻炸弹的数量,而一位存储炸弹的存在。恐怕它是很久以前写的,我还没来得及把所有的 cmets 和标识符翻译成英文……但也许现在是这样做的好时机……让我们考虑一下。

【讨论】:

    【解决方案2】:

    不要使用模数来获得伪随机数,因为通过几次试验,我们可以很容易地找出下一个数字。有几种方法可以很好地随机化,这是一种方法,比使用模数更好: (有兴趣的话,还有更复杂的随机数生成方式)

    #include <stdlib.h>
    
    int random_num(int inf, int sup)
    {
        if(inf < 0 || sup-inf < 0) return -1; /*Only positive numbers because it is an array */
    
        return inf+(int)(((sup-inf+1.0)*rand())/(RAND_MAX + 1.0));
    }
    

    RAND_MAX是在stdlib.h中定义的一个常量值,粗略地说是一个巨大的整数常量,即一个大整数。

    所以,在你的程序中你只需要调用:

    int x = random_num(0, size); /*Gets a new random number in the desired range*/ 
    

    【讨论】:

      【解决方案3】:

      假设您需要的炸弹数量是 5。此外,让最初的 board 包含所有单元格的默认值 1,只有当单元格中存在炸弹时才包含 9。然后您可以执行以下操作:

      void createBomb(int*** board, int size){
          srand(time(0));
          int numOfBombsPlaced = 0;
          while(numOfBombsPlaced < 5){
              int x = rand()%size;
              int y = rand()%size;
              if ((*board)[x][y]==9):
                   continue;
              numOfBombsPlaced++;
              (*board)[x][y] = 9;
          }
      }
      

      请注意,rand 生成的数字并不是真正随机的,而是取决于初始种子。种子由srand 提供。使用time 作为种子是随机化的好选择。

      【讨论】:

      • srand(time(0)); for every 调用函数?!?!?
      • 由于该函数被调用一次来填充炸弹,我认为应该很好。 ://
      猜你喜欢
      • 1970-01-01
      • 2021-11-11
      • 1970-01-01
      • 1970-01-01
      • 2020-07-20
      • 1970-01-01
      • 2021-02-08
      • 2013-02-21
      • 1970-01-01
      相关资源
      最近更新 更多