本文仅为个人初学者经验,记录作用大于实际借鉴作用(应该也没人会看见我这种初学者的初级代码╮(╯▽╰)╭)
最开始构想了一个很简单的思维导图,同时也学习了相关的代码知识,由于是个先前有过案例的编程题,就没有在开始的时候构想太多的思路和想法。
同时,我个人认为编程更加偏向于要进行许多试错,所以开始只需要为自己找好框架和目标即可。
介于整个程序的功能,设置一个单独的头文件game.h。game.c进行自定义函数的编写,main.c进行总体的运行。
在最开始会给玩家一个选择,先输出一个菜单说明如何使用,再为一个整型变量的重新赋值,同时因为游戏应该可以循环进行,所以使用do-while循环结构。
简单输入1开始游戏,而输入0退出游戏,如果输入其他值则重新循环且要求输入1或者0,由此使用switch语句
头文件一类均放置于game.h中。
#include "game.h"
int main()
{
//玩家最初会做出的选择,游戏还是退出
int i=0;
//游戏为可循环的总函数类型 do-while
//设计菜单,menu自定义函数
do
{
menu();
scanf("%d",&i);
//当输入1的时候开始游戏,输入0的时候退出游戏,输入非零数据的时候重新输入 switch
switch (i)
{
case 1:
printf("开始游戏,请选择要排查的坐标\n");
//game()函数,需要进行游戏的所有功能
game();
break;
case 0:
printf("退出成功\n");
break;
default:
printf("输入数据有误,请重新输入\n");
}
}while(i);
return 0;
}
后期编程思路主要成线形,均已写在注释之中
头文件game.h
#ifndef game_h
#define game_h
#endif /* game_h */
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define HS 11//定义初始键盘的横坐标值
#define LS 11//定义初始键盘的纵坐标值
#define H HS-2//定义可见键盘或埋雷键盘的横坐标值
#define L LS-2//定义可见键盘或埋雷键盘的纵坐标值
#define X 10//定义雷的个数
void menu();
void game();
void C(char arr[HS][LS],int hs,int ls,char i);
void P(char arr[HS][LS],int hs,int ls);
void M(char arr[HS][LS],int hs,int ls);
void T(char arr[HS][LS],char arr2[HS][HS],int hs,int ls);
game.c
#include "game.h"
//打印菜单的函数
void menu()
{
printf("*********** 1.game ***********\n");
printf("*********** 0.exit ***********\n");
}
//初始化棋盘的函数
void C(char arr[HS][LS],int hs,int ls,char i)
{
for (hs=0; hs<=HS; hs++)
{
for (ls=0; ls<=LS; ls++)
{
arr[hs][ls] = (char)i;
}
}
}
//打印棋盘1的函数
//为增强可视性,将在二维数组的0列0行加上数字的注释
void P(char arr[HS][LS],int hs,int ls)
{
//打印第一行的列数注释
for (hs=0; hs<=H; hs++)
{
printf("%d ",hs);
}
//打印棋盘
printf("\n");
for (hs=1; hs<=H; hs++)
{
//打印第一列的行数注释
printf("%d ",hs);
for (ls=1; ls<=L; ls++)
{
printf("%c ",arr[hs][ls]);
}
printf("\n");
}
}
//对于初始值均为1的棋盘而埋下值为0的雷
void M(char arr[HS][LS],int hs,int ls)
{
int i1,i2;//定义雷的横纵坐标
int i=0;//定义雷的个数
srand((unsigned)time(NULL));
while(i<X)
{
i1 = rand()%9+1;//i1的值为1-9
i2 = rand()%10;//i2的值为0-9
while(arr[i1][i2]!='0'&&i2>=1)
{
arr[i1][i2]='0';
i++;//每有一个雷成功埋下,计数一次
}
}
}
//排查坐标3*3范围内有多少个雷
void T(char arr1[HS][LS],char arr2[HS][HS],int hs,int ls)
{
//定义排查的横纵坐标
int i1,i2;
//定义雷的个数
char i = '0';
//开始排查
for (i1=hs-1; i1<=hs+1; i1++)
{
for (i2=ls-1; i2<=ls+1; i2++)
{
if(arr2[i1][i2]=='0')
{
i++;
}
}
}
arr1[hs][ls] = i;
P(arr1, HS, LS);
}
void game()
{
//扫雷有两个棋盘,一个玩家可见的,且雷不可见的棋盘1;一个不可见的,且雷可见的棋盘2
//棋盘1的表现为*,且被选中之后会展示周围3*3方阵的雷点数量
//棋盘2的表现为1、0。0为雷而1为非雷
char arr1[HS][LS];
char arr2[HS][LS];
//玩家会输入的两个整形坐标值
int a = 0;
int b = 0;
//玩家已经排除的雷的个数
int i = 0;
//棋盘的实际横纵单位数(用int类型初始化)
int h = H;
int l = L;
//将棋盘初始化
C(arr1, HS, LS, '*');
C(arr2, HS, LS, '1');
//对棋盘2进行埋雷
M(arr2, H, L);
//玩家仅需可见棋盘1
P(arr1, HS, LS);
do
{
printf("请输入需要排查的横纵坐标值\n");
scanf("%d%d",&a,&b);
if(a<=9&&b<=9&&a>0&&b>0)
{
if(arr2[a][b]=='1')
{
//告诉玩家该坐标附近3*3范围内还有多少雷
T(arr1,arr2,a,b);
i++;
}
else
{
//先展示原先游戏中的雷的个数,再说明游戏失败
P(arr2, HS, LS);
printf("游戏失败,踩到雷了\n");
break;
}
}
else
{
printf("输入数据有误,请重新输入\n");
}
}while(i<(h*l-X));
if(i==(h*l-X))
{
printf("恭喜你,排除了所有的雷\n");
}
else
{
printf("需要重新开始吗?\n");
}
}
在这里尤其感谢B站up主 哔哩大学计算机学院,以及他的视频对于我学习C语言的帮助