今天学习了鹏哥讲的扫雷,特此记录一下自己的实现过程。首先就是画图,理清自己的思路:
这里的扫雷呢?没有图形化的界面啊?只有内部的逻辑。
先看看执行的效果吧!
输入要扫雷的坐标后,如果是雷就game over了,被炸死了,如果不是雷,就要检测这个坐标周围一圈的坐标内有几个雷,然后显示在当前的坐标内,提示一下玩家周围有几个雷。
废话不多说,直接看看文件关系及代码吧!
当前是test.c文件也是程序入口所在的文件。
接下来是game.h头文件,里面写的是关于游戏实现的可暴露在外的部分函数声明
最后是游戏实现的全部函数:
// 下面是game.c 文件的全部代码
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
//初始化函数
void InitArr(char arr[ROWS][COLS], int row, int col, char set)
{
int i = 0, j = 0;
for (i = 1; i <= row; i++)
{
for (j = 1; j <= col; j++)
{
arr[i][j] = set;
}
}
}
// 3、 打印数组
void display(char arr[ROWS][COLS], int row, int col)
{
printf("******************* 扫雷游戏 *************************\n");
int i = 0, j = 0;
for (j = 0; j <= col; j++)
{
printf(" %d ", j);
}
printf("\n");
printf("\n");
for (i = 1; i <= row; i++)
{
printf(" %d ", i);
for (j = 1; j <= col; j++)
{
printf(" %c ", arr[i][j]);
}
printf("\n");
printf("\n");
}
printf("******************* 扫雷游戏 *************************\n");
}
// 4、生成地雷
void ShengChengLei(char arr_lei[ROWS][COLS], int row, int col)
{
int i = 0;
for (i = 0; i < LEI; i++)
{
while (1)
{
int x = rand() % row; // 生成随机函数
int y = rand() % col; // 生成随机列数
if (arr_lei[x][y] == '0')
{
arr_lei[x][y] = '1';
break;
}
}
}
}
//检测输入坐标周围的8个坐标下雷的个数
int JianCe(char arr_lei[ROWS][COLS], int x, int y)
{
// 打印一下 ‘0’+‘0’+‘0’+‘0’+‘0’+‘0’‘0’+‘1’ 的值就明白了,想要得到1,就得减去8个48
return arr_lei[x - 1][y - 1] + arr_lei[x][y - 1] + arr_lei[x + 1][y - 1] +
arr_lei[x - 1][y] + arr_lei[x + 1][y] +
arr_lei[x - 1][y + 1] + arr_lei[x][y + 1] + arr_lei[x + 1][y + 1] - 48 * 8;
}
// 5、扫雷
void ClearLEI(char arr[ROWS][COLS], char arr_lei[ROWS][COLS], int row, int col)
{
int x = 0, y = 0;
int count = 0;
while (1)
{
printf("请输入你要扫雷的坐标:");
scanf("%d %d", &x, &y);
if (x >= 1 && x <= row && y >= 1 && y <= col)
{
//如果输入的行列数合法
//检测该坐标下是不是雷
if (arr_lei[x][y] == '1')
{
printf("你挖到了地雷,被炸死了!\n");
break;
}
if (arr_lei[x][y] == '0')
{
// 如果这个坐标下不是0,就要设置成周围雷的个数
int num = JianCe(arr_lei, x, y); // 此处返回的是数字(周围雷的个数)
arr[x][y] = num + 48; // 比如雷的个数是2,如果直接放2,打印数组时什么都打不出来,2要加上48=50正好是ASCII码的2的值
count++;
// 打印数组
display(arr_lei, ROW, COL);
display(arr, ROW, COL);
}
if (count == row * col - LEI)
{
printf("扫雷完毕!恭喜你清除了所有的雷!\n");
break;
}
}
else
{
//如果输入的数不合法就重新输入
printf("输入的有错误,请重新输入!\n");
}
}
}
//****************************************************************************************
// 下面是game.h 头文件的全部代码
#pragma once
#include"stdio.h"
#include"time.h"
#include"stdlib.h"
// 声明常量
#define ROW 9
#define COL 9
#define LEI 10 // 雷的数量
#define ROWS 9+2
#define COLS 9+2
//***************声明函数**************
//初始化函数
void InitArr(char arr[ROWS][COLS], int row, int col, char set);
// 3、 打印数组
void display(char arr[ROWS][COLS], int row, int col);
// 4、生成地雷
void ShengChengLei(char arr_lei[ROWS][COLS], int row, int col);
// 5、扫雷
void ClearLEI(char arr[ROWS][COLS], char arr_lei[ROWS][COLS], int row, int col);
//***********************************************************************************
//下面是test.c的全部代码
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
// 开始菜单
void menu()
{
printf("************************************\n");
printf("********** 1、开始游戏 **********\n");
printf("*********** 0、结束游戏 **********\n");
printf("************************************\n");
}
//游戏主函数
void game()
{
// 1、创建数组
char arr[ROWS][COLS] = { 0 };
char arr_lei[ROWS][COLS] = { 0 };
// 2、 初始化数组
InitArr(arr, ROW, COL, '*');
InitArr(arr_lei, ROW, COL, '0');
// 3、 打印数组
display(arr, ROW, COL);
//display(arr_lei, ROW, COL);
// 4、生成地雷
ShengChengLei(arr_lei, ROW, COL);
// 5、扫雷
ClearLEI(arr, arr_lei, ROW, COL);
}
int main()
{
int input = 0;
srand((unsigned int)time(NULL));
do
{
menu();
printf("请输入你的选择:");
scanf("%d", &input);
switch (input)
{
case 0:
printf("游戏结束!\n");
break;
case 1:
printf("游戏开始!\n");
game();
break;
default:
printf("输入错我,请重新输入!\n");
break;
}
} while (input);
return 0;
}