本次对之前的扫雷游戏进行了重新编写与更新,在此次的游戏实现中新增加了剩余地雷数量统计、地雷标记、地雷标记取消的功能,游戏实现的主体逻辑并未改变,相比于之前的游戏,此次的内容会更加的完善。
游戏代码资源如下,需要的朋友可以自取。
在本次编写的游戏中包含以下功能:
【扫雷】#C语言的第三个小游戏 #保姆级编写思路
本次新编写游戏部分代码如下:
//引用头文件
#include
#include
#include
#include
//定义标识符常量
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define COUNT 5
//函数声明
void init_board(char board[ROWS][COLS], int rows, int cols, char ret);//初始化
void print_board(char board[ROWS][COLS], int row, int col, int count);//打印
void set_mine(char board[ROWS][COLS], int row, int col, char ret);//埋雷
void find_mine(char shadow[ROWS][COLS], char mine[ROWS][COLS], int row, int col);//排雷shadow, mine
void menu2();//选择操作菜单
void menu3();//选择操作菜单2
char judge_mine(char shadow[ROWS][COLS], char mine[ROWS][COLS], int row, int col, int x, int y);//判断地雷
int static_mine(char shadow[ROWS][COLS], char mine[ROWS][COLS], int row, int col, int x, int y);//坐标周围地雷计数
void auto_find(char shadow[ROWS][COLS], char mine[ROWS][COLS], int row, int col, int x, int y);//自动排雷
int judge_win(char shadow[ROWS][COLS], int row, int col);//判断胜利
int judge_win2(char shadow[ROWS][COLS], int row, int col);//判断未排雷数量
int auto_mark(char shadow[ROWS][COLS], int row, int col, int count);//自动标记
//初始化棋盘
void init_board(char board[ROWS][COLS], int rows, int cols, char ret)
{
for (int i = 0; i < rows; i++)//初始化行元素
{
for (int j = 0; j < cols; j++)//初始化列元素
{
board[i][j] = ret;
}
}
}
//打印棋盘
void print_board(char board[ROWS][COLS], int row, int col, int count)
{
printf("\n *---地雷 #---未排雷区域 P---旗帜\n\n");
printf("剩余地雷:%d\n", count);
printf("|");
for (int i = 0; i <= row; i++)//打印列坐标
{
printf(" %d |", i);
}
printf("\n");
//打印分割线
printf("|");
for (int j = 0; j <= col; j++)//打印列
{
printf("---|");
}
printf("\n");
for (int i = 1; i <= row; i++)//打印行
{
printf("| %d |", i);//打印行号
for (int j = 1; j <= col; j++)//打印列
{
printf(" ");
printf("%c", board[i][j]);
printf(" |");
}
printf("\n");
//打印分割线
printf("|");
for (int j = 0; j <= col; j++)//打印列
{
printf("---|");
}
printf("\n");
}
printf("\n");
}
//埋地雷
void set_mine(char board[ROWS][COLS], int row, int col, char ret)
{
int count = COUNT;//地雷数量
while (count)
{
int flag = 0;//判断埋雷是否成功
int i = rand() % ROW + 1;//地雷横坐标
int j = rand() % COL + 1;//地雷纵坐标
if (i >= 1 && i <= row)//判断横坐标的合法性1-row
{
if (j >= 1 && j <= col)//判断纵坐标的合法性1-col
{
if (board[i][j] == ' ')
{
board[i][j] = ret;
flag = 1;//成功埋雷
}
}
}
if (flag)
count--;
}
}
//通过坐标周围地雷数
int static_mine(char shadow[ROWS][COLS], char mine[ROWS][COLS], int row, int col, int x, int y)
{
int count = 0;//计数器
for (int i = -1; i < 2; i++)//横坐标判断
{
for (int j = -1; j < 2; j++)
{
if (mine[x + i][y + j] == '*')//坐标点为地雷
count++;//计数器+1
}
}
return count;
}
//菜单栏
void menu()
{
printf("#####################\n");
printf("#### 0. 退出游戏 ####\n");
printf("#### 1. 退出游戏 ####\n");
printf("#### 请选择<0/1> ####\n");
printf("#####################\n");
}
//游戏
void game()
{
//藏雷
char shadow[ROWS][COLS] = { 0 };
//地雷
char mine[ROWS][COLS] = { 0 };
//初始化棋盘
init_board(shadow, ROWS, COLS, '#');
init_board(mine, ROWS, COLS, ' ');
//打印棋盘
print_board(shadow, ROW, COL, COUNT);
//埋雷
set_mine(mine, ROW, COL, '*');
//print_board(mine, ROW, COL,COUNT);
//排雷
find_mine(shadow, mine, ROW, COL);
}
int main()
{
int input = 0;
srand((unsigned)time(NULL));
do
{
menu();//菜单栏
printf("请输入您的选择>:");
scanf("%d", &input);
switch (input)
{
case 0:
printf("正在退出,请耐心等候\n");
Sleep(1000);
system("cls");
break;
case 1:
printf("开始扫雷\n");
game();
break;
default:
printf("输入错误,请重新输入!!!");
Sleep(1000);
system("cls");
break;
}
} while (input);
return 0;
}