2022-06-07 13:01:32 来源 : 软件开发网
本文实例为大家分享了C语言实现扫雷的具体代码,供大家参考,具体内容如下
前言扫雷实现的基本规划:
1、玩家可以自由选择进入和退出游戏2、玩家通过输入坐标来排雷3、排查雷给出提示4、玩家可以任意标记雷区5、排雷同时展开非雷区
下面为效果图:
一、主函数(test.c):通过do while嵌套switch对游戏菜单进行控制:
玩游戏输入1:进入case1开始游戏。
输入2:进入case2退出游戏 。
输入错误:进入default,进入下一次循环重新输入。
菜单给出标记操作提示。
#include "game.h"void menu()//游戏菜单{ printf("**********************************\n"); printf("******* 扫雷游戏 ********\n"); printf("******* 1.play ********\n"); printf("******* 2.exit ********\n"); printf("*******tip1:坐标输入 0 0 ********\n"); printf("******* 进行标记操作 ********\n"); printf("*******tip2:坐标输入 0 1 ********\n"); printf("******* 取消标记操作 ********\n"); printf("**********************************\n");}void game(){ //定义两个棋盘,mine里面雷图,"*"为雷," "为非雷 //show里面-为未排雷区域,数字为周围有几颗雷 //空格区域表示安全区域,周围没有雷 char mine[ROWS][COLS] = { 0 }; char show[ROWS][COLS] = { 0 }; //初始化棋盘 init_board(mine, ROWS, COLS, " "); init_board(show, ROWS, COLS, "-"); //布置雷 set_mine(mine, ROW, COL); Display_board(show, ROW, COL);//打印棋盘 //排查雷 find_mine(mine, show, ROW, COL);}int main(){ int input = 0; srand((unsigned int)time(NULL)); do { menu(); printf("请选择:>"); scanf("%d", &input); switch (input) { case 1: printf("开始游戏\n"); game(); break; case 2: printf("游戏结束\n"); break; default: printf("输入错误,请重新输入\n"); } } while (input != 2); return 0;}
二、头文件及定义(game.h):行数、列数、雷数可随时更改
#include #include #include #define ROW 9 //定义行数为9#define COL 9 //定义列数为9#define EASY_COUNT 10 //简单定义一下雷数#define ROWS ROW+2#define COLS COL+2//初始化棋盘void init_board(char arr[ROWS][COLS], int rows, int cols, char set);//打印棋盘void Display_board(char arr[ROWS][COLS], int row, int col);//布置雷void set_mine(char mine[ROWS][COLS], int row, int col);//排查雷void find_mine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);//标记坐标void sign_show(char show[ROWS][COLS], int row, int col);//删除标记坐标void del_sign_show(char show[ROWS][COLS], int row, int col);
三、game.c(游戏代码实现全过程):基本逻辑就是两个棋盘:
1、mine棋盘为设雷棋盘,用来设置雷。2、show棋盘给玩家看,打印信息给玩家。
#include "game.h"//初始化棋盘void init_board(char arr[ROWS][COLS], int rows, int cols,char set){ int i = 0; int j = 0; for (i = 0; i < rows; i++) { for (j = 0; j < cols; j++) { arr[i][j] = set; } }}//打印棋盘void Display_board(char arr[ROWS][COLS], int row, int col){ int i = 0; int j = 0; for (i = 0; i <= col; i++) { printf(" %d ", i); if (i < col) { printf("|"); } } printf("\n"); for (i = 0; i <= col; i++) { printf("---"); if (i < col) { printf("|"); } } printf("\n"); for (i = 1; i <= row; i++) { printf(" %d ", i); printf("|"); for (j = 1; j <= col; j++) { printf(" %c ", arr[i][j]); if (j < col) { printf("|"); } } printf("\n"); if (i < row) { for (j = 0; j <= col; j++) { printf("---"); if (j < col) { printf("|"); } } } printf("\n"); } printf("=======================================\n");}//布置雷void set_mine(char mine[ROWS][COLS], int row, int col){ int count = EASY_COUNT; int x = 0; int y = 0; while (count) { x = rand() % row + 1; y = rand() % col + 1; if (mine[x][y] == " ") { mine[x][y] = "*"; count--; } }}//排查雷static int get_mine_count(char mine[ROWS][COLS], int x, int y)//查输入坐标周围雷数{ int i = 0; int j = 0; int count = 0; for (i = x - 1; i <= x + 1; i++) { for (j = y - 1; j <= y + 1; j++) { if (mine[i][j] == "*") { count++; } } } return count;}void spread_mine(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y)//展开非雷区{ int i = 0; int j = 0; for (i = x - 1; i <= x + 1; i++) { for (j = y - 1; j <= y + 1; j++) { if (i >= 1 && i <= ROW && j >= 1 && j <= COL) { if (get_mine_count(mine, i, j) == 0 && show[i][j] == "-") { show[i][j] = " "; spread_mine(mine, show, i, j); } else if(get_mine_count(mine, i, j) != 0 && show[i][j] == "-") { int count = get_mine_count(mine, i, j); show[i][j] = count + "0"; } } } }}int is_win(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col){ int i = 0; int j = 0; int count = 0; for (i = 1; i <= row; i++) { for (j = 1; j <= col; j++) { if (mine[i][j] != "*" && show[i][j] == "-") { return 0; } } } return 1;}void sign_show(char show[ROWS][COLS], int row, int col)//标记坐标{ int x = 0; int y = 0; printf("请选择需要标记的坐标:>"); while (1) { scanf("%d %d", &x, &y); if (show[x][y] == "-") { show[x][y] = "#"; break; } else { printf("输入错误,请重新输入"); } }}void del_sign_show(char show[ROWS][COLS], int row, int col)//删除标记坐标{ int x = 0; int y = 0; printf("请选择需要删除标记的坐标:>"); while (1) { scanf("%d %d", &x, &y); if (show[x][y] == "#") { show[x][y] = "-"; break; } else { printf("输入错误,请重新输入"); } }}void find_mine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col){ int x = 0; int y = 0; while (1) { printf("请输入排雷的坐标:>"); scanf("%d %d", &x, &y); if (show[x][y] != "-") { printf("此坐标已扫过,请重新输入\n"); continue; } else if (x >= 1 && x <= row && y >= 1 && y <= col) { if (mine[x][y] == "*") { printf("很遗憾,你被炸死了\n"); Display_board(mine, ROW, COL); break; } else { int count = get_mine_count(mine, x, y); if (count + "0" == "0") { show[x][y] = " "; spread_mine(mine, show, x, y);//展开非雷区 } else { show[x][y] = count + "0"; } Display_board(show, ROW, COL); } } else if (x == 0 && y == 0)//输入坐标为两个0时进行标记操作 { sign_show(show, row, col);//标记坐标 Display_board(show, ROW, COL); } else if (x == 0 && y == 1)//输入坐标为两个0时进行标记操作 { del_sign_show(show, row, col);//删除标记 Display_board(show, ROW, COL); } else { printf("输入坐标超出雷区范围,请重新输入\n"); } if (is_win(mine,show,row,col)==1) { printf("恭喜你,扫雷成功\n"); Display_board(mine, ROW, COL); } }}
总结以上就是自写C语言扫雷的代码全部内容了: