小项目 : C语言实现扫雷小游戏

本文介绍了一款基于C语言的扫雷游戏实现细节,包括游戏核心功能:首次踩雷自动换雷位置、周围无雷时的自动扩展等功能。通过源代码分析,详细解释了游戏流程与关键函数的设计思路。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

实现功能:

1.若第一次踩到雷,就将雷更换位置。

2若输入坐标周围没有雷,实现向外扩展。

game.h

# ifndef __game_h_
# define __game_h_
#include <stdio.h>
#include <stdlib.h>
#include <time.h>


# define ROW 10 //定义行和列,任意可以更改
# define COL 10
# define ROWS (ROW + 2)
# define COLS  (COL + 2)
# define M 10 //定义雷的数目

void Init_Bor(int bor[ROWS][COLS], char ch); //初始化棋盘
void Printf_Bor(char bor[ROWS][COLS]); //打印棋盘
void Setmine(char bor[ROWS][COLS],int count); //设置雷
void First_Play(char bor[ROWS][COLS],char bor1[ROWS][COLS]);//保证第一次玩家不会踩到雷
int Sum_Around(char arr[ROWS][COLS], int i, int j); //计算周围雷的个数
int Play_Mine(char bor[ROWS][COLS],char bor1[ROWS][COLS]);//第二次及以后
void Expend_Bor(int arr[ROWS][COLS],char arr1[ROWS][COLS],int i,int j);//周围没有雷的时候向外扩展
int Is_Win(char bor[ROWS][COLS], int i, int j, int m);//判断输赢



# endif //__game_h_


test.c

//设置两个二维数组,一个用来计算雷的数目,初始化为全0;一个用来玩家操作,初始化为全‘*’

#include "GAME.h"
void menu()
{
	printf("*************************\n");
	printf("*   1:play     0:exit   *\n");
	printf("*************************\n");
}
void GAME()
{
	srand((unsigned int)time(NULL));
	int T = 0;
	int ret = 0;
	int ret1 = 0;
	char mine[ROWS][COLS] = { '0' };
	char show[ROWS][COLS] = { '0' };
	Init_Bor(mine, '0');
	Init_Bor(show, '*');
	Printf_Bor(show);
	Setmine(mine,M);
	while (1)
	{
		if (T == 0)
		{
			First_Play(mine, show);
			T++;
		}
		else
		{
			ret = Play_Mine(mine, show);
			if (ret == 1)
			{
				printf("很遗憾,你踩到雷了!\n");
				break;
			}
			ret1 = Is_Win(show, ROWS, COLS, M);
			if (ret1 == 1)
			{
				printf("排雷成功!\n");
				Printf_Bor(show);
				break;
			}
		}
		Printf_Bor(show);
	}
}
int main()
{
	int input = 0;
	do
	{
		menu();
		printf("请选择:>");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			GAME();
			break;
		case 0:
			printf("游戏结束!");
			break;
		default:
			printf("请重新输入:>\n");
			break;
		}
	} while (input);
	system("pause");
	return 0;
}


game.c

#include "GAME.h"
void Init_Bor(int bor[ROWS][COLS], char ch)
{
	memset(bor, ch, ROWS*COLS*sizeof(char));
}
void Printf_Bor(char bor[ROWS][COLS]) //将棋盘规则打印,并附有横纵坐标
{
	int i = 0;
	int j = 0;

	printf("     ");
	for (j = 0; j < COLS - 2; j++)
	{
		printf("%2d ", j + 1);
	}
	printf("\n");

	for (i = 1; i < ROWS - 1; i++)
	{
		printf("  %2d  ", i);
		for (j = 1; j < COLS - 1; j++)
		{
			printf("%c  ", bor[i][j]);
		}
		printf("\n");
	}
}
void Setmine(char bor[ROWS][COLS],int count)
{
	int i = 0;
	int j = 0;
	int c = count;
    while (c)
	{
		i = rand() % ROW + 1;
		j = rand() % COL + 1;
		if ((i > 0) && (j > 0) && (bor[i][j] == '0'))
		{
			bor[i][j] = '1';
			c--;
		}
	}
}
void First_Play(char bor[ROWS][COLS], char bor1[ROWS][COLS])//玩家走的第一步,若是踩到雷便将雷移位
{
	int i = 0;
	int j = 0;
	int I = 0;
	int J = 0;
	char sum = 0;
	printf("请输入坐标:>");
	scanf("%d%d", &i, &j);
	if (bor[i][j] == '1')
	{
		while (1)
		{
			I = rand() % ROW + 1;
			J = rand() % COL + 1;
			if (bor[I][J] == '0')
			{
				bor[I][J] = '1';
				break;
			}
		}
		I = i;
		J = j;
		bor[I][J] == '0';
		sum = Sum_Around(bor, I, J);
		bor1[I][J] = sum;
		Expend_Bor(bor, bor1, I, J);
	}
	else
	{
		Expend_Bor(bor, bor1, i, j);
	}
}
int Sum_Around(char arr[ROWS][COLS], int i, int j)
{
	int sum = 0;
	sum = (arr[i - 1][j - 1] + arr[i][j - 1] + arr[i + 1][j - 1]
		+ arr[i + 1][j] + arr[i + 1][j + 1] + arr[i][j + 1]
		+ arr[i - 1][j + 1] + arr[i - 1][j] - 7 * '0');
	return sum;
}
int Play_Mine(char bor[ROWS][COLS], char bor1[ROWS][COLS])
{
	int i = 0;
	int j = 0;
	int I = 0;
	int J = 0;
		printf("请输入坐标:>");
		scanf("%d%d", &i, &j);
	while (1)
	{
		if (bor1[i][j] == ' ')
		{
			printf("此处已经排过雷,请重新输入!\n");
			scanf("%d %d", &i, &j);
		}
		else
		{
			break;
		}
	}
	if (bor[i][j] == '0')
	{
		Expend_Bor(bor, bor1, i, j);
		return 0;
	}
	else
	{
		return 1;
	}
	return 0;
}
void Expend_Bor(int arr[ROWS][COLS], char arr1[ROWS][COLS], int i, int j)
{
	int sum = 0;
	sum = Sum_Around(arr, i, j);
	if (sum == '0')
	{
		arr1[i][j] = ' ';
	}
	else if (sum > '0')
	{
		arr1[i][j] = sum;
	}
	if ((sum <= '0') && (i > 0) && (i<ROWS - 1) && (j>0) && (j < COLS - 1))
	{

		if ((arr1[i - 1][j - 1] == '*'))//左上
		{
			Expend_Bor(arr, arr1, i - 1, j - 1);
		}

		if ((arr1[i][j - 1] == '*'))//左方
		{
			Expend_Bor(arr, arr1, i, j - 1);
		}


		if ((arr1[i + 1][j - 1] == '*'))//左下
		{
			Expend_Bor(arr, arr1, i + 1, j - 1);
		}


		if ((arr1[i + 1][j] == '*'))//下方
		{
			Expend_Bor(arr, arr1, i + 1, j);
		}


		if ((arr1[i + 1][j + 1] == '*'))//右下
		{
			Expend_Bor(arr, arr1, i + 1, j + 1);
		}


		if ((arr1[i][j + 1] == '*'))//右方
		{
			Expend_Bor(arr, arr1, i, j + 1);
		}


		if ((arr1[i - 1][j + 1] == '*'))//右上
		{
			Expend_Bor(arr, arr1, i - 1, j + 1);
		}


		if ((arr1[i - 1][j] == '*'))//上方
		{
			Expend_Bor(arr, arr1, i - 1, j);
		}
	}
}
int Is_Win(char bor[ROWS][COLS], int i, int j, int m)
{
	int count = 0;
	for (i = 1; i < ROWS - 1; i++)
	{
		for (j = 1; j < COLS - 1; j++)
		{
			if (bor[i][j] == '*')
			{
				count++;
			}
		}
	}

	if (count == m)
	{
		for (i = 1; i < ROWS - 1; i++)
		{
			for (j = 1; j < COLS - 1; j++)
			{
				if (bor[i][j] == '*')
				{
					bor[i][j] = 'M';//若玩家胜出,则将全部有雷的地方显示为M
				}
			}
		}
		return 1;
	}
	return 0;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值