随机生成地雷
在之前的代码中,我们定义了如下内容,分别代表扫雷棋盘的行、列和最大雷数。我们再新定义一个bombList
,用来存放雷的位置
int maxRow = 9;
int maxCol = 9;
int maxBomb = 10;
List<int> bombList;
接下来需要随机生成每个雷所在的行和列,可以先从[ 0, maxRow * maxCol )
中随机生成maxBomb个不重复随机数,算法来自这篇教程,摘抄如下:
// 从[0, _max)中随机生成_number个不重复的随机数
List<int> GenerateRandomList(int _max, int _number)
{
if (_number > _max) {return null;}
System.Random random = new System.Random();
List<int> result = new List<int>();
int temp;
while (result.Count < _number)
{
temp = random.Next(_max);
if (!result.Contains(temp))
{
result.Add(temp);
}
}
return result;
}
然后我们可以在InitMines
函数中加入如下代码,注意要写在函数的开头:
bombList = GenerateRandomList(_maxRow * _maxCol, maxBomb);
这样我们就得到一段不重复的序列,通过将这个序列映射到棋盘的行和列中,就可以得到每个雷的位置。
点击地雷后,将格子变成红色
接下来修改每个格子的Click事件,修改ClickMine
函数如下:
private void ClickMine(GameObject _button)
{
int _row = _button.GetComponent<MinesweeperButton>().GetRow();
int _col = _button.GetComponent<MinesweeperButton>().GetCol();
if (bombList.Contains(_row * _maxCol + _col))
{
_button.GetComponent<Image>().color = Color.red;
}
}
这样就可以在点击有雷的格子后将该格子变红。代码运行效果如下: