分文件—— 扫雷游戏

扫雷的代码要写多个函数,所以这里用分文件的形式来呈现:

如图所示,我建立了三个 文件,分别是.h文件,函数.c文件,以及主文件。

以及在game.c与main.c文件中都引用自定义头文件game.h。

 

随后在game.h声明好每个要使用的量,以及函数

 

#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include<stdlib.h>
#include<time.h>
#define TNT 10
#define Y 9
#define X 9
#define Lx X+2
#define Ly Y+2
void menu();
void init_table(int x, int y, char what, char a[Ly][Lx]);
void mine(int num, char table[Ly][Lx]);
char find(int x, int y, char in_table[Ly][Lx]);
void show(char table[Ly][Lx]);
void game(char show_table[Ly][Lx], char in_table[Ly][Lx]);

这里的define中,TNT代表地雷的量,Y为行,X为列。init_table为初始化地雷桌面函数,mine为埋雷函数,find为查找八方的地雷数,show为展示地雷桌面,game为开始游戏函数

menu为菜单函数

让我们来看看主函数main.c文件部分:

#include "game.h"

int main()
{
	begin:
	srand((unsigned int)time(NULL));
	int input;
	menu();
	char show_table[Ly][Lx];
	char in_table[Ly][Lx];
	scanf("%d", &input);
	
		if (input == 1) {
		init_table(Lx, Ly, '0', in_table);
		init_table(Lx, Ly, '*', show_table);
		show(show_table);
		mine(TNT, in_table);
		game(show_table,in_table);
		//show(in_table);
		//show(show_table);
		printf("还要玩吗?\n");
		goto begin;
	}
	else {
		printf("成功退出游戏");
	}
}

因为我们要玩的是9X9的地雷桌面,则我们要定义11X11的地雷桌面,以保证我们在访问桌面边缘四周的地雷是不会数组越界。

所以定义char show_table[Ly][Lx];
               char in_table[Ly][Lx];

注意是字符类型的数组。

用srand((unsigned int)time(NULL))来保证生成的是真随机数,具体在mine函数运用

 一下展示各个函数内容(game.c):

1.menu函数:

void menu()
{	
	printf("********************************************************\n");
	printf("********************************************************\n");
	printf("*********************1进入游戏**************************\n");
	printf("*********************0退出游戏**************************\n");
	printf("********************************************************\n");
	printf("********************************************************\n");

}

没啥好说的。

运行结果:

init_table函数:

void init_table(int x, int y, char what,char a[Ly][Lx])
{
	
	
	for ( int i = 0; i < y; i++)
	{
		for (int j = 0; j < x; j++)
		{	
			a[i][j] = what;
		}
	}
}

用输入的what字符遍历二维数组。

show函数:

void show(char table[Ly][Lx])
{
	int i, j;
	for (i = 0; i <= X; i++) {
		printf("%d ", i);
	}
	printf("\n");
	for (i = 1; i <= Y; i++)
	{
		printf("%d ", i);
		for (j = 1; j <= X; j++) {
			printf("%c ", table[i][j]);
		}
		printf("\n");
	}
}

展示此时的炸弹桌面或游戏桌面;

具体效果为:

注意展示展示的是9X9的桌面,以及要展示坐标轴

 find函数:

char find(int x, int y,  char in_table[Ly][Lx])
{	
	int i = y;
	int j = x;
	
	char sum = '0';
	for (i - y - 1; i <= y + 1; i++) {
		for (j = x - 1; j <= x + 1; j++) {
			sum += in_table[i][j] - '0';
		}
	}
	return sum;
}

这里要注意一点,因为:

’1‘-’0‘=1

’2‘-’1‘=1

相反 1+’0‘=’1‘

        ‘1’+1 = ‘0’

我们让八面的字符全部相加,每加一项,就 -‘0’将其变为数字,最后与‘0’相加,得到八面的炸弹数量,且为char类型的字符。

game函数:

void game(char show_table[Ly][Lx], char in_table[Ly][Lx])
{
	int win = 0;
	
	while (win < X * Y - TNT)
	{	
	
		int x, y;
	hh:
		
		printf("****************************\n");
		printf("请输入要查找的坐标(x,y)\n");
		printf("****************************\n");
			scanf("%d %d", &x, &y);
			if (x >= 1 && x <= X && y >= 1 && y <= Y) {
				if (in_table[y][x] == '1') {
					printf("恭喜你这SB踩到炸弹啦\n " "Game over!!!!\n");
					printf("****************************\n");
					show(in_table);
					printf("****************************\n");
					break;

				}
				else
				{
					printf("****************************\n");
					char c = find(x, y, in_table);
					show_table[y][x] = c;
					show(show_table);
					win++;
					printf("****************************\n");
				}
				if (win == X * Y - TNT)
					printf("恭喜胜利!!!");
			}
			else {
				printf("输错啦!再输一遍\n");
				goto hh;
			}
	}		

最终的game函数呈现,这里用了goto,解决输入无效坐标的问题

 我们现在来玩一次扫雷吧!

按1进入游戏

输入1 1

 好哇(1,1)旁边有一个炸弹

再输入 1 2看看

 好,踩到炸弹。

这里可以再输入1再玩一次。

OK到这里,你已经完全学会扫雷代码,接下来可以和你的小伙伴们分享啦!! 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值