码迷,mamicode.com
首页 > 编程语言 > 详细

c++ 控制台版 扫雷游戏

时间:2015-07-23 23:45:18      阅读:266      评论:0      收藏:0      [点我收藏+]

标签:c++   控制台   扫雷   bfs   

白天看了一天书看累了,晚上瞅见扫雷游戏,就自己琢磨着做一个呗。想了一会,也没看别人怎么做的,大概1个多小时完成了这个简单版本的扫雷游戏,由于没怎么学过c#,界面的事情可能迟几天再做,明天要回家啦,哈哈!

先说思路,其实挺简单的。

(1) 随机生成10个雷,标记到二维数组里,然后计算八个方向的雷的总数记录下来,这是预处理阶段。

(2)输入要翻开的位置的坐标,如果是数字直接显示,是空白的话,这里采用bfs即宽度优先搜索解决,搜到最外层是数字(仅一层)时结束,具体详见代码。

技术分享

// 扫雷程序 
#include <iostream>
#include <string>
#include <queue>
#include <cstring>
#include <ctime>
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;
} 


版权声明:本文为博主原创文章,未经博主允许不得转载。

c++ 控制台版 扫雷游戏

标签:c++   控制台   扫雷   bfs   

原文地址:http://blog.csdn.net/nk_test/article/details/47030583

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!