C语言--扫雷小游戏

Posted 小鹿可可乐

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言--扫雷小游戏相关的知识,希望对你有一定的参考价值。

1.思路分析

在一定区域中,进行显示,用字符框做
步骤:

  • 在所有区域中显示“@”符号。
  • 当输入具体行(r)和列(c)时候 值0为没雷,显示空格
  • r c #(为有雷)
  • r c @(取消选择,继续显示@)

如何在一个方框(字节)中显示不同符号:

在这里插入图片描述

理想实现图示:
在这里插入图片描述

2.代码实现

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>

#define INIT_VIEW 0x80 //1000 0000
#define MEIN_VIEW  0x40 // 0100 0000 #
#define MAKE_MEIN  0x20 // 0010 0000 地雷标
#define NUM_TAG    0x10 // 0001 0000 num;
#define MINE_0     0x00	// 0000 0000 0
#define MINE_1     0x01	// 0000 0001 1
#define MINE_2     0x02	// 0000 0010 2
#define MINE_3     0x03	// 0000 0011 3
#define MINE_4     0x04	// 0000 0100 4
#define MINE_5     0x05	// 0000 0101 5
#define MINE_6     0x06	// 0000 0110 6
#define MINE_7     0x07	// 0000 0111 7
#define MINE_8     0x08	// 0000 1000 8
#define CLE_TAG    0x0f // 0000 1111   清除标记
#define ROWSIZE 15
#define COLSIZE 15
#define MINENUM 64

typedef unsigned char Grid[ROWSIZE + 2][COLSIZE + 2];

void Init_Ar(Grid ar, int row, int col)
{
	assert(ar != nullptr);
	for (int i = 1; i <= row; ++i)
	{
		for (int j = 1; j <= col; ++j)
		{
			ar[i][j] |= INIT_VIEW;
		}
	}
	int i = 0;
	while (i < MINENUM)
	{
		int r = rand() % ROWSIZE + 1;
		int c = rand() % COLSIZE + 1;
		if (!(ar[r][c] & MAKE_MEIN))
		{
			ar[r][c] |= MAKE_MEIN; // ar[r][c] = ar[r][c] | MAKE_MEIN;
			++i;
		}
	}
}
void Test_Print_Ar(Grid ar, int row, int col)
{
	printf("   ");// 3  行先空3个
	for (int j = 1; j <= col; ++j)
	{
		printf("%3d", j);
	}
	printf("\\n");
	for (int i = 1; i <= row; ++i)
	{
		printf("%3d", i);
		for (int j = 1; j <= col; ++j)
		{
			if (ar[i][j] & MAKE_MEIN)
			{
				printf("%3c", '#');
			}
			else if (ar[i][j] & INIT_VIEW)
			{
				printf("%3c", '@');
			}
		}
		printf("\\n");
	}
	printf("\\n");
}

void Test_Print_Ar2(Grid ar, int row, int col)
{
	printf("   ");// 3
	for (int j = 1; j <= col; ++j)
	{
		printf("%3d", j);
	}
	printf("\\n");
	for (int i = 1; i <= row; ++i)
	{
		printf("%3d", i);
		for (int j = 1; j <= col; ++j)
		{
			if (ar[i][j] & MAKE_MEIN)
			{
				printf("%3c", '#');
			}
			else
			{
				printf("%3d", ar[i][j] & 0x0f);
			}
		}
		printf("\\n");
	}
	printf("\\n");
}
void SetMineNum(Grid ar, int row, int col)
{
	for (int r = 1; r <= row; ++r)
	{
		for (int c = 1; c <= col; ++c)
		{
			if (!(ar[r][c] & MAKE_MEIN))
			{
				unsigned char  sum = 0;
				for (int i = r - 1; i < r + 2; ++i)
				{
					for (int j = c - 1; j < c + 2; ++j)
					{
						if (ar[i][j] & MAKE_MEIN)
						{
							sum += 1;
						}
					}
				}
				ar[r][c] |= NUM_TAG;
				ar[r][c] |= (0x0f & sum);  //ar[r][c]|=sum;
			}
		}
	}
}
void Show_Ar(Grid ar, int row, int col)
{
	system("cls");
	printf("   ");// 3
	for (int j = 1; j <= col; ++j)
	{
		printf("%3d", j);
	}
	printf("\\n");
	for (int i = 1; i <= row; ++i)
	{
		printf("%3d", i);
		for (int j = 1; j <= col; ++j)
		{
			if (ar[i][j] & INIT_VIEW)
			{
				printf("%3c", '@');
			}
			else if (ar[i][j] & MEIN_VIEW)
			{
				printf("%3c", '#');
			}
			else if (ar[i][j] & NUM_TAG)
			{
				printf("%3d", ar[i][j] & 0x0f);
			}
		}
		printf("\\n");
	}
	printf("\\n");

}
int main()
{
	Grid ar = {};
	Init_Ar(ar, ROWSIZE, COLSIZE);
	//Test_Print_Ar(ar, ROWSIZE, COLSIZE);
	SetMineNum(ar, ROWSIZE, COLSIZE);
	//Test_Print_Ar2(ar, ROWSIZE, COLSIZE);
	int sum = 0;
	while (sum < MINENUM)
	{
		Show_Ar(ar, ROWSIZE, COLSIZE);
		int r, c;
		char ch;// 0 #  @
		scanf_s("%d %d %c", &r, &c, &ch);
		// r c 0
		// r c #
		// r c @
		if (r >= 1 && r <= ROWSIZE && c >= 1 && c <= COLSIZE)
		{
			if (ch == '0')
			{
				if (ar[r][c] & MAKE_MEIN)
				{
					printf("爆炸了 !");
					exit(1);
				}
				else
				{
					ar[r][c] &= CLE_TAG;
					ar[r][c] |= NUM_TAG;
				}
			}
			if (ch == '#')
			{
				ar[r][c] &= 0x7f;// 0111 1111
				ar[r][c] |= MEIN_VIEW;// #
			}
			if (ch == '@')
			{
			}
		}
	}

	return 0;
}

3.结果展示:

在这里插入图片描述
今天也要好好学习呀~

以上是关于C语言--扫雷小游戏的主要内容,如果未能解决你的问题,请参考以下文章

c语言初学者如何代码实现 扫雷 游戏

C语言游戏超详解扫雷游戏完整版,细节满满!!

C语言游戏超详解扫雷游戏完整版,细节满满!!

C语言实现扫雷游戏(一步步教你如何写扫雷)

C语言实现小游戏篇我接触的第一款电脑游戏,你可以永远相信 “ 扫雷 ” 。[ C语言实现 ] [ 超详细,超清楚 ] [ 有代码 ]

C语言实现扫雷(初阶)