C语言扫雷代码
杯浅 人气:0前言
扫雷实现的基本规划:
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 <stdio.h> #include <stdlib.h> #include <time.h> #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语言扫雷的代码全部内容了:
加载全部内容