C,C++非图形库扫雷

1,游戏操作规则

1) 点击模式:通过输入d+下标+下标 进行点击相对应方块.(由于没加入鼠标操作就只能这样了)

2)标记模式:通过输入f+下标+下标 进行标记对应方块

3)检测模式:通过输入s+任意下标+任意下标  如果雷全部被标记则游戏结束

2,演示页面

点击

标记

  3,制作实现步骤:

1)申请内存,并进行数组的初始化(为0)

2)随机雷的位置

3)将为雷周围添加标记 

◆表示雷,□表示空白(即周围没雷)

4)将上述页面翻转隐藏

5)设置点击翻转,如果点到数字①②③④⑤⑥⑦⑧则只翻转本身,如果点到空白□则翻转周围8个框

6)再进行扩散性翻转,如果周围八个中还有空白□,则递归继续翻周围,如果不是空白□则不继续递归翻周围!

7)设置标记功能

8)设置游戏游戏结束.....

4,源码

#include<iostream>
using namespace std;
int isgameOver = false;//判断是否结束游戏
int Num = 0;//雷的数量
int COL = 0;//存储地图列数大小
int ROW = 0;//储存地图行数

int** GetMemory(int row, int col);//给地图(二维数组)申请内存
void InitMap(int** pp, int row, int col, int num);//初始化数组000,并随机布置num个雷!
void PrintMarry(int** pp, int row, int col);//打印出数组
void FlagMap(int** pp, int row, int col);//给找到雷,然后做数字标记,确定地图
void MarkAround(int** pp, int row, int col, int x, int y);//将雷周围标记
void DrawMap(int** pp, int row, int col);//绘制地图
void HideMap(int** pp, int row, int col);//隐藏地图
void ShowMap(int** pp, int row, int col, int x, int y,char mode);//点击翻开单个地图
void Spread(int** pp, int row, int col, int x, int y);//扩散性翻开空白地图
void Failure(int** pp, int row, int col);//游戏失败
void IsSuccessful(int** pp, int row, int col);//判断游戏是否成功
void PrintX(int col);//打印列数,显示X坐标
void FreeMemory(int **&pp, int row);//游戏结束释放内存


int main()
{
	srand((unsigned)time(NULL));//随机种子
	int** pp = GetMemory(20, 20);
	InitMap(pp, 20, 20, 25);//编辑地图设置雷数量
	PrintMarry(pp, 20, 20);//打印数组 -1代表雷
	cout << endl;
	FlagMap(pp, 20, 20);
	HideMap(pp, 20, 20);
	PrintX(COL);//显示X坐标系
	DrawMap(pp, 20, 20);
	while (true)
	{   
		int x,y;
		char mode;
		cin >>mode>> y >> x;
		y--, x--;
		ShowMap(pp, 20, 20, (x), (y),mode);

		if (pp[x][y] == -1)
		{
			Failure(pp, 20, 20);//结束游戏
			PrintX(COL);//显示X坐标系
			DrawMap(pp, 20, 20);//打印地图
			FreeMemory(pp, 20);//内存释放
			break;//跳出死循环
		}
		else
		{
			if (isgameOver)
			{
				FreeMemory(pp, 20);
				break;
			}
			PrintX(COL);//显示X坐标系
			DrawMap(pp, 20, 20);//重新打印地图
		}
	}
	system("pause");
	return 0;
}
//给地图(二维数组)申请内存
int** GetMemory(int row, int col)
{
	//给每一行的首地址申请内存
	int** pp = new int* [row];
	for (int i = 0; i < row; i++)
	{
		//给每一行中的元素申请内存
		pp[i] = new int[col];
	}
	return pp;
}
//初始化数组,给其行列row,num进行赋值,并随机布置num个雷!
void InitMap(int** pp, int row, int col, int num)
{
	Num = num;//记录有多少个雷
	COL = col;//记录有多少列
	ROW = row;//记录地图行数
	for (int i = 0; i < row; i++)
	{
		for (int k = 0; k < col; k++)
		{
			if (num > 0)
			{
				pp[i][k] = -1;//雷用-1表示
				num--;//布置一个则数量减少
			}
			else {
				pp[i][k] = 0;//其他则用雷表示
			}
		}
	}
	for (int i = 0; i < row; i++)
	{
		for (int k = 0; k < col; k++)
		{
			int r = rand() % row;
			int c = rand() % col;
			int flag = pp[r][c];
			pp[r][c] = pp[i][k];
			pp[i][k] = flag;
		}
	}
}
//打印出数组
void PrintMarry(int** pp, int row, int col)
{
	for (int i = 0; i < row; i++)
	{
		for (int k = 0; k < col; k++)
		{
			printf("%2d", pp[i][k]);
		}
		cout << endl;
	}
}
//给找到雷,然后做数字标记,确定地图
void FlagMap(int** pp, int row, int col)
{
	for (int i = 0; i < row; i++)
	{
		for (int k = 0; k < col; k++)
		{
			if (pp[i][k] == -1)//找到雷
			{
				MarkAround(pp,row,col, i, k);//标记周围
			}
		}
	}
}
//将雷周围标记
void MarkAround(int** pp, int row, int col, int x, int y)
{
	for (int i = x-1; i <=x+1; i++)
	{
		for (int k = y-1; k <=y+1; k++)
		{
			if(i>=0&&i<row&&k>=0&&k<col&&pp[i][k]!=-1)
				pp[i][k]++;
		}
	}
}
//绘制地图
void DrawMap(int** pp, int row, int col)
{
	for (int i = 0; i < row; i++)
	{
		for (int k = 0; k < col; k++)
		{
			switch (pp[i][k])
			{
			case -1:
				cout << "◆";
				break;
			case 0:
				cout << "□";
				break;
			case 1:
				cout << "①";
				break;
			case 2:
				cout << "②";
				break;
			case 3:
				cout << "③";
				break;
			case 4:
				cout << "④";
				break;
			case 5:
				cout << "⑤";
				break;
			case 6:
				cout << "⑥";
				break;
			case 7:
				cout << "⑦";
				break;
			case 8:
				cout << "⑧";
				break;
			case 9:
			case 10:
			case 11:
			case 12:
			case 13:
			case 14:
			case 15:
			case 16:
			case 17:
			case 18:
				cout << "★";
				break;
			default:
				cout << "■";
				break;
			}
		}
		cout << i+1;
		cout << endl;
	}
}
//隐藏地图
void HideMap(int** pp, int row, int col)
{
	for (int i = 0; i < row; i++)
	{
		for (int k = 0; k < col; k++)
		{
			pp[i][k] += 20;
		}
	}
}
//模式切换:d点击翻开,f对雷标记
void ShowMap(int** pp, int row, int col, int x, int y,char mode)
{
	// x >= 0 && y >= 0 && x < row && y < col防止输入越界
	if (pp[x][y] >= 19&&(mode=='d'||mode=='D') && x >= 0 && y >= 0 && x < row && y < col)//点击翻开,
	{
		pp[x][y] -= 20;
		Spread(pp, row, col, x, y);
	}
	else if (mode == 'f' || mode == 'F' && x >= 0 && y >= 0 && x < row && y < col)
	{
		if (pp[x][y] >= 19)
		{
			pp[x][y] -= 10;
		}
		else if(pp[x][y]>=9)
		{
			pp[x][y] += 10;
		}
	}
	else if(mode=='s'||mode=='S')
	{
		cout << "检测模式:" << endl;
		IsSuccessful(pp, row, col);
	}
	else {
		cout << "输入格式错误!" << endl;
	}
}
//扩散性翻开空白地图
void Spread(int** pp, int row, int col, int x, int y)
{
	if (pp[x][y]==0)//如果被翻开
	{
		for (int i = x-1; i <=x+1; i++)
		{
			for (int k = y-1; k <= y+1; k++)
			{
				//pp[i][k] >= 19排除被翻开的,以及不能越界,不能为自身
				if ((i != x || k != y) && i >= 0 && i < row && k >= 0 && k < col &&pp[i][k]>=19)
				{
					pp[i][k] -= 20;
					Spread(pp, row, col, i, k);
				}
			}
		}
	}
}
//游戏失败
void Failure(int** pp, int row, int col)
{
	for (int i = 0; i < row; i++)
	{
		for (int k = 0; k < col; k++)
		{
			if (pp[i][k] == 19)
			{
				pp[i][k] = -1;//将雷显示出来
			}
		}
	}
	cout << "游戏失败!"<<endl;
}
//判断游戏是否成功
void IsSuccessful(int** pp, int row, int col)
{
	int count = 0;//用于判断标记的雷和实际数量是否相等
	for (int i = 0; i < row; i++)
	{
		for (int k = 0; k < col; k++)
		{
			if (pp[i][k] == 9)//标记的雷
				count++;
		}
	}
	if (count == Num)
	{
		cout << "恭喜你成功过关!" << endl;
		isgameOver = true;//用于跳出游戏
	}
}
void PrintX(int col)//打印列数
{
	
	for (int i = 1; i <= col; i++)
	{
		if (i > 100)
		{
			i = i % 100;
		}
		printf("%2d", i);
	}
	cout <<endl;
}
void FreeMemory(int **&pp, int row)//游戏结束释放内存
{
	for (int i = 0; i < row; i++)
	{
		delete[] pp[i];
	}
	delete[] pp;
	pp = nullptr;
	cout << "内存释放完成!";
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

致奋斗的自己

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值