制作扫雷(简易版)

这篇博客将为大家带来一个c语言写的小程序——扫雷。

用到的知识——数组,函数。

快来围观呀!

目录

1.网页版扫雷

1.1本篇扫雷与网页版扫雷的区别

2.自制扫雷

2.1新建文件

 ​编辑

2.2代码编写

2.2.1 整体思路

2.2.1  test.c

2.2.2  game.c

2.2.3  game.h

2.3 程序运行 

 


 

1.网页版扫雷

c60c6cd832194112b8758bbd23e78077.png

游戏规则 :

1.扫雷就是要把所有非地雷的格子揭开即胜利;踩到地雷格子就算失败

2.游戏主区域由很多个方格组成。使用鼠标左键随机点击一个方格,方格即被打开并显示出方格中的数字;方格中数字则表示其周围的8个方格隐藏了几颗雷;如果点开的格子为空白格,即其周围有0颗雷,则其周围格子自动打开;

3.1代表1的上下左右及斜角合计有一颗雷,依次轮推,2则有2颗,3则有3颗。在确实是炸弹的方格上点了旗子,就安全了,不是炸弹的被点了旗子,后面会被炸死的。问号就三不确定这里有没有炸弹,不会存在点错了被炸死的状况

1.1本篇扫雷与网页版扫雷的区别

游戏规则相同,但目前没法实现无雷地区展开一片(该步骤可以用递归实现) 

本篇扫雷通过依次排查无雷坐标进行实现

2.自制扫雷

2.1新建文件

 b16f233616764ce8bbda959e2bcded86.png

分别在源文件和头文件下创建game.c,test.c,和game.h

 test.c:用于构建扫雷的整体框架结构

game.h:用于存放扫雷中出现的函数的声明,以及所要用到的头文件(简单来说是main函数头上那一堆)

game.c:用于编写扫雷用到的函数定义

有了这些文件可以使程序看起来思路更加清晰,不理解没关系可以接着往下看

2.2代码编写

2.2.1 整体思路

主体: 输出菜单让用户选择——>根据选择判断是否进入游戏——>游戏运行——>游戏结束

游戏运行:

1.生成两个数组,分别代表用户界面的图和内部地雷图(0代表无雷,1代表有雷)

2.用户界面数组初始化为*,内部地雷数组初始化为0

3.用随机数在内部地雷数组中放置雷“1”

4.输出用户界面并让用户输入排查的坐标

5.判断坐标处是否为雷,是雷游戏结束(展示答案),不是雷计算并显示该坐标处的雷数

6.使用while循环,通过对操作次数进行计数判断游戏是否结束

2.2.1  test.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"

int main()
{
	int a;
	while (1)
	{
		srand((unsigned int)time(NULL));
		menu();
		printf("请选择:");
		scanf("%d", &a);
		switch (a)
		{
		case 1:
			printf("开始扫雷\n");
			game();
			break;
		case 0:
			printf("游戏结束了\n");
			break;
		default:
			printf("输入错误,请重新输入\n");
			break;
		}
		if (a)
			;
		else
			break;
	}

	return 0;
}

用while(1)死循环来使用户可进行多次游戏

2.2.2  game.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"

//输出菜单
void menu(void)
{
	printf("***********************\n");
	printf("******  1.play  *******\n");
	printf("******  0.exit  *******\n");
	printf("***********************\n");
}

//初始化数组
void initi(char arr[ROWW][COLL], char ch)
{
	int i, j;
	for (i = 0; i < ROWW; i++)
	{
		for (j = 0; j < COLL; j++)
		{
			arr[i][j] = ch;
		}
	}
}

//输出数组
void print(char arr[ROWW][COLL])
{
	int i, j;
	for (i = 0; i <= ROW; i++)
	{
		printf("%2d ", i);
	}
	printf("\n");
	for (i = 1; i <= ROW; i++)
	{
		printf("%2d ", i);
		for (j = 1; j <= COL; j++)
		{
			printf("%2c ", arr[i][j]);
		}
		printf("\n");
	}
}

//放置雷
void place(char arr[ROWW][COLL], int n)
{
	int count = COUNT;
	while (count)
	{
		int x = rand() % ROW + 1;
		int y = rand() % COL + 1;
		if (arr[x][y] != '1')
		{
			arr[x][y] = '1';
			count--;
		}
	}
}

//计算雷数
char Num(char arr[ROWW][COLL], int a, int b)
{
	int i, j, sum = 0;
	char result = '0';
	for (i = a - 1; i <= a + 1; i++)
	{
		for (j = b - 1; j <= b + 1; j++)
		{
			sum += arr[i][j] - 48;
		}
	}
	result += sum;
	return result;
}

//扫雷实现
void game(void)
{
	int a, b;
	int freq = 0;
	char mine[ROWW][COLL], show[ROWW][COLL];
	initi(mine, '0');
	initi(show, '*');//初始化数组

	place(mine, COUNT);

	while (freq < ROW * COL - COUNT)//判断排查次数是否到达无雷数
	{
		printf("-------扫雷游戏-------\n");
		print(show);//输出数组
		printf("\n");
		
		printf("请输入:");
		scanf("%d%d", &a, &b);
		if (a >= 1 && a <= ROW && b >= 1 && b <= COL)
		{
			if (show[a][b] == '*')
			{
				if (mine[a][b] == '1')
				{
					printf("恭喜你,你被炸死了\n");
					printf("-----以下展示答案-----\n");
					print(mine);
					break;
				}
				else if (mine[a][b] == '0')
				{
					show[a][b] = Num(mine, a, b);
					freq++;
				}
			}
			else {
				printf("输入重复,请重新输入\n");
			}
		}
		else {
			printf("越界输入,错误!\n");
		}
	}
	if (freq == ROW * COL - COUNT)
	{
		printf("恭喜你,扫清所有雷!\n");
	}

}

2.2.3  game.h

#pragma once
#define ROW 9
#define COL 9
#define ROWW 11
#define COLL 11
#define COUNT 10
#include<stdio.h>
#include<time.h>
#include<stdlib.h>

//输出菜单
void menu(void);

//扫雷实现
void game(void);

//初始化数组
void initi(char arr[ROWW][COLL], char ch);

//输出数组
void print(char arr[ROWW][COLL]);

//放置雷
void place(char arr[ROWW][COLL], int n);

//雷数
char Num(char arr[ROWW][COLL], int a, int b);

2.3 程序运行 

813773bfbf164279b457184de1d3b0aa.png

好了,以上就是简易版扫雷的全部内容,还不快点动手去试试~ 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值