我们来看一下扫雷的基本规则:在一些方格中随机分布着一些雷,点击任意一个方格,若此方格中含雷,则被炸死,若无雷,被点击的方格中就会显示周围八个方格中雷的个数,也就是周围一圈方格中雷的个数。
要写的话,先得想好怎么搭建一个棋盘,方格可以用字符代替,不妨用'*',到时候我们想打印出的棋盘应该是这样的
这是一个10*10方阵。接下来会在里面随机的生成若干个雷,并且需要统计某个'*'周围的雷个数。为了表达清楚这个意思,可以在另外生成一个棋盘,由'0'组成,这个棋盘大小与'*'棋盘完全相同,可以做到一一对应。
然后再随机的生成雷,这里我们用'1'表示雷。
这样的'0','1'棋盘与'*'棋盘中的'*'一一对应,可以得出每个'*'周围的雷数。
接下来问题是如何统计一个位置周围雷的个数,一种方法可以是,遍历这个位置周围的元素,若为'1',则加1,这种方法还需要判断这个位置是否在边界,比较麻烦。还可以创建数组,始终比要打印出的棋盘多两行两列。比如打印10*10的棋盘,就创建12*12的二维数组,这样做就不需要判断位置是否在边界。同时也可以使用一种更巧妙的方法求周围雷数。
我们知道'1'-'0'==1,'2'-'0'==2,字符1减字符0等于数字1,那么我们只用计算'0'周围'1'数量就可以了,将选择的位置周围元素全部相加再减去7*'0',就得到了周围的雷数。那么只需要把这个雷数赋值给所选位置的'*'就好。效果如下图
这个'1'就表示周围有1个雷。
最后只需要判断游戏是否结束,游戏如果结束,要么是点到了雷,要么是完全没点到雷。
分析完了,开始写代码。
不妨建立三个文件,game.c用来写实现上述功能的函数,test.c用来测试,game.h用来写函数声明。
不妨先写个简易菜单
void menu(void)
{
printf("***************************************\n");
printf("*************1.start 2.exit************\n");
printf("***************************************\n");
}
首先定义出需要的变量和包含必要的头文件。
#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
#define col 10
#define row 10
#define cols col+2
#define rows row+2
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
这是目前能想到的头文件game.h要写的。
然后需要两个二维数组并将其初始化,如果想打印10*10的棋盘,那么得创建12*12的数组。不妨将两个数组取名为myboard和bombboard,分别表示'1','0'数组和'*'数组,将其初始化的函数
void initmy(char arr[rows][cols], char ch)
{
for (int i = 0; i < cols; i++)
{
for (int j = 0; j < rows; j++)
{
arr[i][j] = ch;
}
}
}
初始化后将两棋盘打印的函数
void printboard(int ROW, int COL, char ch[rows][cols])
{
printf("\n");
for (int k = 1; k < ROW-1; k++)
printf("%d ", k);
printf("\n");
for (int i = 1; i < ROW-1; i++)
{
for (int j = 1; j < COL-1; j++)
{
printf("%c ",ch[i][j]);
}
printf("%d", i);
printf("\n");
}
printf("\n");
}
接下来要生成雷
void generatebomb(char arr[rows][cols],int bombnum)
{
while (bombnum)
{
int x = rand() % row+1;
int y = rand() % col+1;
if (arr[x][y] != '1')
{
arr[x][y] = '1';
bombnum--;
}
}
}
然后用户输入坐标扫雷
char Findbombnum(char arr[rows][cols], int x, int y)
{
x = x % 10+1;
y = y % 10+1;
return arr[x][y + 1] + arr[x][y - 1] + arr[x + 1][y] + arr[x - 1][y] + arr[x + 1][y + 1] + arr[x - 1][y + 1] + arr[x - 1][y - 1] + arr[x + 1][y - 1] - 7 * '0';
}//返回数字,需要字符
最后判断是否结束即可。