扫雷
如上图,玩扫雷的原理就是避开雷找出所有的雷就胜利,废话不多说,我们直接开始扫雷分析
分析
俗话说的好,玩游戏第一步进入游戏,我们就写出一个游戏菜单出来,让玩家选择
void meun() { printf("********* 扫雷 ********\n"); printf("************************************\n"); printf("********* 0.exit ********\n"); printf("********* 1.paly ********\n"); printf("************************************\n"); }
下面我们要写一个框架,选择玩或者不玩,
int input; srand((unsigned)time(NULL)); do { meun(); printf("进入扫雷界面,请选择>"); scanf("%d", &input); switch (input) { case 0: printf("退出游戏\n"); break; case 1: printf("开始游戏\n"); game(); break; default : printf("输入不符合规定,请重新输入\n"); break; }
下面我们就要开始写扫雷的内容了,首先扫雷我们要给出扫雷的游戏画面,在这个过程中我们可以创建两个数组,一个用于计算,一个用于显示
左边是计算,右边是显示 然后我们就要设计一下输出的界面,要玩家有好的体验
void initialization(char mine[ROWS][COLS], int rows, int cols, char str) { int i = 0; for (i = 0; i < rows; i++) { int j = 0; for (j = 0; j < cols; j++) { mine[i][j] = str; } } }
void Carving(char mine[ROWS][COLS], int row, int col) { int i = 0; for (i = 0; i <= row; i++) { printf("%d ", i); } printf("\n"); printf("--------------------\n"); for (i = 1; i <= row; i++) { printf("%d|", i); int j = 0; for (j = 1; j <= col; j++) { printf("%c ", mine[i][j]); } printf("\n"); } }
然后我们就要布置雷了,雷的设计要随机可以使用rand(),记得设计出源点srand((unsigned)time(NULL))
代码如下:
void Production(char mine[ROWS][COLS], int row, int col) { int count = Count; while (count) { int x = ((rand() % (row)) + 1); int y = ((rand() % (col)) + 1); if (mine[x][y] == '0') { mine[x][y] = '1'; count--; } } }
下面我们就要模拟玩家扫雷了,玩家扫雷要输入坐标, 然后判断是否踩到雷或者已经排查过了,如果没有就要统计周边雷的个数,然后反馈给显示数组,最后判断是否排除完全部雷了,
void paly_mine(char mine[ROWS][COLS], char show_mine[ROWS][COLS], int row, int col) { int count = 0; int x = 0; int y = 0; while (1) { printf("请玩家输入坐标:>"); scanf("%d %d", &x, &y); if (x >= 1 && x <= 9 && y >= 1 && y <= 9) { if (mine[x][y] == '0') { mine[x][y] = ' '; count++; //统计周边的雷数 int sum = 0; int i = x - 1; for (i = x - 1; i <= x + 1; i++) { int j = y - 1; for (j = y - 1; j <= y + 1; j++) { if (i != x && j != y) sum = sum + (mine[i][j] - '0'); } } show_mine[x][y] = '0' + sum; printf("扫雷情况:\n"); Carving(show_mine, ROW, COL); printf("\n"); if (count == (row * col) - Count) { printf("你胜利了\n"); goto aa; } } else if (mine[x][y] == '1') { printf("你被炸死了,游戏结束\n"); break; } } else { printf("请重新输入,你输入的不符合规定\n"); } } aa: ; }
下面是全部代码:
扫雷.c
#include"扫雷.h" void meun() { printf("********* 扫雷 ********\n"); printf("************************************\n"); printf("********* 0.exit ********\n"); printf("********* 1.paly ********\n"); printf("************************************\n"); } int main() { int input; srand((unsigned)time(NULL)); do { meun(); printf("进入扫雷界面,请选择>"); scanf("%d", &input); switch (input) { case 0: printf("退出游戏\n"); break; case 1: printf("开始游戏\n"); game(); break; default : printf("输入不符合规定,请重新输入\n"); break; } } while (input); return 0; }
扫雷函数.c
#include"扫雷.h" void game() { char mine[ROWS][COLS]; char show_mine[ROWS][COLS]; //数组初始化 initialization(mine, ROWS, COLS, '0'); initialization(show_mine, ROWS, COLS, '*'); //布置雷 Production(mine, ROW, COL); //雕刻扫雷棋盘 Carving(mine, ROW, COL); printf("\n"); Carving(show_mine, ROW, COL); //玩家扫雷 paly_mine(mine, show_mine, ROW, COL); /*printf("%p", &mine); printf("%p", &show_mine);*/ } void initialization(char mine[ROWS][COLS], int rows, int cols, char str) { int i = 0; for (i = 0; i < rows; i++) { int j = 0; for (j = 0; j < cols; j++) { mine[i][j] = str; } } } void Carving(char mine[ROWS][COLS], int row, int col) { int i = 0; for (i = 0; i <= row; i++) { printf("%d ", i); } printf("\n"); printf("--------------------\n"); for (i = 1; i <= row; i++) { printf("%d|", i); int j = 0; for (j = 1; j <= col; j++) { printf("%c ", mine[i][j]); } printf("\n"); } } //布置雷 void Production(char mine[ROWS][COLS], int row, int col) { int count = Count; while (count) { int x = ((rand() % (row)) + 1); int y = ((rand() % (col)) + 1); if (mine[x][y] == '0') { mine[x][y] = '1'; count--; } } } //玩家扫雷 void paly_mine(char mine[ROWS][COLS], char show_mine[ROWS][COLS], int row, int col) { int count = 0; int x = 0; int y = 0; while (1) { printf("请玩家输入坐标:>"); scanf("%d %d", &x, &y); if (x >= 1 && x <= 9 && y >= 1 && y <= 9) { if (mine[x][y] == '0') { mine[x][y] = ' '; count++; //统计周边的雷数 int sum = 0; int i = x - 1; for (i = x - 1; i <= x + 1; i++) { int j = y - 1; for (j = y - 1; j <= y + 1; j++) { if (i != x && j != y) sum = sum + (mine[i][j] - '0'); } } show_mine[x][y] = '0' + sum; printf("扫雷情况:\n"); Carving(show_mine, ROW, COL); printf("\n"); if (count == (row * col) - Count) { printf("你胜利了\n"); goto aa; } } else if (mine[x][y] == '1') { printf("你被炸死了,游戏结束\n"); break; } } else { printf("请重新输入,你输入的不符合规定\n"); } } aa: ; }
扫雷.h
#include<stdio.h> #include<stdlib.h> #include<time.h> #define ROW 9 #define COL 9 #define ROWS ROW + 2 #define COLS COL + 2 #define Count 10 // void game(void); //初始化 void initialization(char mine[ROWS][COLS], int row, int col, char str); //打印棋盘 void Carving(char mine[ROWS][COLS], int row, int col); //布置雷 void Production(char mine[ROWS][COLS], int row, int col); //玩家扫雷 vo
总结:
扫雷代码就在这里了,这个代码还可以进一步改进,但是由于时间原因,其他功能没写,有不懂的小可啊可以私聊我