一.流程图
1,创建菜单选择界面;
2.设置雷和向玩家的界面;
3.设置地雷;
4.判定坐标显示的位置是否有地雷;
5.怕判断周围3-3是否有地雷;
6.递推4;(goto 4)
7.判定结束标志;
注:引用头文件
#pragma once #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <time.h> #define ROW 9 #define COL 9 #define ROWS ROW+2 #define COLS COL+2 #define EASY_COUNT 10 void InitBoard(char board[ROWS][COLS], int rows, int cols, char set);//初始化面板 void DisplayBoard(char board[ROWS][COLS], int row, int col);//玩家端显示 void SetMine(char board[ROWS][COLS], int row, int col);//设置地雷 int GetMineCount(char mine[ROWS][COLS], int x, int y);//就按坐标附近3*3的地雷数 void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);//找地雷并判定游戏输赢的函数 void Explore(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y, int* got);//出现打开一片的特效
利用宏定义来给出棋盘大小,方便后续引用。
扩大棋盘范围,两边+2,是方便扫雷的时候,检测边缘雷时,没有限制性的代码更加简单。
后面布雷时,在9*9内布雷。
二.实现扫雷
1,创建菜单选择界面
#define _CRT_SECURE_NO_WARNINGS #include"game.h" void menu() { printf("*****************\n"); printf("***1- 开始游戏***\n"); printf("***0 - 结束游戏**\n"); printf("*****************\n"); } int main() { int a = 0; do { srand((unsigned int)time(NULL)); menu(); scanf("%d", &a); switch (a) { case 1: game(); break; case 0: default: printf("结束"); a = 0; break; } } while (a); return 0; }
创建开始界面,利用任意数字键都为结束。
1)游戏流程
void game() { char mine[ROWS][COLS];//雷盘 char show[ROWS][COLS];//玩家端显示 InitBoard(show,ROWS,COLS,'*'); InitBoard(mine, ROWS, COLS, '0'); DisplayBoard(show, ROW ,COL); SetMine(mine, ROW, COL); FindMine( mine, show,ROW,COL); }
与流程图一致。
2.设置雷和向玩家的界面
void InitBoard(char board[ROWS][COLS], int rows, int cols, char set)
{
int i, j;
for (i = 0; i < rows; i++)
{
for (j = 0; j < cols; j++)
{
board[i][j] = set;//利用set来体现你的显示
}
}
}
void DisplayBoard(char board[ROWS][COLS], int row, int col)
{
int i, j;
printf("------------------------\n");
for (i = 0; i <= col; i++)//打印列数据
{
printf("%d ", i);
}
printf("\n");
for (i = 1; i <= row; i++)
{
printf("%d ", i);//打印行数字
for (j = 1; j <= col; j++)
{
printf("%c ", board[i][j]);//填充
}
printf("\n");
}
printf("-----------------------------------\n");
}
打印效果
3.设置地雷;
void SetMine(char board[ROWS][COLS], int row, int col) { int count = EASY_COUNT; while (count) { int x = rand() % row + 1;//1~9 int y = rand() % col + 1;//1~9 if (board[x][y] != '1') { board[x][y] = '1';//‘1’为地雷.0为安全 count--; } } }
利用随机数,来给网格内9*9的随机布置地雷;
4.判定坐标显示的位置是否有地雷:
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col) { int x = 0; int y = 0; int win = 0;//非雷的个数 int* got = &win; while (win < ROW*COL -EASY_COUNT) { printf("请输入坐标\n"); scanf("%d %d", &x, &y); if (x > 0 && x <= row && y > 0 && y <=col)//判断坐标范围,是否非法 { if (mine[x][y] == '1') { printf("end!!!\n"); DisplayBoard(mine, ROW, COL); break; } else { if (show [x][y] != '*')//判断是否被开过 { printf("已经选过了\n"); continue; } else { Explore(mine,show,row,col,x,y,got); DisplayBoard(show, ROW, COL); } } } else { printf("坐标非法"); } } if (win == row * col - EASY_COUNT) { printf("成功排完\n"); DisplayBoard(mine, row, col); } }
用win来累计排雷的个数。
用if来判断x,y范围
5.判断周围3-3是否有地雷:
int GetMineCount(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] == '1')//判断地雷 { count++; } } } return count; }
用循环判断炸弹个数;
6.递推4;(goto 4)
oid Explore(char mine[ROWS][COLS],char show[ROWS][COLS], int row,int col,int x, int y, int* got) { if (x > 0 && x <= ROW && y > 0 && y <= COL)//判断坐标合法 { int num = GetMineCount(mine, x, y);//判断当前坐标炸弹个数 if (num == 0)//若无 { (*got)++; show[x][y] = '0' ; int i, j; for (i = x - 1; i <=x + 1; i++) { for (j = y - 1; j <= y + 1; j++) { if (show[i][j] == '*')//循环检测,if判断是否为未选中坐标 { Explore(mine, show,row,col,i, j, got);//利用递推来给像扫雷打开一个范围 } } } } else { (*got)++; show[x][y] = num + '0'; } } }
7.原文件
https://github.com/fallenleaf-1/---.git
能力较差,没写标记炸弹位置。请见谅。