扫雷游戏的实现
一、基本实现过程
1、菜单的打印。
2、创建两个二维数组作为棋盘,并且初始化。
3、两个棋盘分别用于布置雷、存放雷。
4、排雷。
5、判断是否踩雷。
6、未踩雷时判断周围雷数。
7、判断雷是否排尽。
二、过程实现
1、游戏实现逻辑
#define _CRT_SECURE_NO_WARNINGS 1 #include"game.h" void Game() { char MineBoard[ROWS][COLS] = { 0 };//布置雷 char ShowBoard[ROWS][COLS] = { 0 };//存放雷 //初始化棋盘 InitBoard(MineBoard, ROWS, COLS, '0'); InitBoard(ShowBoard, ROWS, COLS, '#'); //打印棋盘 // PlantBoard(ShowBoard, ROW, COL); //布置雷 SetMine(MineBoard, ROW, COL); //PlantBoard(MineBoard, ROW, COL); //排查雷 FindMine(MineBoard,ShowBoard, ROW, COL); } void menu() { printf("**************************\n"); printf("* 扫 雷 游 戏 *\n"); printf("**************************\n"); printf("*********1、PLAY**********\n"); printf("*********0、EXIT**********\n"); printf("**************************\n"); } int main() { int input; //srand((unsigned)time(NULL)); do { menu(); printf("请选择:>"); scanf("%d", &input); switch (input) { case 1: system("cls"); Game(); break; case 0: printf("退出游戏.....\n"); break; default: printf("选择错误,请重新选择.....\n"); break; } } while(input); return 0; }
2、打印菜单
void menu() { printf("**************************\n"); printf("* 扫 雷 游 戏 *\n"); printf("**************************\n"); printf("*********1、PLAY**********\n"); printf("*********0、EXIT**********\n"); printf("**************************\n"); }
3、棋盘初始化
创建11X11的二维数组,游戏的棋盘为9X9,为什么初始化为11X11的呢?
创建为11X11为的是,在玩家排雷时能更好的找到所要排雷的坐标。
#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) { for (int i = 0; i < rows; ++i) { for (int j = 0; j < cols; ++j) { Board[i][j] = set; } } }
4、棋盘的打印
void PlantBoard(char Board[ROWS][COLS], int row, int col) { for (int i = 0; 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 ", Board[i][j]); } printf("\n"); } }
5、布雷
设置棋盘中雷的个数
#define LEVEL 10
要使雷在棋盘中随机放入,利用srand(time(0))生成随机数种子,雷用‘1’来表示.
void SetMine(char Board[ROWS][COLS], int row, int col) { int set = LEVEL; srand(time(0));//用当前时间来设定rand函数所用的随机数产生演算法的种子值 while (set) { int x = rand() % row + 1; int y = rand() % col + 1; if (Board[x][y] == '0') { Board[x][y] = '1'; set--; } } }
6、排雷
排雷两种状态:1、踩到雷,游戏结束。2、未踩到雷,输出该坐标附近的雷数
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col) { int x, y; int win=0; while (win<ROW*COL-LEVEL) { printf("请输入要排查的坐标:>"); scanf("%d %d", &x, &y); //判断是否坐标合法 if ((x<1 || x>row) && (y<1 || y>col)) { printf("坐标非法,请重新输入!\n"); } //是否踩到雷 if (mine[x][y] == '1') { PlantBoard(mine, ROW, COL); printf("很遗憾,你被炸死了..\n"); break; } //统计雷数 int count = GetMine(mine, x,y); show[x][y] = count + '0'; //PlantBoard(show, ROW, COL); win++; system("cls"); PlantBoard(show, ROW, COL); } if (win >= ROW * COL - LEVEL) { PlantBoard(show, ROW, COL); printf("恭喜你排雷成功\n"); } }
未踩到雷时,统计周围雷数。
int GetMine(char mine[ROWS][COLS], int x, int y) { return mine[x - 1][y - 1] + mine[x - 1][y] + mine[x - 1][y + 1] + mine[x][y - 1] + mine[x][y + 1] + mine[x + 1][y - 1] + mine[x + 1][y] + mine[x + 1][y + 1] - 8 * '0'; }
三、游戏实现过程中的难点
1、雷的随机分布
srand(time(0));//用当前时间来设定rand函数所用的随机数产生演算法的种子值
2、雷的放置
棋盘是用存放雷棋盘中用‘#’表示棋盘初始化状态,在布置雷棋盘中’1‘表示雷,’0‘表示安全区。
3、周围雷数的统计
通过返回在布置雷棋盘中输入坐标周围8个坐标的ASCLL码值减去字符8个’0’值。并在该坐标输出雷数。
4、坐标输入一定要正确!!!
四、不足
在排雷过程中,不能出现扫雷游戏中那种大面积,目前能力有限,只能输出周围8个位置的雷数。初学者第一次,技术不足,有待提高,冲冲冲!!