文章目录
- 游戏说明
- 游戏效果展示
- 游戏代码
- 游戏代码解析
-
- 游戏框架解析
- 棋盘绘制
- 棋盘初始化
- 布置雷
- 开始扫雷
- 输赢判断
- 主函数
游戏说明
- 游戏框架解析
- 棋盘绘制
- 棋盘初始化
- 布置雷
- 开始扫雷
- 输赢判断
- 主函数
游戏界面:可以选择开始游戏 或者退出
游戏操作:通过命令行输入坐标即可
我们使用二维数组来实现这个游戏
游戏效果展示
游戏代码
博友们可以将以下代码复制到自己的编译器当中运行:
#ifndef game_h #define game_h #include#include #include #define ROW 9 #define COL 9 #define ROWS 9+ROW #define COLS 9+COL #define Easy_count 10 void init_board(char board[ROWS][COLS],int rows, int cols,char set); void display_board(char board[ROWS][COLS],int rows, int cols); void set_mine(char board[ROWS][COLS],int rows, int cols); void find_board(char mine_board[ROWS][COLS],char show_board[ROWS][COLS],int rows, int cols); #endif #include "game.h" void init_board(char board[ROWS][COLS],int rows, int cols,char set) { for (int i = 0; i =1 && x<= ROW && y>=1 && y<= COL) { if(show_board[x][y] == '*') { if (mine_board[x][y] == '1') { printf("BOOM!!!!你给炸死了QAQn"); display_board(mine_board,ROWS,COLS); break; } int count = get_mine_board( mine_board , x , y ); show_board[x][y] = count + '0'; display_board(show_board,ROWS,COLS); win++; } else { printf("目标已占用n"); } } else { printf("坐标错误请重新输入~~~~~n"); } } if(win == ROW*COL-Easy_count) { printf("恭喜你,排雷成功^ _ ^n"); display_board(mine_board,ROWS,COLS); } } #include "game.h" #include void game(void) { char mine_board[ROWS][COLS] = {0}; char show_board[ROWS][COLS] = {0}; //初始化 init_board(mine_board,ROWS,COLS,'0'); init_board(show_board,ROWS,COLS,'*'); //打印 // display_borad(mine_borad,ROWS,COLS); // display_borad(show_borad,ROWS,COLS); //布置雷 set_mine(mine_board,ROWS,COLS); display_board(show_board,ROWS,COLS); // display_board(mine_board,ROWS,COLS); //排查雷 把mine上的信息反馈到show上 find_board(mine_board,show_board,ROWS,COLS); //输赢机制 } void menu(void) { printf("*************************n"); printf("********1.play***********n"); printf("********0.exit***********n"); printf("****** 扫雷 **********n"); printf("***** 好扫,扫饱他 *****n"); printf("*************************n"); } int main(int argc, const char * argv[]) { int input = 0; srand((unsigned int)time(NULL)); //写一个扫雷游戏 do { menu(); printf("请输入你的选择n"); scanf("%d",&input); switch (input) { case 1: game(); break; case 0: printf("推出成功n"); break; default: printf("选择错误n"); break; } } while (input); return 0; }
游戏代码详解
游戏框架构建
棋盘绘制
首先定义棋盘的大小,定义棋盘行数和列数。
#define ROW 9
#define COL 9
#define ROWS 9+ROW
#define COLS 9+COL
为了防止数组越界问题出现 我们使用两个棋盘来解决
一个棋盘 mine ,在其上面玩游戏
而另一个棋盘 show ,将结果打印给玩家看
void display_board(char board[ROWS][COLS],int rows, int cols) { for(int j =0; j<=COL ; j++) printf("%d ",j); printf("n"); for (int i = 1; i <=ROW; i++) { printf("%d ",i); for (int j = 1; j <=COL ; j++) { printf("%c ",board[i][j]); } printf("n"); } }
别忘记初始化了
棋盘初始化void init_board(char board[ROWS][COLS],int rows, int cols,char set) { for (int i = 0; i现在我们有了已经初始化好的棋盘,下一步我们就要布置雷在我们的mine棋盘上
void set_mine(char mine_board[ROWS][COLS],int rows, int cols) { int count = Easy_count; while (count) { int x = rand()%ROW+1; int y = rand()%ROW+1; if ( mine_board[x][y] == '0') { mine_board[x][y] = '1'; count--; } } }在本文中我们用1表示雷地 0表示安全地 而*是未探索的区域 我们会在show棋盘上打印*,再将玩家在mine棋盘上扫雷的结果反馈回show棋盘上,布置雷 我们仍是随机布置 使用到rand函数
开始扫雷玩家输入坐标 我们判断该坐标的合法性 在判断是否为雷1还是安全地0
void find_board(char mine_board[ROWS][COLS],char show_board[ROWS][COLS],int rows, int cols) { int x = 0; int y = 0; int win = 0; //判断坐标合法性 while(win < ROW*COL-Easy_count) { printf("请输入坐标!!!n"); scanf("%d %d",&x,&y); if (x>=1 && x<= ROW && y>=1 && y<= COL) { if(show_board[x][y] == '*') { if (mine_board[x][y] == '1') { printf("BOOM!!!!你给炸死了QAQn"); display_board(mine_board,ROWS,COLS); break; } int count = get_mine_board( mine_board , x , y ); show_board[x][y] = count + '0'; display_board(show_board,ROWS,COLS); win++; } else { printf("目标已占用n"); } } else { printf("坐标错误请重新输入~~~~~n"); } }为了更加贴近真正的扫雷游戏,如果该地为安全地 我们还得返回 四周八个空间内的雷的数量
int get_mine_board(char mine_board[ROWS][COLS],int x, int y) { return mine_board[x+1][y-1]+ mine_board[x+1][y]+ mine_board[x][y+1]+ mine_board[x+1][y+1]+ mine_board[x-1][y]+ mine_board[x][y-1]+ mine_board[x-1][y-1]+ mine_board[x-1][y+1]-8*'0'; }输赢判断void find_board(char mine_board[ROWS][COLS],char show_board[ROWS][COLS],int rows, int cols) { int x = 0; int y = 0; int win = 0; //判断坐标合法性 while(win < ROW*COL-Easy_count) { printf("请输入坐标!!!n"); scanf("%d %d",&x,&y); if (x>=1 && x<= ROW && y>=1 && y<= COL) { if(show_board[x][y] == '*') { if (mine_board[x][y] == '1') { printf("BOOM!!!!你给炸死了QAQn"); display_board(mine_board,ROWS,COLS); break; } int count = get_mine_board( mine_board , x , y ); show_board[x][y] = count + '0'; display_board(show_board,ROWS,COLS); win++; } else { printf("目标已占用n"); } } else { printf("坐标错误请重新输入~~~~~n"); } } if(win == ROW*COL-Easy_count) { printf("恭喜你,排雷成功^ _ ^n"); display_board(mine_board,ROWS,COLS); } }主函数有了上面这些函数,主函数可以轻松写出
#include "game.h" #includevoid game(void) { char mine_board[ROWS][COLS] = {0}; char show_board[ROWS][COLS] = {0}; //初始化 init_board(mine_board,ROWS,COLS,'0'); init_board(show_board,ROWS,COLS,'*'); //打印 // display_borad(mine_borad,ROWS,COLS); // display_borad(show_borad,ROWS,COLS); //布置雷 set_mine(mine_board,ROWS,COLS); display_board(show_board,ROWS,COLS); // display_board(mine_board,ROWS,COLS); //排查雷 把mine上的信息反馈到show上 find_board(mine_board,show_board,ROWS,COLS); //输赢机制 } void menu(void) { printf("*************************n"); printf("********1.play***********n"); printf("********0.exit***********n"); printf("****** 扫雷 **********n"); printf("***** 好扫,扫饱他 *****n"); printf("*************************n"); } int main(int argc, const char * argv[]) { int input = 0; srand((unsigned int)time(NULL)); //写一个扫雷游戏 do { menu(); printf("请输入你的选择n"); scanf("%d",&input); switch (input) { case 1: game(); break; case 0: printf("推出成功n"); break; default: printf("选择错误n"); break; } } while (input); return 0; }