游戏规则
选择要排查的位置,系统将会返回对应四周雷的个数,空白为0
实现扫雷所需的头文件,以及#define定义的常量,及全局变量
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<windows.h>
#define ROW 9
#define COL 9
#define row ROW+2
#define col COL+2
#define NUM 10//最大雷数
int win = 0;//设置排雷的个数
一个小游戏的生成必定需要函数的实现,以下是所需的函数
void menu();//初始化菜单
void InitBoard(char show_Board[row][col], char set);//初始化展示的棋盘
void initBoard(char hide_Board[row][col], char set);//初始化存雷的隐藏棋盘以及埋雷
void PrintBoard(char board[row][col]);//打印棋盘
int is_Win(char show_Board[row][col],char hide_Board[row][col],int x,int y);//判断输赢
int cacl(char hide_Board[row][col], int x, int y); //统计雷的个数
int Play_Move(char show_Board[row][col], char Hide_Board[row][col]);//玩家判断不是雷的位置
void game();//游戏的主函数实现
菜单函数的实现
//初始化菜单
void menu()
{
printf("################################\n");
printf("#########欢迎来到扫雷###########\n");
printf("############1.play##############\n");
printf("############0.exit##############\n");
printf("################################\n");
}
初始化展示给玩家棋盘函数的实现,利用双重循环给对应的位置赋值
//初始化展示棋盘
void InitBoard(char show_Board[row][col], char set)
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
show_Board[i][j] = set;
}
}
}
初始化埋雷的棋盘,隐藏不给玩家看,利用rand()函数随机设定雷出现的位置
//初始化隐藏棋盘棋盘埋雷
void initBoard(char hide_Board[row][col], char set)
{
int num = NUM;
int x = 0;
int y = 0;
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
hide_Board[i][j] = '0';//将初始棋盘附近都记录未字符0,以便于后续的查找附近雷的个数
}
}
while (num)
{
x = rand() % ROW + 1;
y = rand() % COL + 1;
if (hide_Board[x][y] =='0')//防止重复布雷到同一个位置
{
hide_Board[x][y] = set;
num--;
}
}
}
将棋盘打印出来的实现
//打印棋盘
void PrintBoard(char board[row][col])
{
int i = 0;
int j = 0;
for (i = 0; i < row-1; 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");
}
}
判断输赢函数的实现,用上方定义的全局变量win来记录,判断是否赢,传入具体位置判断是否踩雷
//判断输赢及游戏是否继续
int is_Win(char show_Board[row][col],char hide_Board[row][col],int x,int y)
{
int i = 0;
int j = 0;
if (hide_Board[x][y] == '1')
{
system("cls");
printf("失败,您被炸死了,凉凉!\n");
PrintBoard(hide_Board);//打印埋雷的位置
system("pause");//按任意键继续
return 0;//游戏结束
}
if (win== ROW*COL-NUM)
{
system("cls");
printf("胜利!\n");
PrintBoard(hide_Board);//打印埋雷的位置
system("pause");//按任意键继续
return 0;//游戏结束
}
return 1;//代表继续游戏
}
统计一个点附近雷的个数,就要利用上方为非雷位置赋值为字符0==’0‘,如’1‘-’0‘=1,并返回对应值
//计算这个点附近雷的个数
int cacl(char hide_Board[row][col], int x, int y) //统计雷的个数
{
return hide_Board[x - 1][y] +
hide_Board[x - 1][y - 1] +
hide_Board[x][y - 1] +
hide_Board[x + 1][y - 1] +
hide_Board[x + 1][y] +
hide_Board[x + 1][y + 1] +
hide_Board[x][y + 1] +
hide_Board[x - 1][y + 1] - 8 * '0';
}
玩家判断非雷位置的实现
//玩家判断
int Play_Move(char show_Board[row][col], char Hide_Board[row][col])
{
int judge = 1;//设置一个变量用于记录是否游戏继续,1为继续,0为结束
int fal =1;
int x = 0;
int y = 0;
int num = 0;//用于记录这个点附近有几个雷
do
{
printf("请输入你要排查的位置\n");
scanf("%d %d", &x, &y);//输入对应坐标
if (show_Board[x][y] != '@' || x < 1 || y < 1 || x > 10 || y > 10)//判断是否输入错误,以及该位置是否已经被玩家判断过
{
printf("输入非法,请重新输入!");
}
else
{
win++;
if (judge = is_Win(show_Board, Hide_Board, x, y) ,judge==0)//如果为零则代表游戏结束,直接退出即可
{
break;
}
num = cacl(Hide_Board, x, y);//得到该位置附近雷的个数
show_Board[x][y] = num + '0';//显示该位置附近的雷数
if (num == 0)//该位置旁边无雷改变为空格即可
{
show_Board[x][y] = ' ';
}
fal = 0;//来记录输入是否非法,解除循环
}
} while (fal);
return judge;
}
以下是全部函数的实现
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<windows.h>
#define ROW 9
#define COL 9
#define row ROW+2
#define col COL+2
#define NUM 10//最大雷数
int win = 0;//设置排雷的个数
//初始化菜单
void menu()
{
printf("################################\n");
printf("#########欢迎来到扫雷###########\n");
printf("############1.play##############\n");
printf("############0.exit##############\n");
printf("################################\n");
}
//初始化展示棋盘
void InitBoard(char show_Board[row][col], char set)
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
show_Board[i][j] = set;
}
}
}
//初始化隐藏棋盘棋盘埋雷
void initBoard(char hide_Board[row][col], char set)
{
int num = NUM;
int x = 0;
int y = 0;
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
hide_Board[i][j] = '0';//将初始棋盘附近都记录未字符0,以便于后续的查找附近雷的个数
}
}
while (num)
{
x = rand() % ROW + 1;
y = rand() % COL + 1;
if (hide_Board[x][y] =='0')//防止重复布雷到同一个位置
{
hide_Board[x][y] = set;
num--;
}
}
}
//打印棋盘
void PrintBoard(char board[row][col])
{
int i = 0;
int j = 0;
for (i = 0; i < row-1; 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");
}
}
//判断输赢及游戏是否继续
int is_Win(char show_Board[row][col],char hide_Board[row][col],int x,int y)
{
int i = 0;
int j = 0;
if (hide_Board[x][y] == '1')
{
system("cls");
printf("失败,您被炸死了,凉凉!\n");
PrintBoard(hide_Board);//打印埋雷的位置
system("pause");//按任意键继续
return 0;//游戏结束
}
if (win== ROW*COL-NUM)
{
system("cls");
printf("胜利!\n");
PrintBoard(hide_Board);//打印埋雷的位置
system("pause");//按任意键继续
return 0;//游戏结束
}
return 1;
}
//计算这个点附近雷的个数
int cacl(char hide_Board[row][col], int x, int y) //统计雷的个数
{
return hide_Board[x - 1][y] +
hide_Board[x - 1][y - 1] +
hide_Board[x][y - 1] +
hide_Board[x + 1][y - 1] +
hide_Board[x + 1][y] +
hide_Board[x + 1][y + 1] +
hide_Board[x][y + 1] +
hide_Board[x - 1][y + 1] - 8 * '0';
}
//玩家走棋
int Play_Move(char show_Board[row][col], char Hide_Board[row][col])
{
int judge = 1;//设置一个变量用于记录是否游戏继续,1为继续,0为结束
int fal =1;
int x = 0;
int y = 0;
int num = 0;//用于记录这个点附近有几个雷
do
{
printf("请输入你要排查的位置\n");
scanf("%d %d", &x, &y);
if (show_Board[x][y] != '@' || x < 1 || y < 1 || x > 10 || y > 10)//判断是否输入错误,以及该位置是否已经被玩家判断过
{
printf("输入非法,请重新输入!");
}
else
{
win++;
if (judge = is_Win(show_Board, Hide_Board, x, y) ,judge==0)//如果为零则代表游戏结束,直接退出即可
{
break;
}
num = cacl(Hide_Board, x, y);
show_Board[x][y] = num + '0';//显示该位置附近的雷数
if (num == 0)//该位置旁边无雷改变为空格即可
{
show_Board[x][y] = ' ';
}
fal = 0;//来记录输入是否非法,解除循环
}
} while (fal);
return judge;
}
void game()
{
int judge = 0;
char Show_Board[row][col] = { 0 };
char Hide_Board[row][col] = { 0 };
InitBoard(Show_Board, '@');//初始化棋盘
initBoard(Hide_Board, '1');//初始化棋盘
do
{
PrintBoard(Show_Board);//打印棋盘
judge=Play_Move(Show_Board, Hide_Board);//玩家移动
system("cls");
} while (judge);
}
void test()
{
int input = 0;
srand((unsigned int)time(NULL));
do
{
menu();
printf("请选择:>\n");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戏!");
break;
default:
printf("非法输入,请重新输入!");
//一秒后清屏
Sleep(1000);
system("cls");
break;
}
} while (input);//用input来记录,0为停止
}
int main()
{
test();
return 0;
}