这里我们以9*9规格来实现简易版扫雷的游戏代码
注意:好的代码习惯——边写边调试,不要把错误累积到最后
#include "game.h"//所有需要用到的编译预处理命令放game.h头文件里,这里直接引用头文件
//#include
void menu()
{
printf("***********1.star game***********\n");
printf("*********************************\n");
printf("***********0.quit game***********\n");
}
void game(){}
int main()
{
int input = 0;
do//循环体至少执行一次所以选用do while循环
{
menu();
printf("请输入数字:");
scanf("%d", &input);
if (1 == input)
{
printf("游戏开始\n");
game();//游戏运行
}
else if (0 == input)
{
printf("退出游戏\n");
break;
}
else
{
printf("选择错误请重新输入\n");
}
} while (input);
return 0;
}
//在头文件中定义二维二维数组的行和列,注意编译预处理命令后面没有;
#define ROW 9//方便后期对数组的行和列进行修改#define COL 9
#define ROWS ROW+2
#define COLS COL+2
//初始化数组
void init_board(char board[ROWS][COLS], int rows, int cols, char symbol);
//打印数组
void print_board(char board[ROWS][COLS], int row, int col);
' ; '
//test.c
void game()
{
char mine[ROWS][COLS] = { 0 };
char show[ROWS][COLS] = { 0 };
//初始化数组
init_board(mine, ROWS, COLS, '0');//0和‘0’不一样,如果数组里面元素都是0打印出来什么也不显示,所里这里也需要初始化
init_board(show, ROWS, COLS, '*');
//打印数组
print_board(show, ROW, COL);
print_board(mine, ROW, COL);
}
11×11
数组,但是打印的时候只需要打印9×9
的数组,两个函数传参传的不一样//game.c
//初始化数组
void init_board(char board[ROWS][COLS], int rows, int cols, char symbol)
{
int i = 0, j = 0;
for (i = 0; i < rows; i++)
{
for (j = 0; j < cols; j++)
{
board[i][j] = symbol;
}
}
}
//打印数组
void print_board(char board[ROWS][COLS], int row, int col)
{
int i = 0, j = 0;
//打印一下列数
printf("%d", i);//补齐空位
for (i = 1; 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");
}
1.操作对象是mine数组
2.生成两个随机数(x,y)作为要布置雷的坐标
3.判断此处是否已经布过雷
4.用字符1来代表“有雷”
5.while循环这个过程
//布雷(头文件函数声明
void set_mine(char board[ROWS][COLS], int row, int col);
#define MINE 10 //设置布雷的数目
//布雷(MINE)
void set_mine(char board[ROWS][COLS], int row, int col)
{
int count = 0;
while (count < MINE)
{
//这里要注意!!布雷的时候要防止布在重复(相同的坐标)所以要判断一下!!
int x = rand() % row + 1;
int y = rand() % col + 1;
if (board[x][y] == '0')
{
board[x][y] = '1';//注意这里放的是字符‘1’
count++;
}
}
}
//game.c
int mine_is(char board[ROWS][COLS], int x, int y)
{
return (board[x - 1][y - 1] +
board[x - 1][y] +
board[x - 1][y + 1] +
board[x][y - 1] +
board[x][y + 1] +
board[x + 1][y - 1] +
board[x + 1][y] +
board[x + 1][y + 1] - 8 * '0');
}
//排雷
void clearance_mine(char mine[ROWS][COLS], char show[ROWS][COLS], int rows, int cols)
{
printf("开始排雷\n");
int win = 0;
while (win < ROW * COL - MINE)//只要雷没有排完就一直循环排雷的过程
{
printf("请输入要排雷的坐标:");
int x = 0, y = 0;
scanf("%d %d", &x, &y);
//首先判断坐标是否合法
if (x > 0 && x < rows - 2 && y>0 && y < cols - 2)
{
//再判断坐标是否已经排过雷
if (show[x][y] == '*')
{
if (mine[x][y] != '1')//此处不是雷,则用字符数字替换'*'
{
show[x][y] = (mine_is(mine, x, y) + '0');
print_board(show, ROW, COL);
win++;
}
else//如果踩雷
{
printf("很遗憾,你被炸死了,排雷失败\n");
break;
}
}
}
else
{
printf("坐标非法请重新输入:");
}
}
if (win == ROW * COL - MINE)//排雷成功跳出循环
{
printf("恭喜你排雷成功!\n");
}
}
点击获取完整源码