关于用C语言实现简单的扫雷游戏(知识点:函数间调用,构造函数,二维数组,结构体,循环分支,输入输出,随机数)

本文详细解释了一个不完整的扫雷游戏代码,涉及二维数组的使用、雷的随机布置、搜索算法以及重复游玩的实现。展示了游戏的开始菜单、雷的查找和坐标轴打印等功能。
摘要由CSDN通过智能技术生成

声明:本人技术不精,如有错误,有请指正

用词可能不是很规范,望专业人士见谅

先展示代码(并不美观,望见谅)

#define _CRT_SECURE_NO_WARNINGS 
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#define row 4
#define clu 4
#define volume 10
char arr[row][clu] = { 0 };
char ar[row + 2][clu + 2] = { 0 };
void meau1()
{
	printf("***************************\n");
	printf("********0.退出游戏*********\n");
	printf("********1.进入扫雷*********\n");
	printf("***************************\n");

}
void print1(char a[row][clu])
{

	for (int i = 0; i < clu + 1; i++)\\横坐标轴
	{
		printf("%2d", i);
	}
	printf("\n");
	for (int i = 0; i < row; i++)
	{
		printf("%2d", i + 1);\\纵坐标轴
		for (int p = 0; p < clu; p++)
		{
			printf("%2c", a[i][p]);
		}
		printf("\n");
	}
}
void setmine()
{
	int count = volume;
	while (count)
	{
		int x = rand() % row + 1;
		int y = rand() % clu + 1;
		ar[x][y] = '1';
		count--;
	}
}

void search(int x, int y)
{
	int n = 0;
	printf("这里没有地雷\n");
	if (ar[x + 1][y] == '1')
		n++;
	if (ar[x][y + 1] == '1')
		n++;
	if (ar[x + 1][y + 1] == '1')
		n++;
	if (ar[x - 1][y - 1] == '1')
		n++;
	if (ar[x + 1][y - 1] == '1')
		n++;
	if (ar[x - 1][y + 1] == '1')
		n++;
	if (ar[x - 1][y] == '1')
		n++;
	if (ar[x][y - 1] == '1')
		n++;
	arr[x - 1][y - 1] = n + '0';

}
void game()
{
	char s;
	while (scanf("%c", &s) != 'o')
	{
		int l, m;
		print1(arr);
		scanf("%d %d", &l, &m);
		if (ar[l][m] == '1')
		{
			printf("你失败了\n");
			break;
		}
		else
		{
			search(l, m);
		}
	}
	meau1();
	int a = 0;
	scanf("%d", &a);
	if (a == 1)
	{
		game();
	}
}

int main()
{
	srand(time(NULL));
	for (int i = 0; i < row; i++)
	{
		for (int p = 0; p < clu; p++)
		{
			arr[i][p] = '*';
		}
	}                                          \\数组初始化
	for (int i = 0; i < row + 2; i++)
	{
		for (int p = 0; p < clu + 2; p++)
		{
			ar[i][p] = '0';
		}
	}
	setmine();                    \\设雷
	meau1();                        \\弹出菜单
	int a = 0;
	scanf("%d", &a);                
	if (a == 1)
	{
		game();
	}
	for (int i = 1; i < row + 1; i++)
	{
		for (int p = 1; p < clu + 1; p++)
		{
			printf("%2c", ar[i][p]);
		}
		printf("\n");
	}
	return 0;
}

游戏内容:

不完备的扫雷游戏(连续的零不会清除,和传统扫雷不同

可以自定义雷场大小和雷数量

可以重复游玩

框架

开始菜单

void meau1()
{
	printf("***************************\n");
	printf("********0.退出游戏*********\n");
	printf("********1.进入扫雷*********\n");
	printf("***************************\n");

}

选择

游戏(可重复游玩)

展示数组和雷分布数组的初始化

为什么要两个数组?它们需要不一样大吗?分别需要多大?

定义数组 

char arr[row][clu] = { 0 };
char ar[row + 2][clu + 2] = { 0 };//这里有说法,查找雷的时候为了避免越界故加大数组

ar为雷的数组(用于查找雷,不能改变)

示例(最下面)

打表

for (int i = 1; i < row + 1; i++)
{
    for (int p = 1; p < clu + 1; p++)
    {
        printf("%2c", ar[i][p]);//占两位(防止错位)
    }
    printf("\n");
}

arr为展示数组(用于展示需要变化)

如上图(上面一个矩阵)

需打印坐标轴方便游玩

void print1(char a[row][clu])
{

	for (int i = 0; i < clu + 1; i++)
	{
		printf("%2d", i);
	}
	printf("\n");
	for (int i = 0; i < row; i++)
	{
		printf("%2d", i + 1);
		for (int p = 0; p < clu; p++)
		{
			printf("%2c", a[i][p]);
		}
		printf("\n");
	}
}

雷的布置

void setmine()
{
	int count = volume;
	while (count)
	{
		int x = rand() % row + 1;//使得x范围为1~9,下同
		int y = rand() % clu + 1;
		ar[x][y] = '1';
		count--;
	}
}

 rand函数需要头文件<stdlib.h>

srand函数构建真随机

#define _CRT_SECURE_NO_WARNINGS 
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#include"meau.h"
#define row 4
#define clu 4
#define volume 10
int main()
{
srand(time(NULL));
return 0;
}

time函数需要头文件<time.h> 

 main函数中其他函数已经略去

row为定义的雷场行数

clu为定义的雷场列数

volume为定义的雷数

三者都能改变

重复游玩的实现(while)

二维数组的矩阵打印(构造函数)

雷的查找和雷数的显示

void search(int x, int y)
{
	int n = 0;
	printf("这里没有地雷\n");
	if (ar[x + 1][y] == '1')
		n++;
	if (ar[x][y + 1] == '1')
		n++;
	if (ar[x + 1][y + 1] == '1')
		n++;
	if (ar[x - 1][y - 1] == '1')
		n++;
	if (ar[x + 1][y - 1] == '1')
		n++;
	if (ar[x - 1][y + 1] == '1')
		n++;
	if (ar[x - 1][y] == '1')
		n++;
	if (ar[x][y - 1] == '1')
		n++;
	arr[x - 1][y - 1] = n + '0';

}

结束菜单(选择是否重来)

这真是一个糟糕的程序(我能力不足,肯定还有很多可以改进的地方)

希望这样一个程序能为刚学编程的你提供小小的帮助,小小的成就感。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值