扫雷的实现(C语言)

  基于上次三子棋的制作,看到目前所学还能编一下扫雷,经过将近两天的努力终于手搓出来了。

这次是完全自己手搓,但框架三子棋那个依旧适用,内容依旧比较粗糙,感觉很多地方,还能优化但是目前没想到。好了,代码如下:

 首先是框架也就是在test.c原文件的主函数

#include "ADD.h"
void menu()
{
	printf("**************************\n");
	printf("****  1.play  0.exit  ****\n");
	printf("**************************\n");

}
void game()
{
	char arr[HANG][LIE] = { 0 };
	char arr1[HANG][LIE] = { 0 };
	chushihua(arr1, HANG, LIE);//填充,这是表面的arr1,防止开始玩就知道雷在哪里。
	chushihua(arr, HANG, LIE);//填充,这是幕后的arr(雷就被埋到这里面)
	chushihua3(arr, HANG, LIE);//布雷,这里的雷埋在arr里面
	chushihua2(arr1, HANG, LIE);//棋盘
	neirong1(arr,arr1, HANG, LIE);
}
int main()//扫雷
{
	int input = 0;
	do//用do..while循环实现游戏
	{
		menu();//打印游戏开始界面
		printf("请选择:");
		scanf("%d", &input);
		switch (input)//这里实现选择
		{
		case 1:
			game();
			break;
		case 0:
			break;
		default:
			printf("输入错误,请重新输入!!");
		}


	} while (input);//这里对应了上面的选择“1”为真“0”为假自动跳出循环
	return 0;
}

然后是需要放在“ADD.h”里的头文件,宏定义以及函数申明。

#define HANG 10
#define LIE 10
#include <stdio.h>
#include <string.h>
#include <Windows.h>
#include <stdlib.h>
#include <time.h>
void chushihua(char arr[HANG][LIE],int hang,int lie);
void chushihua2(char arr[HANG][LIE],int hang,int lie);
void neirong1(char arr[HANG][LIE],char arr1[HANG][LIE], int hang, int lie);
void chushihua3(char arr[HANG][LIE], int hang, int lie);
void chushihua4(char arr1[HANG][LIE], int hang, int lie);

接下来是实现我们需要调用的函数,这个在“ADD.h”的原文件里。

#include "ADD.h"
void chushihua(char arr[HANG][LIE],int hang,int lie)
{
	int i = 0;
	for (i = 0; i < hang; i++)
	{
		int j = 0;
		for (j = 0; j < lie; j++)
		{
			arr[i][j] = ' ';
		}
	}
}

void chushihua2(char arr1[HANG][LIE],int hang,int lie)
{
	int i = 0;
	for (i = 0; i < hang;i++)
	{
		int j = 0;
		for (j = 0; j < lie; j++)
		{
			if (j == lie - 1)
			{
				printf(" %c ", arr1[i][j]);
				break;
			}
			printf(" %c |", arr1[i][j]);
				
		}
		printf("\n");
		for (j = 0; j < lie ; j++)
		{
			if (i == hang - 1)
			{
				break;
			}
			if (j == lie - 1)
			{
				printf("---");
				break;
			}
			printf("---|");
		}
		printf("\n");
	}
}


void neirong1(char arr[HANG][LIE],char arr1[HANG][LIE] ,int hang, int lie)
{
	
	while (1)
	{
		int i = 0;
		int j = 0;
		int count = 0;
		scanf("%d%d", &i, &j);
		if (arr[i][j] == '*')
		{
			printf("踩到地雷了,游戏失败!!\n");
			return 0;
		}
		int a, b;
		switch (i)//这里的switch实现扫雷的规则
		{
		case 0:
			switch (j)
			{
			case 0:
				if (arr[i+1][j+1] == '*')
					count++;
				if (arr[i + 1][j] == '*')
					count++;
				if (arr[i][j + 1] == '*')
					count++;
				break;
			case 9:
				if(arr[i+1][j]=='*')
					count++;
				if(arr[i][j-1]=='*')
					count++;
				if(arr[i+1][j-1]=='*')
					count++;
				break;
			case 1:
			case 2:
			case 3:
			case 4:
			case 5:
			case 6:
			case 7:
			case 8:
				if(arr[i][j-1]=='*')
					count++;
				if(arr[i][j+1]=='*')
					count++;
				if (arr[i+1][j - 1] == '*')
					count++;
				if (arr[i + 1][j] == '*')
					count++;
				if (arr[i + 1][j + 1] == '*')
					count++;
				break;
			}
			break;
		case 9:
			switch (j)
			{
			case 0:
				if (arr[i - 1][j + 1] == '*')
					count++;
				if (arr[i - 1][j] == '*')
					count++;
				if (arr[i][j + 1] == '*')
					count++;
				break;
			case 9:
				if (arr[i - 1][j] == '*')
					count++;
				if (arr[i-1][j - 1] == '*')
					count++;
				if (arr[i ][j - 1] == '*')
					count++;
				break;
			case 1:
			case 2:
			case 3:
			case 4:
			case 5:
			case 6:
			case 7:
			case 8:
				if (arr[i][j - 1] == '*')
					count++;
				if (arr[i][j + 1] == '*')
					count++;
				if (arr[i - 1][j - 1] == '*')
					count++;
				if (arr[i - 1][j] == '*')
					count++;
				if (arr[i - 1][j + 1] == '*')
					count++;
				break;
			}
				break;
		case 1:
		case 2:
		case 3:
		case 4:
		case 5:
		case 6:
		case 7:
		case 8:
			switch (j)
			{
			case 0:
				if (arr[i - 1][j] == '*')
					count++;
				if(arr[i-1][j+1]=='*')
					count++;
				if(arr[i][j+1]=='*')
						count++;
				if(arr[i+1][j+1]=='*')
					count++;
				if(arr[i+1][j]=='*')
					count++;
				break;
			case 9:
				if(arr[i-1][j]=='*')
					count++;
				if(arr[i-1][j-1]=='*')
					count++;
				if(arr[i][j-1]=='*')
					count++;
				if(arr[i+1][j-1]=='*')
					count++;
				if(arr[i+1][j]=='*')
					count++;
				break;
			case 1:
			case 2:
			case 3:
			case 4:
			case 5:
			case 6:
			case 7:
			case 8:
				for (a = i - 1, b = j - 1; b <= j + 1; b++)
				{
					if (arr[a][b] == '*')
						count++;
				}
				if (arr[i][j - 1] == '*')
					count++;
				if (arr[i][j + 1] == '*')
					count++;
				for (a = i + 1, b = j - 1; b <= j + 1; b++)
				{
					if (arr[a][b] == '*')
						count++;
				}
				break;
			}
		}
		arr1[i][j] = count += 48;
		int count1 = 0;
		for (i = 0; i < 10; i++)
		{
			for (j = 0; j < 10; j++)
			{
				if (arr[i][j] >= '0' && arr[i][j] <= '9')
					count1++;
			}
		}
		if (count1 == 85)
		{
			printf("恭喜你,扫除完所有的雷,游戏胜利!!\n");
			return 0;
		}
		system("cls");
		chushihua2(arr1, hang, lie);
	}
}

void chushihua3(char arr[HANG][LIE], int hang, int lie)
{
	int count=0;
	int i, j;
	srand((unsigned)time(NULL));
	while (1)
	{
		i = rand() % 10;
		j = rand() % 10;//制造随机数,实现随机埋雷。
		if (arr[i][j] == ' ')
		{
			arr[i][j] = '*';
			count++;
		}
		if (count == 16)
			break;
	}
	system("cls");//清屏看起来更美观。
}

  内容应该是不难懂,目前自己玩的时候没遇到bug(主要是脑子不太够用,坚持不到胜利)还有这里设计的是一个10*10的布局里面有15颗雷,完全随机分布,如果有人发现了bug或者有不足之处望指点呦。

  还有本人随手拍的照片(嘿嘿)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值