扫雷游戏主要功能:
- 储存当前棋盘信息
- 打印棋盘
- 计算周围雷个数
- 判断胜负
主要子函数
//棋盘初始化函数 void Init(char arr[ROWS][COLS], int row, int col, char set); //放雷函数 void setmine(char arr[ROWS][COLS], int row, int col); //打印函数 void Print(char arr[ROWS][COLS], int row, int col); //插叙函数 int find(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col); //主界面函数 void manu(); //评估函数 char judge(char arr[ROWS][COLS], int row, int col);
初始化函数
void Init(char arr[ROWS][COLS], int row, int col, char set) {
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
arr[i][j] = set;//将每个元素置为set字符
}
}
}
打印函数
void Print(char arr[ROWS][COLS], int row, int col) {
printf("------------扫雷-------------\n");
printf(" ");
for (int i = 1; i <= row; i++) {
printf(" %d ", i);//显示列信息
}
printf("\n");
for (int i = 1; i <= row; i++) {
printf(" %d ",i);//显示行信息
for (int j = 1; j <= col; j++) {
printf(" %c ", arr[i][j]);
}
printf("\n");
}
}
置雷函数
void setmine(char arr[ROWS][COLS], int row, int col) {
int count = NUM_MINE;
while (count) {
int row1 = rand() % 9 + 1;//srand函数在调用前已经使用
int col1 = rand() % 9 + 1;
if (arr[row1][col1] == '0') {
arr[row1][col1] = '1';
count--;
}
}
}
评估函数
char judge(char arr[ROWS][COLS], int row, int col) {
return (arr[row - 1][col - 1] + arr[row][col - 1] + arr[row + 1][col - 1]
+ arr[row - 1][col]+ arr[row + 1][col] +arr[row - 1][col + 1]
+ arr[row][col + 1] + arr[row + 1][col + 1] )%'0'+'0';
//周围八个字符相加后对‘0’取余后加上‘0’保障返回的也为ASCII的值
}
查找函数
int find(char mine[ROWS][COLS],char show[ROWS][COLS],int row,int col)//查询成功返回1,失败返回0
{
int row1 = 0;
int col1 = 0;
while (1) {
printf("please input\n");
scanf("%d %d", &row1, &col1);
if (row1 > row || row1<0 || col1>col || col1 < 0) {
printf("pos error\n");
break;
}
else if (show[row1][col1] != '*') {
printf("pos error\n");
break;
}
else {
if (mine[row1][col1] == '1') {
printf("congratulations! You die\n");
return 0;
}
else {
char val = judge(mine, row1, col1);
show[row1][col1] = val;
break;
}
}
}
return 1;
}
主界面函数
void manu() {
printf("-----------------------------\n");
printf("-----------Welcome-----------\n");
printf("-----------1: play-----------\n");
printf("-----------2: quit-----------\n");
printf("-----------------------------\n");
printf("-----------------------------\n");
}
主函数
int main() {
srand((unsigned int)time(NULL));
int count = 0;
int flag = 0;
char mine[ROWS][COLS] = { 0 };
char show[ROWS][COLS] = { 0 };
Init(mine, ROWS, COLS, '0');
Init(show, ROWS, COLS, '*');
setmine(mine, ROWS, COLS);
while (1) {
manu();
scanf("%d", &flag);
if (flag == 1) {
/* Print(mine, ROW, COL);*/
Print(show, ROW, COL);
while (1) {
if (find(mine, show, ROWS, COLS)) {
count++;
}
else {
Print(mine, ROW, COL);
Print(show, ROW, COL);
break;
}
Print(mine, ROW, COL);
Print(show, ROW, COL);
if (count == 81 - NUM_MINE) {
printf("congratulation! You win\n");
break;
}
}
}
else if (flag == 2) {
break;
}
else {
printf("error input\n");
continue;
}
}
}
调试结果
总结:
扫雷的基本功能实现了,但是比如运用递归实现一块区域的打开功能,放置国旗的功能尚未实现,之后研究在进行添加!