一、头文件game.h
#pragma once
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#include
#define COUNT 10
#include
//声明函数
//棋盘初始化函数
void initboard(char arr[ROWS][COLS], int rows, int cols,char set);
//打印棋盘
void displayboard(char arr[ROWS][COLS], int row, int col);
//布置雷
void setmine(char arr[ROWS][COLS], int row, int col);
//排查雷
void findmine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);
二、game.c
#include"game.h"
#include
void initboard(char arr[ROWS][COLS], int rows, int cols,char set) {
int i = 0;
for (; i < rows; i++) {
int j = 0;
for (; j < cols; j++) {
arr[i][j] = set;
}
}
}
void displayboard(char arr[ROWS][COLS], int row, int col) {
int i = 0;
printf("--扫雷游戏--\n");
for (i = 0; i <= col; i++) {
printf("%d", i);
}printf("\n");
for (i = 1; i <= row; i++) {
int j = 1;
printf("%d", i);
for (; j <= col; j++) {
printf("%c",arr[i][j]);
}printf("\n");
}
}
void setmine(char arr[ROWS][COLS], int row, int col) {
int count = COUNT;
while (count) {
int x = rand() % row + 1;
int y = rand() % col + 1;
if (arr[x][y] == '0') {
arr[x][y] = '1';
count--;
}
}
}
int getmine(char mine[ROWS][COLS], int x, int y) {
return
mine[x - 1][y] + mine[x - 1][y - 1] + mine[x][y - 1] + mine[x + 1][y - 1] + mine[x + 1][y] + mine[x + 1][y + 1] + mine[x][y + 1] + mine[x - 1][y + 1] - 8 * '0';
}
void findmine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col) {
int x = 0; int y = 0; int win = 0;
while (win = 1 && x <= row && y >= 1 && y <= col) {
if (mine[x][y] == '1') {
printf("有雷");
displayboard(mine, ROW, COL);
break;
}
else {
//坐标不是雷
int counter = getmine(mine, x, y);
show[x][y] = counter + '0';
displayboard(show, ROW, COL);
win++;
}
}
else {
printf("error");
}
}if (win == row * col - COUNT) {
printf("你赢了\n");
displayboard(mine, ROW, COL);
}
}
initboard
函数: 这个函数接收一个二维字符数组 arr
作为棋盘,以及棋盘的行数 rows
和列数 cols
。它将棋盘上所有的位置都设置为传入的 set
字符。在这个上下文中,set
应当为 '0'
表示无雷的安全位置。
displayboard
函数: 这个函数负责将棋盘打印到控制台。首先打印顶部编号,然后是棋盘每一行的编号和对应的内容。这里有一个小错误,即对行和列的遍历是从 1
开始的,但实际上数组的下标是从 0
开始的。
setmine
函数: 这个函数随机地在棋盘上放置一定数量的雷。它生成随机坐标,并将对应的棋盘位置设置为 '1'
表示雷。这个过程一直持续到所有雷都被放置完毕。
getmine
函数: 这个函数计算指定单元格周围八个方向上雷的数量。它通过对周围的单元格求和并减去 8 * '0'
来实现这一点。这里的逻辑是错误的,因为它没有考虑到只有当值为 '1'
时才表示雷的存在。
findmine
函数: 这个函数允许玩家输入坐标来翻开棋盘上的一个格子。如果翻开的格子是雷,则游戏结束并显示整个雷区;如果不是雷,则显示周围雷的数量。同时,每成功翻开一个安全格子,变量 win
会增加,直到翻开所有非雷的格子,此时宣布玩家胜利。
三、test.c
#include
#include"game.h"
void menu() {
printf("1:play\n");
printf("0:exit\n");
}
void game() {
//扫雷游戏
//mine数组里存放雷的位置
//show数组里存放排查出雷的位置
char mine[ROWS][COLS];
char show[ROWS][COLS];
//初始化棋盘
initboard(mine, ROWS, COLS, '0');
initboard(show, ROWS, COLS, '*');
//打印棋盘
/*displayboard(mine, ROW, COL);*/
/*printf("\n");
displayboard(show, ROW, COL);*/
//布置雷
//随机布置十个雷
setmine(mine,ROW,COL);
displayboard(mine, ROW, COL);
displayboard(show, ROW, COL);
//排查雷
findmine(mine, show, ROW, COL);
}
void test() {
int input = 0;
srand((unsigned int)time(NULL));
do {
menu();
printf("请选择:");
scanf("%d", &input);
switch (input) {
case 1:
printf("扫雷开始:\n");
game();
break;
case 0:
printf("游戏结束\n");
break;
default:
printf("选择错误:/n");
break;
}
} while (input);
}
int main() {
test();
return 0;
}