小白小游戏之“扫雷”(最后又惊喜)

目录:一.“扫雷”基本格式            二.编写其中的game()函数          三.错误点解答

目录

     一.基本格式(即打印菜单和基本结构)

  1.在主.c文件里面写:

2.在另一个.c文件写:

3.在.h文件里面写:

二.编写game()函数

   1.先打印两个棋盘 并存放数据:

(1):look棋盘输入数据:

(2):unlook棋盘输入数据:

2.unlook中放雷

3.提示 

4.test()打印棋盘

 5.操作进行扫雷(一直以look数组作为“牌面”即可见化)

三.错误点解答

错误点1.​

错误点2.

错误点3.

错误点4.

错误点5.


(本片代码是按照正常游戏代码形式编写,即一个解决方案内含有一个头文件,一个主源文件,还有一个用来编写函数的源文件)

因为有.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.​​​​​​​

 

出现这情况就是代表编写的自定义函数要么没在.h中声明,要么就是该自定义函数不存在了。

错误点2.

在传数组的时候要全部传过去,不能传一半      这是错误的, 会导致以下情况:

  但是可以全数组传过去,只使用其中的一些位置。

错误点3.

注意输入的坐标是怎样的,先x后y还是相反。

错误点4.

注意由于本代码输入都是使用scanf并且输入的要是数字倘若输入字符会出现不可逆错误。

错误点5.

字符中数字可以直接写+-1达到数字加减效果。

字符中字母+-1则是变成下一个字母。

 以上为本人犯的错误,以及解释,如若大家还有其他问题可以留言,我看见会为大家一一解答!

结尾惊喜:源代码

text12-24 · 墨染/学习一下 - 码云 - 开源中国 (gitee.com)

  • 26
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 20
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值