黑马程序员技术交流社区

标题: 结构里面的二维bool数组,真有点不好理解。 [打印本页]

作者: mustek    时间: 2013-4-21 20:27
标题: 结构里面的二维bool数组,真有点不好理解。
public struct Miner
   
    {
        public bool[,] buriedMine;
        public int totalMine;

    }
}
作者: mustek    时间: 2013-4-21 20:41
      public struct Miner
   
     {
        public bool[,] buriedMine;
        public int totalMine;
        public Miner(int m, int n, int totalMine)
        {
            this.buriedMine = new bool[m, n];
            this.totalMine = totalMine;
            Random rm = new Random();
            int i = rm.Next() % m;
            int j = rm.Next() % n;
            for (int k = 0; k < totalMine; k++)
            {

                while (buriedMine[i, j])
                {
                    i = rm.Next() % m;
                    j = rm.Next() % n;
                }
                buriedMine[i, j] = true;
            }
        }

      }

作者: 崔宏奎    时间: 2013-4-21 21:33
本帖最后由 崔宏奎 于 2013-4-21 21:37 编辑

public struct Miner
   
     {
        public bool[,] buriedMine;
        public int totalMine;
        public Miner(int m, int n, int totalMine)  //建立一个m*n的二维数组,totalMine是计算次数
        {
            this.buriedMine = new bool[m, n]; //实例化这个bool数组
            this.totalMine = totalMine;
            Random rm = new Random();  //初始化随机数种子(这里它不能产生真正的随机数)
            int i = rm.Next() % m;  // 好吧...下面这两行弥补了上一行的 不产生"真正"随机数的问题,不建议这样用,最后会说明
            int j = rm.Next() % n;   //不建议这样用
            for (int k = 0; k < totalMine; k++)  //循环totalMine次
            {

                while (buriedMine[i, j])  //这行什么意思?? 二维数组 new bool[m, n]的时候,所有元素都是false,这些代码其实都没有执行。。。。 (永远都是while (假) )
                {
                    i = rm.Next() % m;  //第二次循环:改变了i和j 的值。。。。 如此反复30次;
                    j = rm.Next() % n;
                }
                buriedMine[i, j] = true;  //好了。。。。上面的while 没有执行,这里又给元素赋值True
            }   //第一次循环完了。。。。其实就干了一件事 buriedMine[i, j] = true;  现在只有buriedMine[i, j] 元素是true,其他的都没有操作
        }
      }

作者: 崔宏奎    时间: 2013-4-21 21:33
本帖最后由 崔宏奎 于 2013-4-21 22:11 编辑

额。。。
随机化这个数组,试试这个样:
  1. public struct Miner
  2.     {
  3.         public bool[,] buriedMine;
  4.         private int Col;
  5.         private int Row;
  6.         public Miner(int m, int n)  //随机化数组
  7.         {
  8.             Col = m; Row = n; //保存一下行数、列数
  9.             buriedMine = new bool[m, n]; //实例化这个bool数组
  10.             Random rm = new Random(DateTime.Now.Millisecond);  //初始化随机数种子(把当前时间传进去,这样每次就不一样了,不然每次的第一个随机数会是一样的)
  11.             for (int i = 0; i < m; ++i)  //外循环,m次
  12.                 for (int j = 0; j < n;++j ) //内循环,n次
  13.                 {
  14.                     buriedMine[i, j] = rm.Next(2) == 1;  //产生一个随机数,范围是[0,1]
  15.                 }   
  16.         }
  17.         public void ShowData() //打印所有元素
  18.         {
  19.             for (int i = 0; i < Col; ++i)
  20.             {
  21.                 for (int j=0;j<Row;++j)
  22.                 {
  23.                     Console.Write(buriedMine[i, j] + ";");
  24.                 }
  25.                 Console.WriteLine();
  26.             }
  27.         }
  28.     }
复制代码

作者: mustek    时间: 2013-4-22 11:53
补充得非常的强悍!
作者: 张伟86    时间: 2013-5-1 13:39
不知道这段代码是楼主写的还是楼主学习别人的,我来分析下这段代码功能。
这段代码是作扫雷游戏时候初始化雷的位置时候用的,使用bool 2维数组来定义棋盘,当坐标点bool值为true时表示有雷,false时表示无雷。
代码中有点小错误,也就是上面仁兄说的没有意义的那句(红色标注) :
public struct Miner   
     {
        public bool[,] buriedMine;
        public int totalMine;
        public Miner(int m, int n, int totalMine)
        {
            this.buriedMine = new bool[m, n];
            this.totalMine = totalMine;
            Random rm = new Random();
            int i = rm.Next() % m;
            int j = rm.Next() % n;
            for (int k = 0; k < totalMine; k++)
            {

                while (buriedMine[i, j])
                {
                    i = rm.Next() % m;
                    j = rm.Next() % n;
                }
                buriedMine[i, j] = true;
            }
        }
      }
这句,如果要实现我猜想的功能的话,得放到while循环里面,也就是:
public struct Miner   
     {
        public bool[,] buriedMine;
        public int totalMine;
        public Miner(int m, int n, int totalMine)
        {
            this.buriedMine = new bool[m, n];
            this.totalMine = totalMine;
            Random rm = new Random();
            int i = rm.Next() % m;
            int j = rm.Next() % n;
            for (int k = 0; k < totalMine; k++)
            {

                while (buriedMine[i, j])
                {
                    i = rm.Next() % m;
                    j = rm.Next() % n;
                    buriedMine[i, j] = true;
                }               
            }
        }
      }
楼主可以再看看自己的代码粘贴是否正确,基本功能和解释就是上面强人那样的。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2