一.前文
此文章用于介绍用c语言完简易扫雷游戏,无指针内容,从零开始一步步直到游戏编写完成。
二.游戏实现的基本框架
1.构建菜单 用户选择play or exit
2.进入游戏后 对棋盘进行初始化,形成9*9的棋盘
3.用户进行随机坐标选择,如果不是雷,排查出周围雷的个数,显示在棋盘上
4.用户找出全部雷或被雷炸到后,游戏结束,再次回到菜单
三.游戏菜单和基本原理的实现
1.游戏菜单的实现
进行初步菜单的打印,用户可自由选择play或者exit。
2.游戏基本原理的实现
将option即用户的选择初始化为1,保证while循环至少执行一次,用户可以根据菜单进行选择
scanf函数收集用户输入的值 将其分为3种情况
1.输入 1 一play,执行游戏程序
2.输入0一exit,打印退出游戏,此时option=0,循环不会再次执行,程序结束
3.用户输入的既不是1也不是0,打印输入错误,option=1,循环再次执行,用户再次选择
四.游戏程序的基本框架及游戏程序中单个函数功能的实现、
41.基本框架
1.首先咱们进行棋盘的创建,将雷的位置设置为1,非雷的位置设置为0,但是考虑到对雷排查时,如果周围是1个雷,那么在棋盘上显示的值就是1,1的值与雷1的值容易造成混淆,所以我们创建两个棋盘,show棋盘用户给用户进行展示,全部用‘” * “覆盖,hide棋盘用于底层逻辑的判断,0不是雷,1是雷。
2.chumine函数,在棋盘中随机生成10个雷,完成对雷的设置
3.print函数的作用是对棋盘的打印,给用户展示全是 * 的棋盘
4.while循环排查坐标,直至游戏失败或者成功
5.countmine函数在hide棋盘中对坐标进行检查,是雷则结束游戏,不是则将周围雷的数量显示
6.成功或者失败后 ,flag=0,while循环不再继续,再次回到菜单,用户可以选择再来一局或者退出(在主函数中实现)
4.2棋盘的创建
1.给用户展示中,显示的是9*9的棋盘,但考虑到后续对雷的排查,排查程序中自动排查周围的8个雷,但是如果排查的位置是最边上的一排/列,就需要编写更加复杂的程序进行更准确的排查,所以,我们将棋盘扩大一周,避免上述的问题发生(仍然给用户展示9*9的棋盘,也就是整个棋盘的一部分被隐藏)如图所示,蓝色部分用户可看到的,蓝色和绿色部分是整个棋盘。
上述代码成功创建两个11行11列的数组,但没有准确赋值
4.3棋盘的初始赋值
(c和k分别是显示棋盘的行和列,n为对数组所赋的值)
利于init函数对hide棋盘全赋值为0,对show棋盘全赋值为 * 。
4.4雷的布置
1.c语言中提供了一个函数叫 srand ,用来初始化随机数的生成器的
通过 srand 函数的参数 seed 来设置 rand 函数生成随机数时的种子
2.首先利用时间戳对rand种子进行赋值,保证每次生成的坐标都是随机值(不赋值rand产生的随机值,会在后续重复生成)
3.生成雷的坐标后,如果此位置不是雷,就布置雷,如果此位置是雷,i减小1,保证雷能够布置10个。
4.5棋盘的打印函数
布置好雷后,打印show棋盘,给用户展示出9*9的棋盘供选择排查的坐标
效果图
4.6进入while循环,对棋盘上位置进行雷的排查以及对游戏结束的判定
进入循环后,用户可自由选择排查的坐标,当将全部非雷位置排查完(n==71,n为排查次数,一共有71个不是雷的坐标)或排查到雷后,flag=0,循环不再进行,游戏结束
排查雷的原理是:将周围8个位置的字符相加,再减去七个字符’0‘,这样显示的字符对应的刚好是周围雷的个数(0在char储存的是其对应的ASCLL码值,如下图,0对应的值为48,1是49,依次类推)
排查后,n(排查次数)+1,当排查次数n=71时,游戏成功,游戏程序结束
当排查到雷时,会打印“此处是雷,游戏结束”并且将雷的坐标赋值为x打印出show棋盘,,flag会被赋值为0,游戏程序结束
五.游戏程序演示及完整代码
需要c语言相关资料v(L240325y)
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<time.h>
//扫雷游戏
//1.构建菜单 用户选择play or exit
//2.进入游戏后 对棋盘进行初始化,形成9*9的棋盘
//3.进行底层逻辑设置,将雷设置为1,非雷设置为0;显示给用户的棋盘用*覆盖
//4.用户进行随机坐标选择,如果不是雷,排查出周围雷的个数,显示在棋盘上
//5.用户找出全部雷或被雷炸到后,游戏结束,再次回到菜单
void menu()
{
printf("**************1.play**********\n");
printf("**************0.exit**********\n");
printf("请选择-\n");
}
void init(char arr[][11], int c, int k, char n);
void print(char arr[11][11], int c, int k);
void countmine(char arr[11][11], char arr2[11][11], int x, int y);
void chumine(char arr[11][11], int c, int k);
void game()//游戏程序
{
int c = 9;//棋盘的长
int k = 9;//棋盘的宽
char show[11][11];//初始化展示给用户的棋盘
char hide[11][11];//初始化隐藏的棋盘
int flag = 1;//判断是否结束游戏
int n = 0; //判断是否结束游戏
init(show, c, k, '*');//对展示棋盘进行初始赋值
init(hide,c,k,'0');//对隐藏棋盘进行初始赋值
chumine(hide, c, k);//生成雷
print(show, c, k);//棋盘的打印
print(hide, c, k);//棋盘的打印
while (flag)//排查雷的循环程序
{
printf("请选择排查位置的坐标\n");
int x, y;
scanf("%d %d", &x, &y);//选择排查的坐标
countmine(hide,show, x, y);//对坐标进行检查,是雷则结束游戏,不是则将周围雷的数量显示
print(show, c, k);//打印排查后的几盘
n++;//排查次数的增加,更趋近于游戏结束
if (hide[x][y] == '1')//如果是雷
flag = 0;//游戏结束的标志
if (n == 2)//如果排查71次之后都没有被雷炸到
{
flag = 0;//游戏结束的标志
printf("游戏成功\n");//打印游戏成功
}
}
}
void init(char arr[11][11],int c,int k,char n)
{
for (int i = 0; i < c+2; i++)
{
for (int m = 0; m < k+2; m++)
{
arr[i][m] = n;
}
}
}
void print(char arr[11][11], int c, int k)//接收数组,行,列
{
printf(" 0123456789\n");//为了美观和方便选择,在上方打印出y坐标
for (int i = 1; i <=c; i++)
{
printf(" %d", i);//为了美观和方便选择,在侧方打印出x坐标
for (int m = 1; m <=k; m++)
{
printf("%c", arr[i][m]);//对数组打印
}
printf("\n");
}
}
void countmine(char arr[11][11],char arr2[11][11],int x, int y)
{
if (arr[x][y] == '1')//是雷,打印游戏结束
{
arr2[x][y] = 'x';
printf("此处是雷,游戏结束\n");
}
else//不是雷,显示周围雷的数量
arr2[x][y] = arr[x - 1][y - 1] + arr[x - 1][y] + arr[x - 1][y + 1] + arr[x][y - 1] + arr[x][y + 1] + arr[x + 1][y - 1] + arr[x + 1][y] + arr[x + 1][y + 1] - 7*'0';
}
void chumine(char arr[11][11], int c, int k)
{
for (int i = 0; i < 79; i++) //循环10ci,布置10个雷
{
int x = rand() % 9 + 1;//生成雷的坐标
int y = rand() % 9 + 1;
if (arr[x][y] != '1')//如果此位置不是雷,就布置雷
arr[x][y] = '1';
else i--;//如果此位置是雷,i减小1,保证雷能够布置10个
}
}
int main()
{
srand((unsigned int)time(NULL));//对rand种子进行随机编写
int option=1;//初始option为1,保证菜单至少出现一次,给用户选择的机会
while (option)
{
menu();//显示菜单
scanf("%d", &option);//用户的输入
if (option == 1)//选择1,进行游戏
{
game();//游戏程序函数
}
else if (option == 0)//选择0,退出
{
printf("退出游戏\n");
break;
}
else //选择错误
{
printf("选择错误,请重新选择\n");
}
}
return 0;
}