一.主要实现的功能要求
• 游戏可以通过菜单实现继续玩或者退出游戏
• 扫雷的棋盘是9*9的格⼦
• 默认随机布置10个雷
• 可以排查雷
◦ 如果位置不是雷,就显⽰周围有⼏个雷
◦ 如果位置是雷,就炸死游戏结束
◦ 把除10个雷之外的所有雷都找出来,排雷成功,游戏结束
简单的游戏界面
二 .解题思路及代码实现
1.将功能按照模块进行划分,最终以函数的形式进行实现。
2.要完成那些函数:菜单函数,游戏函数(棋盘初始化函数,棋盘展示函数,设置类函数,排查雷函数,雷的个数计数函数)
3.按照游戏逻辑在含有main函数的源文件中调用自定义的函数。
test.c源文件:主要的执行文件
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <time.h>
#include "game.h"//自己定义的函数头文件,在调用的时候,需要使用你双引号引起来。
//排雷游戏的书写,先进行主要逻辑的框架书写。
//1.菜单打印
//2.按照输入的值,选择是否要玩游戏
//3.可以进行重复游戏
void menu();
void game();
int main()
{
int input = 0;
srand((unsigned int)time(NULL));
do
{
menu();
printf("请选择:");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("欢迎下次光临!!!\n");
break;
default:
break;
}
} while (input);
return 0;
}
void menu(void)
{
printf("********扫雷游戏********\n");
printf("********1.play*******\n");
printf("********0.exit*******\n");
printf("***********************\n");
}
//游戏功能要完成哪些功能?
//1.初始化棋盘
// (1)需要两个棋盘,一个用来存储雷的位置,另一个用来初始化棋盘
// (2)棋盘是9行9列,但是在这里打印11行11列,这样在排查雷的时候完全不需要考虑边界问题
// 相当于在棋盘周围,全部放上数字字符0
//2.打印棋盘
// (1)相当于将初始化后的数组给答应出来
// (2)为了更好地进行扫雷,所以要进行行列标注
//
//3.布置雷
// (1)产生随机数
// (2)重复设置10个雷
// (3)递减
//
//4.排查雷
//(1)输入的坐标在棋盘的范围之内
//(2)是否是雷?是游戏结束,不是,则统计周围雷的个数,继续判断
//(3)最终所有的格子被点完,则退出循环
void game()
{
char mine[ROWS][COLS];//布置雷的信息
char show[ROWS][COLS];//存放排查出雷的个数
inital_board(mine, ROWS, COLS,'0');//初始化mine全为字符零
inital_board(show, ROWS, COLS,'*');//初始化show全为字符*
display_board(show,ROW,COL);//打印的时候只需要,打印九成九的就可以了
Set_Mine(mine, show, ROW, COL);//设置雷
display_board(mine, ROW, COL);//打印的时候只需要,打印九成九的就可以了
Find_Mine(mine, show, ROW, COL);//排查雷
//set_mine();
//find_mine();
}
game.h函数声明和数据类型定义文件
#include <stdio.h>
//文件中所需要的数据类型和函数声明
#define ROW 9
#define COL 9
#define ROWS ROW+2//在进行全局变量的时候一定不能加;
#define COLS COL+2
#define EASYCOUNT 10
void inital_board(char board[ROWS][COLS], int row, int col, char set);
void display_board(char board[ROWS][COLS], int row, int col);
void Set_Mine(char board[ROWS][COLS],int row,int col);
void Find_Mine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);
void Get_MineCount(char mine, int row, int col);
game.c自定义函数
#define _CRT_SECURE_NO_WARNINGS
#include "game.h"
#include <time.h>
#include <stdlib.h>
//函数的实现
void inital_board(char board[ROWS][COLS], int row, int col, char set)
{
int i=0;//对于新命名的变量一定要进行初始化
for (i; i < ROWS; i++)
{
int j=0;//为什么要对j进行重复初始为零?因为从每一行都要打印该列的元素
for (j; j <COLS; j++)
{
board[i][j] = set;
}
}
}
void display_board(char board[ROWS][COLS], int row, int col)
{
int i = 0;
printf("---------扫雷游戏--------\n");
for (i; i <=ROW; i++)
{
printf("%d ", i);
}
printf("\n");
for (i=1; i <=ROW; i++)
{
printf("%d ", i);
int j = 0;
for (j=1; j <=COL; j++)
{
printf("%c ", board[i][j]);
}
printf("\n");
}
}
void Set_Mine(char board[ROWS][COLS], int row, int col)
{
int count = EASYCOUNT;
while (count)
{
int i = 0;
int j = 0;
i = rand() % ROW + 1;
j = rand() % COL + 1;
if (board[i][j] == '0')
{
board[i][j] = '1';
count--;
}
}
}
static int GetMineCount(char mine[ROWS][COLS], int row, int col)//row,col为排查雷输入的坐标
{
int x = row-1;
int y = col-1;
int count = 0;
for (x=row-1; x<=row+1; x++)//
{
for (y=col-1; y<=col+1; y++)
{
//如果该坐标周围的前一行/后一行/前一列/后一列当中点的字符为1则加一
if ((x == row - 1 || x == row +1|| y == col-1 || y == col+1)&& mine[x][y] == '1')
{
count++;
}
}
}
return count;
}
void Find_Mine(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 - EASYCOUNT)
{
printf("请输入你要排查的坐标:\n");
scanf("%d %d", &x, &y);
if (x >= 1 && x <= ROW && y >= 1 && y <= COL)
{
if (mine[x][y] == '1')
{
printf("很抱歉,您被炸死了\n");
display_board(show, ROW, COL);
break;
}
else
{
int count = GetMineCount(mine, x, y);
show[x][y] = count+'1'-1;
display_board(show, ROW, COL);
win++;
}
}
else
printf("非法坐标,请重新输入。\n");
}
if (win == ROW * COL - EASYCOUNT)
{
printf("恭喜你,排雷成功\n");
}
}
三.总结
第一次完成,几百行的代码,作以下的几点总结。1.代码的书写,一定要规范,不要懒,不然你不不知道自己想要表达什么意思,尤其是一些函数当中的参数。2.在写代码的过程中一定要,一边写,一边调试,不然到后面,积累的错误越多,越梳理不出来逻辑。3.虽然逻辑上很简单,但是过程中还是遇见了很多问题,所以不能眼高手低。