目录
一、扫雷游戏
1.游戏一共创建使用了三个文件
2.test.c 文件代码(游戏逻辑)
3.game.h - 必要的函数声明代码
4.game.c 游戏所有函数实现代码
一、扫雷游戏
1.游戏一共创建使用了三个文件
test.c - 测试游戏逻辑
game.h - 游戏代码包含的函数声明
game.c - 游戏里面函数的实现
2.test.c 文件代码(游戏逻辑)
#define _CRT_SECURE_NO_WARNINGS 1
//测试游戏逻辑
#include"game.h"
void menu()
{
printf(" < M E N U > \n");
printf("*********************************\n");
printf("********* 1.play **********\n");
printf("********* 0.exit **********\n");
printf("*********************************\n");
}
void game()
{
//创建棋盘
char mine[ROWS][COLS] = { 0 };//布置雷的棋盘
char show[ROWS][COLS] = { 0 };//展示玩家棋盘
//初始化棋盘 - 11*11
InitBoard(mine, ROWS, COLS, '0');//将雷棋盘,初始化为'0'
InitBoard(show, ROWS, COLS, '*');//将玩家棋盘,初始化为'*'
//打印棋盘 - 传过去的show棋盘11*11,实际打印9*9 ROW, COL
DisplayBoard(show, ROW, COL);
//布置雷 - 传过去mine棋盘11*11,实际打印9*9 ROW COL
SetMine(mine, ROW, COL);
DisplayBoard(mine, ROW, COL);
//排查雷 - 再mine数组里将排查的雷的信息,放到show数组里,所以传的时候两个数组都要传
FindMine(mine, show, ROW, COL);
}
int main()
{
//srand只调用一次,放在主函数
srand((unsigned int)time(NULL));
int input = 0;
do
{
menu();
printf("请输入菜单选项:>");
scanf("%d", &input);
printf("\n");
switch (input)
{
case 1:
game();
break;
case 0:
printf("< 退出游戏 >\n");
break;
default:
printf("< 选择错误,请重新输入!!>\n");
break;
}
} while (input);
return 0;
}
3.game.h - 必要的函数声明代码
#define _CRT_SECURE_NO_WARNINGS 1
//包含必要的声明
//定义变量和宏
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define num_mine 10
//包含的头文件
#include<stdio.h>
#include<stdlib.h> /* rand,srand*/
#include<time.h> /* time */
//自定义函数的声明
//初始化棋盘 - 11*11
void InitBoard(char board[ROWS][COLS], int rows, int cols, char set);
//打印棋盘 - 传过来的是11*11 打印的是9*9
void DisplayBoard(char board[ROWS][COLS], int row, int col);
//布置雷 - 传过来的是11*11 打印的是9*9
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 GetMineCount(char mine[ROWS][COLS], int x, int y);
4.game.c 游戏所有函数实现代码
#define _CRT_SECURE_NO_WARNINGS 1
//实现程序所需的函数
#include"game.h"
//初始化棋盘 - 11*11
void InitBoard(char board[ROWS][COLS], int rows, int cols, char set)
{
int i = 0;
int j = 0;
for (i = 0; i < rows; i++)
{
for (j = 0; j < cols; j++)
{
board[i][j] = set;
}
}
}
//打印棋盘 - 传过来的11*11 打印的是 9*9
void DisplayBoard(char board[ROWS][COLS], int row, int col)
{
int i = 0;
int j = 0;
printf(" < --- 扫雷 --- >\n");
//每一列上面打印对应的数字
for (j = 0; j <= col; j++)
{
printf("%d ", j);
}
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 = num_mine;//10个雷
while (count)
{
//随机生成雷坐标 - rand() 0~32767
int x = rand() % row + 1;
int y = rand() % col + 1;
//判断棋盘是否布置过雷
if (mine[x][y] == '0')
{
mine[x][y] = '1';
count--;
}
}
}
//统计该坐标周围雷的情况
int GetMineCount(char mine[ROWS][COLS], int x, int y)
{
//周围所有坐标字符(8个字符)的和 减去8*'0' = 雷的数量
//参考:
// '0' + 0 = '0'
// '0' + 1 = '1'
//得到
// '1' - '0'= 1
//8*'1' - 8*'0'如果等于 0,则表示没有雷;等于1~7则表示有雷;返回对应的数字即可;
return (mine[x - 1][y - 1] + mine[x - 1][y] + mine[x - 1][y + 1]
+ mine[x][y - 1] + mine[x][y + 1]
+ mine[x + 1][y - 1] + mine[x + 1][y] + mine[x + 1][y + 1])
- 8 * '0';
}
//将坐标周围没有雷时,置该坐标及周围8个坐标为 空格 ,不显示
void SetNone(char show[ROWS][COLS], int x, int y)
{
show[x][y] = ' ';
show[x - 1][y - 1] = ' ';
show[x - 1][y] = ' ';
show[x - 1][y + 1] = ' ';
show[x][y - 1] = ' ';
show[x][y + 1] = ' ';
show[x + 1][y - 1] = ' ';
show[x + 1][y] = ' ';
show[x + 1][y + 1] = ' ';
}
//排查雷
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
//输入排查雷的坐标
int x = 0;
int y = 0;
//排雷次数
int win = 0;
while (win<row*col-num_mine)
{
printf("请输入要排查雷的坐标(行 列):>");
scanf("%d %d", &x, &y);
if (x >= 1 && x <= row && y >= 1 && y <= col && show[x][y] == '*')
{
if (mine[x][y] == '1')
{
printf("\n******>>很遗憾,踩雷了>>******\n");
printf("******>>请看雷的情况:\n\n");
DisplayBoard(mine, ROW, COL);
break;
}
else
{
//排查雷
//如果该坐标不是雷,统计该坐标周围雷的情况
int count=GetMineCount(mine, x, y);
show[x][y] = count+'0';//count为整型 例如2,加上字符'0',变成count整型对应数字字符 例如'2'
DisplayBoard(show, ROW, COL);//然后打印棋盘
win++;
}
}
else
{
printf("******>>非法排查!!请重新排查!!>>******\n");
}
}
if (win == row * col - num_mine)
{
printf("\n******>>恭喜!!排雷大师!!成功排除所有雷!!******\n");
printf("******>>请看雷的情况:\n\n");
DisplayBoard(mine, ROW, COL);//然后打印棋盘
}
}
//代码需要完善:展开函数,标记函数,时间函数(计时)
//展开函数:展开满足这些条件的坐标
/*
必须满足条件:
1.该坐标不是雷
2.该坐标周围没有雷
3.该坐标没有被排查过
*/
最后可以体验一下
同时这只是个简单的扫雷游戏实现,其中也有点缺陷,如果各位大佬有更好的方法可以分享给我哈~~