扫雷是大家在日常生活中经常接触的一款游戏,用C语言就可以实现简单扫雷
//game.h
#define ROW 9
#define COL 9
#define COLS COL+2
#define ROWS ROW+2
#define Mine_Sum 10
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void init_board(char mine[ROWS][COLS], int row, int col, char set);void print(char mine[ROWS][COLS], int row, int col);
void setmine(char mine[ROWS][COLS], int row, int col);
void findmine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);//找雷的函数
int mum(char show[ROWS][COLS], int i, int j);
void ExpandBoard(char mine[ROWS][COLS], char show[ROWS][COLS], int i, int j, int* win);
首先我们先在game.h头文件中添加自己需要的函数,函数从上到下依次为
1.初始化棋盘函数
2.安放雷的函数
3.找雷的函数
4.返回雷的数量的函数
5.实现区域消去的函数
同时我们宏定义一下常用的数据,比如棋盘的行ROW,棋盘的列COL,这样我们可以方便地修改棋盘的大小,至于ROW+2和COL+2是显示棋盘外的隐藏棋盘,方便我们对棋盘进行操作,最后是Mine_mum,表示雷的数量。
接下来实现函数的代码都放在game.c
//game.c
#include"game.h"
void init_board(char mine[ROWS][COLS], int row, int col, char set)//初始化棋盘的函数
{
int i, j;
for (i = 0; i < ROWS; i++)
{
for (j = 0; j < COLS; j++)
{
mine[i][j] = set;
}
putchar('\n');
}
}
void print(char mine[ROWS][COLS], int row, int col)//打印棋盘的函数
{
int i, j;
for (i = 0; i <=COL; i++)
{
printf("%d ", i);
}
putchar('\n');
for (i = 1; i <= ROW; i++)
{
printf("%d ", i);
for (j = 1; j <= COL; j++)
{
printf("%c ",mine[i][j]);
}
putchar('\n');
}
}
void setmine(char mine[ROWS][COLS], int row, int col)//埋雷的函数
{
int sum = Mine_Sum+1;
while (sum)
{
int i = rand() % ROW + 1;
int j = rand() % COL + 1;
if (mine[i][j] == '0')
{
mine[i][j] = '1';
sum--;
}
}
}
void findmine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)//找雷的函数
{
int i, j;
int k=0;
int a = 0;
int* win = &a;
while (1)
{
printf("请输入你找的雷的坐标\n");
scanf("%d%d", &i, &j);
if (i <= 9 && i >= 1 && j <= 9 && j >= 1)
{
if (show[i][j] == '1')
{
printf("你踩到雷了,游戏结束\n");
print(show, ROW, COL);
break;
}
else
{
ExpandBoard(mine, show, i, j, win);
if ((*win) ==ROW * COL - Mine_Sum)
{
printf("恭喜你排查了所有的雷\n");
print(show, ROW, COL);
break;
}
/*(*win)++;
k = mum(show, i, j);
if (k == 0)
{
mine[i][j] = ' ';
(*win)++;
if(mine[i-1][j-1]=='*'&&i-1>0&&i-1<ROWS&&j-1>0&&j-1<COLS)*/
/*}*/
//mine[i][j] = k + '0';
//putchar('\n');
//putchar('\n');
print(mine, ROW, COL);//每完成一次操作打印一次棋盘
//flag--;
}
}
else
{
printf("你输入的坐标不合法,请重新输入\n");
}
}
/*if (flag==0)
{
printf("恭喜你排查了所有的雷\n");
print(show, ROW, COL);
}*/
}
int mum(char show[ROWS][COLS], int i, int j)
{
return show[i - 1][j - 1] + show[i - 1][j] + show[i - 1][j + 1]
+ show[i][j - 1] + show[i][j + 1] + show[i + 1][j - 1] +
show[i + 1][j] + show[i + 1][j + 1]-8*'0';
}
void ExpandBoard(char mine[ROWS][COLS], char show[ROWS][COLS], int i, int j, int* win)
{
(*win)++;
int k = mum(show, i, j);
if (k == 0)
{
mine[i][j] = ' ';
(*win)++;
if (mine[i - 1][j - 1] == '*' && i - 1 > 0 && i - 1 < ROWS && j - 1 > 0 && j - 1 < COLS)
ExpandBoard(mine, show, i - 1, j - 1, win);
if (mine[i - 1][j] == '*' && i - 1 > 0 && i - 1 < ROWS && j > 0 && j < COLS)
ExpandBoard(mine, show, i - 1, j, win);
if (mine[i - 1][j + 1] == '*' && i - 1 > 0 && i - 1 < ROWS && j + 1 > 0 && j + 1 < COLS)
ExpandBoard(mine, show, i - 1, j + 1, win);
if (mine[i][j - 1] == '*' && i > 0 && i < ROWS && j - 1 > 0 && j - 1 < COLS)
ExpandBoard(mine, show, i, j - 1, win);
if (mine[i][j + 1] == '*' && i > 0 && i < ROWS && j + 1 > 0 && j + 1 < COLS)
ExpandBoard(mine, show, i, j + 1, win);
if (mine[i + 1][j - 1] == '*' && i + 1 > 0 && i + 1 < ROWS && j - 1 > 0 && j - 1 < COLS)
ExpandBoard(mine, show, i + 1, j - 1, win);
if (mine[i + 1][j + 1] == '*' && i + 1 > 0 && i + 1 < ROWS && j + 1 > 0 && j + 1 < COLS)
ExpandBoard(mine, show, i + 1, j + 1, win);
}
else
mine[i][j] = k + '0';
}
最后是进行整体操作的函数test.c
//test.c
#include"game.h"
void game()
{
char mine[ROWS][COLS];//游戏界面棋盘
char show[ROWS][COLS];//埋雷信息棋盘
init_board(mine,ROWS,COLS,'*');//初始化显示棋盘
print(mine, ROW, COL);//打印棋盘
init_board(show, ROWS, COLS, '0');
setmine(show, ROW, COL);//埋雷
//print(show, ROW, COL);//打印棋盘
findmine(mine, show, ROW, COL);//找雷的函数
}
void menu()
{
printf("**********扫雷********\n");
printf("*******1.开始游戏********\n");
printf("*******0.结束游戏********\n");
printf("********************\n");
}
void test()
{
srand((unsigned int)time(NULL));
int i;
do
{
menu();
printf("请输入你的选择\n");
scanf("%d", &i);
switch (i)
{
case 1:
game(); break;
case 0:
printf("游戏结束\n"); break;
}
} while (i);
}
int main()
{
test();
return 0;
}
同时为了方便用户输入坐标,第一行和第一列我标注了坐标