扫雷的实现

寸阳分阴须爱惜,休负春色与时光。这篇文章主要讲述扫雷的实现相关的知识,希望能为你提供帮助。
扫雷分为三个部分主程序部分,功能函数实现部分,头函数部分
*注:如果抄代码的话,建议把三个部分分成三个文件,且头函数用game.h作为名字
?
?主函数部分?

#include"game.h"

void menu()
{
printf("**************************\\n");
printf("******1、play******\\n");
printf("******0、exit******\\n");
printf("**************************\\n");
}

void game()
{
//定义数组
char mine[ROWS][COLS] = { 0 };
char show[ROWS][COLS] = { 0 };

//初始化数组
initboard(mine,ROWS,COLS,0);
initboard(show,ROWS,COLS,*);

//打印棋盘
//display(mine, ROW, COL);
display(show, ROW, COL);

//放置雷
setmine(mine, ROW, COL);
//display(mine, ROW, COL); //查看雷

//排查雷
findmine(mine, show, ROW, 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;
}



头函数
#include< stdio.h>
#include< stdlib.h>
#include< time.h>
#include < conio.h>

#define ROW 9
#define COL 9

#define ROWS 11
#define COLS 11

//定义雷的个数
#define minee 10


//初始化数组
void initboard(char board[ROWS][COLS], int row, int col,char set);

//打印棋盘
void display(char board[ROWS][COLS], int row, int col);

//放置雷
void setmine(char mine[ROWS][COLS],int row ,int col);

//排查雷
void findmine(char mine[ROW][COL], char show[ROW][COL],int row,int col);

【扫雷的实现】

功能函数实现部分
#include"game.h"

//初始化数组
void initboard(char board[ROWS][COLS], int row, int col,char set)
{
int i,j;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
board[i][j] = set;
}
}
}

//打印棋盘
void display(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");
}

//放置雷
void setmine(char mine[ROWS][COLS], int row, int col)
{
int count = minee; //雷的个数
while (count)
{
int x = rand() % row + 1;
int y = rand() % col + 1;
if (mine[x][y] == 0)
{
mine[x][y] = 1;
count--;
}
}

}

int aroundmine(char mine[ROWS][COLS], int x, int y)
{
return mine[x - 1][y - 1] +
mine[x][y - 1] +
mine[x + 1][y - 1] +//左三列
mine[x - 1][y] +
mine[x + 1][y] +//中两列
mine[x - 1][y + 1] +
mine[x][y + 1] +
mine[x + 1][y + 1]//右两列
- 8 * 0;
}

//排查雷
void findmine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
//数组传递变量的过程中,实参与形参的声明必须相同,不然会出项莫名其妙的bug:没有报错,但是再用的时候出现了char (*)[9]”和“char (*)[11]”数组的下标不同
{
//思路
// 判断是否合法
//判断是不是雷
//1、雷:抱歉你被炸死了
//2、不是雷:周围8个有多少个雷

int a = row*col-minee;
while (a)
{
int x = 0;
int y = 0;
printf("请输入坐标:> ");
scanf_s("%d %d", & x, & y);
system("CLS");
if (mine[x][y] == 1)
{
printf("此处是雷,你被炸死了\\n");
display(mine, ROW, COL);
break;
}
else
{
int ret = aroundmine(mine,x,y); //此处函数是计算周围有多少颗雷
show[x][y] = ret + 0;
display(show, ROW, COL);
a--;
}
}
if (a == 0)
{
printf("恭喜你,雷已经被全部排出\\n");
}
}


    推荐阅读