第一次完全会玩扫雷,@NK_test

         C++扫雷设计,环境:windows XP,软件:Codeblocks


@NK_test  名字看起来像 “牛牪犇客”的人。大哥!

 学校机房里面莫得有扫雷,自己有想法还没动手。从他那里看到一份扫雷的代码。有几个错误修改下就可以用了。

源码来自NK_test 的《c++ 控制台版 扫雷游戏》,web:https://blog.csdn.net/NK_test/article/details/47030583

十分的感谢!!!!!!!!!!!!!


1.Analyse

等    等    等, 404 not found

扫雷的规则:更多提示在   最全的扫雷技巧和基本规则

Web:https://jingyan.baidu.com/article/7f766daf9231e84101e1d03d.html

源自于windows自带扫雷,基本操作:左键翻开这一格,右键标记地雷,双击左键(或者左右键一起点)可以看到这个数字的可点击范围,你点出了一个数字,是1,就说明它周围的8的格子里有1个雷,是2就有两个雷,是3就有三个雷···以此类推。如果你把数字周围的雷全扫出后还有空格,不必再一格一格翻开,直接双击左键就可以了。但如果你标记错了雷,那就会"boom!"一切重新开始。我们的需要手动输入坐标。如0 0----- 9 9

2.Code Print

// 扫雷程序
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <queue>
#include <cstring>
#include <ctime>
#include <cmath>
using namespace std;
int grid[100][100];
int randMark[100][100];
char showUs[100][100];
int vis[100][100];
int dir[8][2]={{-1,0},{1,0},{0,1},{0,-1},{-1,-1},{-1,1},{1,-1},{1,1}};//方向数组
int res;
struct node
{
	int x;
	int y;
};
void bfs(int nx,int ny) //处理点击空白
{
	queue <node> q;
	node temp;
	node t;
	t.x=nx,t.y=ny;
	q.push(t);
	vis[nx][ny]=1;
	while(!q.empty())
	{
		res++;
		temp=q.front();
		showUs[temp.x][temp.y]=grid[temp.x][temp.y]+'0';
		q.pop();
		for(int i=0;i<8;i++)
		{
			int xx=temp.x+dir[i][0];
			int yy=temp.y+dir[i][1];
			if(xx>=0&&xx<10&&yy>=0&&yy<10)
			{
				if(!vis[xx][yy]&&grid[xx][yy]==0)
				{
				   t.x=xx,t.y=yy;
				   vis[xx][yy]=1;
				   showUs[xx][yy]=grid[xx][yy]+'0';
				   q.push(t);
				}
				if(!vis[xx][yy]&&grid[xx][yy]>0&&grid[temp.x][temp.y]==0)
				{
				   t.x=xx,t.y=yy;
				   vis[xx][yy]=1;
				   showUs[xx][yy]=grid[xx][yy]+'0';
				   q.push(t);
				}
			}
		}
	}
}
int main()
{
	memset(grid,0,sizeof(grid));
	memset(randMark,0,sizeof(randMark));
	memset(vis,0,sizeof(vis));
	for(int i=0;i<10;i++)
	for(int j=0;j<10;j++)
	showUs[i][j]='*';
	srand(unsigned(time(NULL)));
	int sum=0;
	while(1)
	{
		int x=rand()%10;
		int y=rand()%10;
		if(randMark[x][y]!=1)
		{
			randMark[x][y]=1;//有雷
			sum++;
		}
		if(sum==10)
		break;

	}
    res=0;
	for(int i=0;i<10;i++)
	for(int j=0;j<10;j++)
	{
		if(randMark[i][j])
		grid[i][j]=-1;
	}
	for(int i=0;i<10;i++)
	for(int j=0;j<10;j++)
	{
		if(grid[i][j]!=-1)
		{
			for(int k=0;k<8;k++)
			{
				int x=i+dir[k][0];
				int y=j+dir[k][1];
				if(x>=0&&x<10&&y>=0&&y<10&&grid[x][y]==-1)
				{
				   grid[i][j]++;
				}
			}
		}
	}
	for(int i=0;i<10;i++)
	{
		for(int j=0;j<10;j++)
		cout<<showUs[i][j]<<" ";
		cout<<endl;
	}

	cout<<"请输入要翻开的位置的坐标:"<<endl;
	int x,y;
	while(1)
	{
		if(res==90)
		cout<<"恭喜您胜利啦,排雷成功!"<<endl;
		cin>>x>>y;
		if(grid[x][y]==-1)
		{
			cout<<"您中雷啦!"<<endl;
			break;
		}
		else if(!vis[x][y]&&grid[x][y]>0)
		{
			res++;
			vis[x][y]=1;
			showUs[x][y]=grid[x][y]+'0';
			system("cls");
			for(int i=0;i<10;i++)
	        {
	        	for(int j=0;j<10;j++)
	     	    cout<<showUs[i][j]<<" ";
	        	cout<<endl;
         	}
         	cout<<"请输入要翻开的位置的坐标:"<<endl;
		}
		else if(!vis[x][y]&&grid[x][y]==0)
		{
			bfs(x,y);
			system("cls");
			for(int i=0;i<10;i++)
	        {
	        	for(int j=0;j<10;j++)
	     	    cout<<showUs[i][j]<<" ";
	        	cout<<endl;
         	}
         	cout<<"请输入要翻开的位置的坐标:"<<endl;
		}
	}
	return 0;
}

 

3.End

没办法截图,第一次玩游戏就只有数字记录了。

这个源码不是我写的,NK_test大哥,我只是拿来转载,参考,大哥以后靠你了!!!!!!!!!!!!!!!!!!!!!


0000002*20

0111002*20

01*2101121

01**10001*

12*2100011

***1000000

1211000000

0000000122

00000001**

00000001**  玩这个的背景是这样的,终于用眼睛和纸笔,(我不会告诉你们,“您中雷了”)

1 在ACM吧看到的,悠悠地方wan了

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值