其实跟三子棋一样,先分成3个模块:
一、game.h 用来声明头文件和自定义函数的。
二、game.c 用来实现自定义函数的。
三、test.c 用来设计程序运行的逻辑。
二、玩游戏前整体框架的逻辑
还是跟三子棋差不多,先创建一个菜单
void menu() { printf("1.play n"); printf("0.exit n"); }
再创建一个是否玩游戏的循环的逻辑
int main() { int imput = 0; srand((unsigned int)time(NULL)); do { menu(); printf("请输入:>"); scanf("%d", &imput); switch (imput) { case 1: printf("开始游戏!n"); game(); break; case 0: printf("退出游戏!n"); break; default: printf("选择错误,请重新选择:>、n"); break; } } while (imput); return 0; }
srand((unsigned int)time(NULL))是初始化随机数生成器,用于随机布置雷的。
三、游戏内部的实现
扫雷——选中一个坐标,是雷则结束游戏,不是雷则显示周围8个雷的个数,然后继续排雷,直到排完雷为止。
但是如果输入的坐标是在棋盘的边缘,那么就会出现越界访问了,所以我们要做一个比展示出来的棋盘更大一圈的棋盘(也可以理解为是玩游戏时的棋盘比创建出来的棋盘还要小一圈,我们这里展示的是9×9的棋盘,所以我们要创建一个11×11的棋盘)。
雷的话,这里我们设置棋盘中是雷则为1,非雷则为0,但是这里注意,如果输入的坐标周围8个坐标中有1个雷,则显示1,那么问题来了,这个1到底是雷,还是排查出来雷的信息。
由此,我们想到一个办法,设置两个棋盘,一个是布置好雷的棋盘,一个是展示出来给我们看雷的信息的棋盘。
之后为了方便我们观察坐标,我们在棋盘上面和左边都打印出棋盘的横坐标和纵坐标。
#define ROW 9 #define COL 9 #define ROWS ROW+2 #define COLS COL+2
//创建棋盘 char mine[ROWS][COLS] = { 0 }; char show[ROWS][COLS] = { 0 }; //初始化棋盘 InitBoard(mine, ROWS, COLS,'0'); InitBoard(show, ROWS, COLS,'*'); //打印棋盘 DisplayBoard(show, ROW, COL);
void InitBoard(char board[ROWS][COLS], int rows, int cols,char set) { int x = 0; int y = 0; for (x = 0; x < rows; x++) { for (y = 0; y < cols; y++) { board[x][y] = set; } } } void DisplayBoard(char board[ROWS][COLS], int row, int col) { int x = 0; int y = 0; printf("———————扫雷———————n"); for (x = 0; x <= row; x++) { printf("%d ", x); } printf("n"); for (x = 1; x <= row; x++) { printf("%d ", x); for (y = 1; y <= col; y++) { printf("%c ", board[x][y]); } printf("n"); } printf("———————扫雷———————n"); }
这样一来,最开始展示给我们看的棋盘全部都是‘*’了,而布置雷的棋盘最开始就都是‘0’了。
接下来,我们就开始布置雷,布置雷当然是随机布置。
#define EASY_COUNT 10
void SetMine(char mine[ROWS][COLS], int row, int col) { int count = EASY_COUNT; while (count) { int x = rand() % row + 1; int y = rand() % col + 1; if (mine[x][y] == '0') { mine[x][y] = '1'; count--; } } }
布置好之后我们就可以排查雷了
static int get_mine_count(char mine[ROWS][COLS], int x, int y) { return mine[x - 1][y - 1] + mine[x][y - 1] + mine[x + 1][y - 1] + mine[x - 1][y] + mine[x + 1][y] + mine[x - 1][y + 1] + mine[x][y + 1] + mine[x + 1][y + 1] - 8 * '0'; } void FineBoard(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col) { //输入坐标,判断合法性,是否继续游戏,如果不是雷,统计周围雷的个数 int x = 0; int y = 0; int win = 0;//统计已排查出来非雷的个数 while (win < row * col - EASY_COUNT) { printf("请输入坐标:>"); scanf("%d %d", &x, &y); if (x >= 1 && x <= row && y >= 1 && y <= col) { if (mine[x][y] == '1') { printf("嘭~!恭喜你,中雷了。n"); DisplayBoard(mine, row, col); break; } else { printf("很遗憾,你没被炸死。n"); int count = get_mine_count(mine,x,y); show[x][y] = count + '0'; DisplayBoard(show, row, col); win++; } } else { printf("输入错误,请重新输入:>"); } if (win == row * col - EASY_COUNT) { printf("排雷成功!n"); break; } } }
走到这里,我们的扫雷小游戏也算完成啦。
四、源码的展示
game.h
#include#include #include #define EASY_COUNT 10 #define ROW 9 #define COL 9 #define ROWS ROW+2 #define COLS COL+2 //初始化 void InitBoard(char board[ROWS][COLS],int rows,int cols,char set); //打印棋盘 void DisplayBoard(char board[ROWS][COLS], int row, int col); //随机布置雷 void SetMine(char mine[ROWS][COLS], int row, int col); //排查雷的信息 void FineBoard(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);
game.c
#include"game.h" void InitBoard(char board[ROWS][COLS], int rows, int cols,char set) { int x = 0; int y = 0; for (x = 0; x < rows; x++) { for (y = 0; y < cols; y++) { board[x][y] = set; } } } void DisplayBoard(char board[ROWS][COLS], int row, int col) { int x = 0; int y = 0; printf("———————扫雷———————n"); for (x = 0; x <= row; x++) { printf("%d ", x); } printf("n"); for (x = 1; x <= row; x++) { printf("%d ", x); for (y = 1; y <= col; y++) { printf("%c ", board[x][y]); } printf("n"); } printf("———————扫雷———————n"); } void SetMine(char mine[ROWS][COLS], int row, int col) { int count = EASY_COUNT; while (count) { int x = rand() % row + 1; int y = rand() % col + 1; if (mine[x][y] == '0') { mine[x][y] = '1'; count--; } } } static int get_mine_count(char mine[ROWS][COLS], int x, int y) { return mine[x - 1][y - 1] + mine[x][y - 1] + mine[x + 1][y - 1] + mine[x - 1][y] + mine[x + 1][y] + mine[x - 1][y + 1] + mine[x][y + 1] + mine[x + 1][y + 1] - 8 * '0'; } void FineBoard(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col) { //输入坐标,判断合法性,是否继续游戏,如果不是雷,统计周围雷的个数 int x = 0; int y = 0; int win = 0;//统计已排查出来非雷的个数 while (win < row * col - EASY_COUNT) { printf("请输入坐标:>"); scanf("%d %d", &x, &y); if (x >= 1 && x <= row && y >= 1 && y <= col) { if (mine[x][y] == '1') { printf("嘭~!恭喜你,中雷了。n"); DisplayBoard(mine, row, col); break; } else { printf("很遗憾,你没被炸死。n"); int count = get_mine_count(mine,x,y); show[x][y] = count + '0'; DisplayBoard(show, row, col); win++; } } else { printf("输入错误,请重新输入:>"); } if (win == row * col - EASY_COUNT) { printf("排雷成功!n"); break; } } }
test.c
#include"game.h" void menu() { printf("1.play n"); printf("0.exit n"); } void game() { //创建棋盘 char mine[ROWS][COLS] = { 0 }; char show[ROWS][COLS] = { 0 }; //初始化棋盘 InitBoard(mine, ROWS, COLS,'0'); InitBoard(show, ROWS, COLS,'*'); //打印棋盘 DisplayBoard(show, ROW, COL); //布置雷 SetMine(mine, ROW,COL); //DisplayBoard(mine, ROW, COL); //排除雷 FineBoard(mine, show, ROW, COL); } int main() { int imput = 0; srand((unsigned int)time(NULL)); do { menu(); printf("请输入:>"); scanf("%d", &imput); switch (imput) { case 1: printf("开始游戏!n"); game(); break; case 0: printf("退出游戏!n"); break; default: printf("选择错误,请重新选择:>、n"); break; } } while (imput); return 0; }
以上就是这个程序的所有代码,希望看完这些能对你有所帮助。
如内容上有错误,望指出!