目录:一.“扫雷”基本格式 二.编写其中的game()函数 三.错误点解答
目录
(本片代码是按照正常游戏代码形式编写,即一个解决方案内含有一个头文件,一个主源文件,还有一个用来编写函数的源文件)
因为有.h文件,所以所用的函数的声明全放在.h中,剩下的只需要在主.c文件里面开头写上.h文件就行。
一.基本格式(即打印菜单和基本结构)
1.在主.c文件里面写:
#include"game.h"//很重要 引用
int main()
{
int a = 0,c;
int d[10] = { "0" };
a = start();//这是打印菜单
c:
scanf("%d", &a);//该语句和打印菜单的内容相关
switch (a)//选择是否玩该游戏
{
case 1://情况1选择玩
while (a)
{
q:
game();//一场游戏
printf(" Do again?(yes/no)\n");//一场游戏结束后返回这个
scanf("%s", d);
if (strcmp(d, "yes") == 0)//输入选择是否玩利用strcmp函数
goto q;
else
break;
}break;
case 0://2选择不玩
break;
default://但是如果输入错误非0或者1的数字则执行该语句
printf("Error! retype\n");
goto c; //goto语句可以返回上边重新选择
break;
}
printf("Game over!\n");
return 0;
}
2.在另一个.c文件写:
#include"game.h"
int start()
{
int a = 0, b = 0, c;
int d[10] = { 0 };
//打印菜单
printf("Welcome to Mine Sweeping\n");
printf("*******************\n");
printf("****** 1.play ****\n");
printf("****** 0.no ****\n");
printf("*******************\n");
c:
printf("input:>(1/0)\n");
return a;
}
3.在.h文件里面写:
第八行的内容。(头文件的所有内容都放到以下展示)
二.编写game()函数
思路:先打印两个棋盘,unlook棋盘放“💣”和提示,look棋盘放空白‘*’;所以需要两个二维数组,
并且在使用时由键盘输入坐标。 [ 为了检测每一步是否正确可以先写里面的test()函数用于打印棋盘,进而判断操作是否正确。(以下操作每一步结果样式用test()函数打印) ]
.h文件
#include<stdio.h>
#include<time.h>
#define h 9
#define l 9
#define hs 11
#define ls 11
int start();
void put(char arr[hs][ls]);
void test(char arr[hs][ls]);
void secret(char arr[hs][ls]);
void mine(char arr[hs][ls]);
void key(char arr1[hs][ls], char arr2[hs][ls]);
主.c文件:
void game()//执行游戏内容
{
secret(look);//棋盘内放数据
mine(unlook);//棋盘内放数据
put(unlook);//unloo棋盘内放入十个(╯‵□′)╯炸弹!•••*~●
test(look);//打印look棋盘让参与者看
key(look,unlook);//进行操作,扫雷开始
}
int main()
{srand((unsigned int)time(NULL));//生成随机数
int a = 0,c;
int d[10] = { "0" };
a = start();//这是打印菜单
c:
scanf("%d", &a);//该语句和打印菜单的内容相关
switch (a)//选择是否玩该游戏
{
case 1://情况1选择玩
while (a)
{
q:
game();//一场游戏
printf(" Do again?(yes/no)\n");//一场游戏结束后返回这个
scanf("%s", d);
if (strcmp(d, "yes") == 0)//输入选择是否玩利用strcmp函数
goto q;
else
break;
}break;
case 0://2选择不玩
break;
default://但是如果输入错误非0或者1的数字则执行该语句
printf("Error! retype\n");
goto c; //goto语句可以返回上边重新选择
break;
}
剩下的代码在另一个.c文件编写。
1.先打印两个棋盘 并存放数据:
方便于一会写提示(周围雷个数)不必考虑最边上的雷,所以棋盘写成11*11大小的。
(1):look棋盘输入数据:
void secret(char arr[hs][ls])
{
int a = 0, b = 0;
for (a = 1; a <10; a++)
{
for (b = 1; b < 10; b++)
{
arr[a][b] = '*';
}
}
}
(2):unlook棋盘输入数据:
void mine(char arr[hs][ls])
{
int a = 0, b = 0;
for (a = 1; a < 10; a++)
{
for (b = 1; b < 10; b++)
{
arr[a][b] = '0';
}
}
}
2.unlook中放雷
void put(char arr[hs][ls])
{
int x, y,m=10;
for(m=10;m>0;)
{
x = rand() %9 + 1;//使用rand()需要前期在主.c文件最前面写srand((unsigned //int)time(NULL));
y = rand() %9 + 1;//rand()会产生任意大的数,为了保证其在1到9的格子内产生所以写成
// rand() %9 + 1
if (arr[x][y] != 'x')//判断其位置是否由炸弹有炸弹的话就重新选择位置
{
arr[x][y] = 'x';
round(arr,x,y);//提示周围炸弹数量
m--;
}
}
}
3.提示
void round(char arr[hs][ls],int x, int y)//提示炸弹数量,下面操作让💣周围每个位置都加1来提示
{
int a, b, c, d;
arr[x][y - 1] = arr[x][y - 1] + 1;
arr[x][y+1] = arr[x][y+1] + 1;
arr[x - 1][y] = arr[x - 1][y] + 1;
arr[x - 1][y - 1] = arr[x - 1][y - 1] + 1;
arr[x - 1][y+1] = arr[x - 1][y + 1] + 1;
arr[x + 1][y] = arr[x + 1][y] + 1;
arr[x + 1][y-1] = arr[x + 1][y-1] + 1;
arr[x + 1][y+1] = arr[x + 1][y+1] + 1;
for (a = 0; a < 10; a++)
{
for (b = 0; b < 10; b++)
{
if (arr[a][b] == 'y')//因为x+1会变成y,所以吧每个y在变回x。
{
arr[a][b] = 'x';
}
}
}
}
4.test()打印棋盘
void test(char arr[hs][ls])
{
int a = 0, b = 0, c = 0;
for (c = 0; c < 10; c++)//打印在棋盘最上面一行的数字,便于找位置
{
printf("%d ", c);
}printf("\n");
for (a = 1; a < 10; a++)
{
printf("%d ", a);//打印在棋盘最左边一行的数字,便于找位置
for (b = 1; b < 10; b++)
{
printf("%c ", arr[a][b]);
}printf("\n");//打印棋盘
}
}
5.操作进行扫雷(一直以look数组作为“牌面”即可见化)
void key(char arr1[hs][ls], char arr2[hs][ls])
{
int a = 71,x,y,z,s;
while (a)
{z:
s:
printf("Please input coordinates:>");
scanf("%d %d", &x, &y);
if ((x > 9 || x < 1)||(y>9||y<1))//若输入坐标超出9*9的棋盘就提示错误然后goto语句重来
{
printf("error,input other");
goto z;
}
else
;
if (arr1[y][x] != '*')//若输入坐标已经选择过就提示错误然后goto语句重来
{
printf("Coordinates are already in use, please re-enter");
goto s;
}
else
;
arr1[y][x] = arr2[y][x];//把含有雷的棋盘中选择的位置放到不含有雷的棋盘中。
if (arr2[y][x] != 'x')//若该位置没有雷就继续下去
test(arr1);
else//若该位置为雷,则游戏失败
{
test(arr1);
printf("Sorry! Step on a mine\n");
break;
}
}
}
三.错误点解答
错误点1.![](https://img-blog.csdnimg.cn/43053705c06145a8947047743bed2d74.png)
出现这情况就是代表编写的自定义函数要么没在.h中声明,要么就是该自定义函数不存在了。
错误点2.
在传数组的时候要全部传过去,不能传一半 这是错误的, 会导致以下情况:
但是可以全数组传过去,只使用其中的一些位置。
错误点3.
注意输入的坐标是怎样的,先x后y还是相反。
错误点4.
注意由于本代码输入都是使用scanf并且输入的要是数字倘若输入字符会出现不可逆错误。
错误点5.
字符中数字可以直接写+-1达到数字加减效果。
字符中字母+-1则是变成下一个字母。
以上为本人犯的错误,以及解释,如若大家还有其他问题可以留言,我看见会为大家一一解答!
结尾惊喜:源代码