目录
一.规则介绍
二.基本思路
三.代码实现
一.规则介绍
扫雷是一个经典的游戏,一张棋盘中有许多不确定是雷还是安全区域的格子,当点击之后若没雷则会在该区域显示周围八个格子雷瑟数目,若踩雷则游戏结束。
二.基本思路
1.创建菜单
2.用二维数组来创建mine 和show棋盘
3.初始化棋盘
4.玩家输入坐标
5.判定游戏是否结束若没有则在刚输入坐标的区域,显示周围八个区域的地雷数并继续游戏
以此类推,直至游戏结束。
三.代码实现
先贴main()函数
所有的代码实现都放在test()函数里
1.创建菜单
与玩家进行交互
运行截图:
当输入数字为零时退出游戏,同时跳出循环,当输入数字为1时,进入game()函数,实现游戏,当为其他数字时,提示输入错误,并不会退出循环。
2.创建棋盘
mineboard 用于实现扫雷相关代码
showboard 用于显示
这里有预处理数据
mineboard 比最终打印出的棋盘大一圈,有利于最终计算所选区域附近八个位置的雷的个数,还能够防止数组越界访问
2.初始化棋盘
mineboard将打印11x11个字符’0‘
showboard将打印9x9个字符’*‘
3.打印棋盘
4.设置雷盘
预处理 easy_type 10 表示最多有10颗雷,用’1‘表示
5.找雷
6.计算board[x][y]周围8个位置上的雷的个数
返回值将会被get_mine_count 函数接收,并通过Didplay 函数打印在屏幕上。
7.判断输赢
如果不小心点到雷被炸死,游戏直接结束。
如果找到除10个雷以外的所有区域还没被炸死,则游戏结束,玩家胜利。
至于界面封装,点一个显示一片的代码后面还会添加
扫雷1.0版本所有代码
test.c
game.h
game.c
#include"game.h"
//初始化棋盘
void Initboard(char board[ROWS][COLS], int rows, int cols, char set)
{int i = 0, j = 0;for (i = 0; i < rows; i++){for (j = 0; j < cols; j++){board[i][j] = set;}}
}void Display(char board[ROWS][COLS], int row, int col)
{int i = 0;int j = 0;//标行for (i = 0; i <= col; i++){printf("%d ", i);//标列}printf("\n");for (int i = 0; i <= row; i++){for (i = 1; i <= row; i++){printf("%d ", i);for (j = 1; j <= col; j++){printf("%c ", board[i][j]);}printf("\n");}printf("\n");}
}
//设置雷盘
void Setboard(char mine[ROWS][COLS], int row, int col)
{int x = 0;int y = 0;int count = easy_type;//设置雷数while (count){x = rand() % row + 1;//生成1~10的随机数y = rand() % col + 1;if (mine[x][y] == '0'){mine[x][y] = '1';//用‘1’代表雷count--;}}
}
//标记雷数static int get_mine_count(char board[ROWS][COLS], int x, int y)
{return board[x-1][y-1] + board[x-1][y] +board[x-1][y+1] + board[x-1][y] + board[x+1][y] + board[x][y+1] +board[x][y-1] + board[x+1][y+1]- 8 * '0';
}//找雷
void Findset(char board[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{int x = 0;int y = 0;int win = 0;//循环,找到不是雷的坐标前,不被雷炸死while (win<ROW*COL-easy_type){//输入坐标,找雷printf("请输入:>");scanf("%d %d", &x, &y);if (x >= 1 && y >= 1 && x <= row && y <= col)//判断输入的x,y是否合法{if (board[x][y] == '1'){printf("恭喜你,游戏结束,你成为了烈士\n");break;//结束循环,游戏结束了}else{//计算board[x][y]周围8个位置的雷个数int n = get_mine_count(board, x, y);//将这个数显示在board[x][y]上show[x][y] = n + '0';//board为char型Display(show, row, col);win++;//找到不是雷的坐标后++}}elseprintf("输入坐标非法,请重新输入\n");}if (win == ROW * COL - easy_type){printf("恭喜你完成挑战,获得“英雄”称号\n");//打印完成后的棋盘Display(board, ROW, COL);}}