扫雷:扫雷是一款相当大众化的小游戏,游戏目标是在最短的时间内根据点击格子出现的数字找出所有非雷格子,同时避免踩雷。
我们要做的就是布雷:在一个10*10的方格里,随机布9颗雷,并且计算出每个雷周围的格子里应该是几(紧挨着他有几颗雷,就是几)。
其中我们要注意的是:
①选随机数作为雷的位置,让雷的位置可以随机分布;
②随机数不能重复,以免雷的数量减少;
③计算每个雷周围的格子的数字。
接下来看看我们具体的程序:
class Program { static void Main(string[] args) { //创建一个产生随机数的对象 Random r = new Random(); //设置雷区的边长 int length = 10; //创建一个索引数组,长度为雷区中元素的个数 int[] ary = new int[length * length]; //设置雷的个数 int count = 9; //初始化索引数组,使索引数组中的所有元素都不一样 //存储的值应该是0-(边长的平方-1) for (int i = 0; i < length * length; i++) { ary[i] = i; } //设置从索引数组中取值的范围 int size = length * length; //创建一个地雷位置的数组 int[] locations = new int[count]; //给地雷位置数组赋值----设置每个地雷的位置 for (int j = 0; j < count; j++) { //产生一个随机数,随机数的范围就是从索引数组中取值的范围 int index = r.Next(size); //使用索引取得一个值,就是最终地雷放的位置(一维) int val = ary[index]; //将位置放入地雷位置数组中 locations[j] = val; //那么范围应该-1 size--; //将取过值得位置上的内容用后面的元素的值覆盖(将取过的值从数组中干掉) for (int i = index + 1; i < size; i++) { ary[i - 1] = ary[i]; } } //创建雷区数组 int[,] mines = new int[length, length]; //给雷区中放置地雷 for (int i = 0; i < locations.Length; i++) { //将一维索引转变成二维索引 int x = locations[i] / length; int y = locations[i] % length; //放地雷 mines[x, y] = 9; } //计算雷区中没有雷的位置应该是几(计算每个位置周围有几个雷,这个位置就应该是几) for (int i = 0; i < mines.GetLength(0); i++) { for (int j = 0; j < mines.GetLength(1); j++) { //如果这个位置是雷,就上去继续执行循环 if (mines[i,j]==9) { continue; } //调用Getminecount函数计算[i,j]位置的值 mines[i, j] = Getminecount(mines, i, j); } } //将雷区数组打印出来 for (int i = 0; i < mines.GetLength(0); i++) { for (int j = 0; j < mines.GetLength(1); j++) { Console.Write("{0}\t", mines[i, j]); } Console.WriteLine(); } } //Getminecount函数计算[i,j]位置的值 private static int Getminecount(int[,] mines, int rowIndex, int columnIndex) { //设置一个count来计算[i,j]位置的值 int count = 0; //左边的列索引等于此位置的列索引-1(相邻位置) int leftcolumnIndex = columnIndex - 1; //右边的列索引等于此位置的列索引+1(相邻位置) int rightcolumnIndex = columnIndex + 1; //上面的行索引等于此位置的行索引-1(相邻位置) int toprowIndex = rowIndex - 1; //下面的行索引等于此位置的行索引+1(相邻位置) int bottomrowIndex = rowIndex + 1; //左上--如果行索引和列索引都大于等于0 //如果左上方是雷,count+1 if (leftcolumnIndex>= 0 && toprowIndex>=0) { if (mines[toprowIndex,leftcolumnIndex]==9) { count++; } } //正上--如果行索引大于等于0 //如果正上方是雷,count+1 if (toprowIndex>=0) { if (mines[toprowIndex,columnIndex]==9) { count++; } } //右上---如果行索引大于等于0,列索引小于总列数 //如果右上方是雷,count+1 if (toprowIndex >= 0 && rightcolumnIndex<mines.GetLength(1)) { if (mines[toprowIndex,rightcolumnIndex]==9) { count++; } } //左下--如果列索引大于等于0,行索引小于总行数 //如果左下方是雷,count+1 if (leftcolumnIndex >= 0 && bottomrowIndex<mines.GetLength(0)) { if (mines[bottomrowIndex,leftcolumnIndex]==9) { count++; } } //正下---如果行索引小于总行数 //如果正下方是雷,count+1 if (bottomrowIndex<mines.GetLength(0)) { if (mines[bottomrowIndex,columnIndex]==9) { count++; } } //右下---如果行索引小于总行数,列索引小于总列数 //如果右下方是雷,count+1 if (bottomrowIndex < mines.GetLength(0) && rightcolumnIndex < mines.GetLength(1)) { if (mines[bottomrowIndex,rightcolumnIndex]==9) { count++; } } //正左---如果列索引大于等于0 //如果正左方是雷,count+1 if (leftcolumnIndex>=0) { if (mines[rowIndex,leftcolumnIndex]==9) { count++; } } //正右---如果列索引小于总列数 //如果正方右是雷,count+1 if (rightcolumnIndex<mines.GetLength (1)) { if (mines[rowIndex,rightcolumnIndex]==9) { count++; } } return count; } }
输出结果:
我们写的这个控制台应用程序只是布雷的雏形,有了布雷的这种思想,并简单的实现,还有大量的工作需要做,将这个程序加工包装,才能成为一款真正的扫雷游戏。
再接再厉!!!