代码分为三部分,test.c(整体游戏框架),game.c(游戏的实现,定义的大部分函数),game.h(放的用到的头文件)
目录
2.void Initboard(char board[ROWS][COLS],int row,int col,char set);
4.void Displayboard(char board[ROWS][COLS], int row, int col);
5.void leiboard(char board[ROWS][COLS], int row, int col);
6. void usermove(char board[ROWS][COLS], char userboard[ROWS][COLS], int row, int col);
7.int leicount(char board[ROWS][COLS], int x, int y);
8.void openaround(char board[ROWS][COLS], char userboard[ROWS][COLS], int x, int y);
9.int iswin(char userboard[ROWS][COLS], int row, int col);
一、游戏流程
int main()
{
int input = 0;
srand((unsigned int)time(NULL));
do
{
menu();
printf("请输入:>");
scanf_s("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("游戏结束\n");
break;
default:
printf("输入错误,请重新输入\n");
break;
}
} while (input);
return 0;
}
二、定义的函数
void menu();
void game();
void Initboard(char board[ROWS][COLS],int row,int col,char set);
void Displayboard(char board[ROWS][COLS], int row, int col);
void leiboard(char board[ROWS][COLS], int row, int col);
void usermove(char board[ROWS][COLS], char userboard[ROWS][COLS], int row, int col);
//返回类型为整型,返回用户输入坐标周围雷的个数
int leicount(char board[ROWS][COLS], int x, int y);
void openaround(char board[ROWS][COLS], char userboard[ROWS][COLS], int x, int y);
int iswin(char userboard[ROWS][COLS], int row, int col);
三、函数的实现
1.void menu();
void menu()
{
printf("*********************************\n");
printf("********* 1.play **********\n");
printf("********* 0.end **********\n");
printf("*********************************\n");
}
2.void game();
void game()
{
char board1[ROWS][COLS];
char board2[ROWS][COLS];
printf("开始游戏\n");
//初始化扫雷棋盘
Initboard(board1, ROW, COL, '0');
//给用户展示的排雷页面的初始化
//放雷,把雷初始化好,雷是放在棋盘1
leiboard(board1, ROW, COL);
Initboard(board2, ROW, COL, '*');
//打印一下给用户展示的棋盘
Displayboard(board2, ROW, COL);
//这个打印棋盘
//1.初始化为0以及放入雷后的棋盘
//2.用户排雷失败被炸死的时候,让用户被炸的明白用这个给打印出来
//3.让程序员好用来测试完成扫雷游戏,最后注释掉
//Displayboard(board1, ROW, COL);
//用户进行扫雷,输入要排的坐标,都是在棋盘1上进行的,棋盘2,只是为了方便给用户展示,总不能把雷的位置也给用户展示了吧
usermove(board1, board2, ROW, COL);
}
2.void Initboard(char board[ROWS][COLS],int row,int col,char set);
//初始化棋盘
//多初始化的两行,两列棋盘是为了判断边缘是否有雷时,数组会被越界访问
void Initboard(char board[ROWS][COLS], int row, int col, char set)
{
int i = 0;
int j = 0;
for (i = 0; i < row + 2; i++)
{
for (j = 0; j < col + 2; j++)
{
board[i][j] = set;
}
}
}
4.void Displayboard(char board[ROWS][COLS], int row, int col);
//打印1-9的初始化的那部分棋盘
void Displayboard(char board[ROWS][COLS], int row, int col)
{
int i = 1;
int j = 1;
for (i = 0; i < row + 1; i++)
{
printf("%d ", i);
}
printf("\n");
for (i = 1; i < row + 1; i++)
{
printf("%d ", i);//打印出行数,竖着的一排嘛,方便看是第几行
for (j = 1; j < col + 1; j++)
{
printf("%c ", board[i][j]);
}
printf("\n");
}
}
5.void leiboard(char board[ROWS][COLS], int row, int col);
//放雷
void leiboard(char board[ROWS][COLS], int row, int col)
{
int x = 0;
int y = 0;
int i = 0;
//放十个雷,用字符1表示
for (i = 0; i < pri_count; i++)
{
//用随机数产生1-9的随机数(再棋盘为9*9的情况下,改变ROW和COL会改变)
x = rand() % row + 1;//放到内圈 整个大圈时0-10 内圈是需要初始化和放雷的 即1-9
y = rand() % col + 1;
//这个if也是为了让雷在内圈,多的两行两列只是为了判断边缘的雷的情况,如果不设置的话会比较麻烦,或者会越界访问数组。
//还有个条件就是这个地方没有雷才能放
if (x > 0 && x < row + 1 && y>0 && y < col + 1&& board[x][y] == '0')
{
board[x][y] = '1';
}
else
i--;//因为如果上一个if没进去的话,i就多加了一个1,但是没有放上雷,所以就减去一个1
}
}
6. void usermove(char board[ROWS][COLS], char userboard[ROWS][COLS], int row, int col);
void usermove(char board[ROWS][COLS], char userboard[ROWS][COLS], int row, int col)
{
int x = 0;
int y = 0;
int win = 0;
do
{
printf("请输入你要排除的坐标:>");
scanf_s("%d %d", &x, &y);
//判断输入的坐标是否正确
if (x > 0 && x < row + 1 && y>0 && y < col + 1)
{
//判断是否为雷
if (board[x][y] == '1')
{
printf("很遗憾ÿ