暂未完成的扫雷逻辑

原创 2012年03月21日 15:44:27
 
#include <time.h>
#include <stack>
#include <Windows.h>
using namespace std;

// TODO: 在此处引用程序要求的附加头文件
struct MapInfo
{
	bool bMine;
	int nBomboNum;
	bool bShow;
	bool bFind;

	MapInfo()
	{
		bMine=bFind=bShow=false;
		nBomboNum=0;
	}
	void Reset()
	{
		bMine=bFind=bShow=false;
		nBomboNum=0;
	}
};
class MineLogic
{
public:
	MineLogic();
	~MineLogic();
private:
	MapInfo**			m_pMap;
	int					m_nMapWidth;
	int					m_nMapHeight;
	int					m_nLevel;
	int					m_nBomboNum;
	stack<int>			m_stPoint;
public:
	void				InitMap(int nWidth,int nHeight);
	void				DestroyMap();
	void				ResetMap();
	void				RandomMap();
	void				SetLevel(int nLevel);
	void				ShowMap();
	bool				Clicked(int nRow,int nCol);
	void				ShowUserMap();
	void				SetFind(int nRow,int nCol,bool b);
	bool				AllFind();
	bool				GetFind(int nRow,int nCol);
};


 

 

#include "stdafx.h"

// TODO: 在 STDAFX.H 中
//引用任何所需的附加头文件,而不是在此文件中引用

MineLogic::MineLogic()
{
	m_pMap=NULL;
	m_nMapHeight=m_nMapWidth=0;
	m_nLevel=0;//初级 20% 中级40% 高级60%
	m_nBomboNum=0;
}

MineLogic::~MineLogic()
{
	this->DestroyMap();
}

void				MineLogic::InitMap(int nWidth,int nHeight)
{
	this->m_nMapWidth=nWidth;
	this->m_nMapHeight=nHeight;

	if(!m_pMap)
	{
		m_pMap=new MapInfo*[nHeight];

		for(int i=0;i<nHeight;++i)
		{
			*(m_pMap+i)=new MapInfo[nWidth];
		}
	}
}

void				MineLogic::ResetMap()
{
	if(!m_pMap)		return;

	for(int i=0;i<this->m_nMapHeight;++i)
	{
		memset(*(m_pMap+i),0,sizeof(MapInfo));
	}
}

void				MineLogic::SetLevel(int nLevel)
{
	this->m_nLevel=nLevel;
	m_nLevel=(int)m_nMapHeight*m_nMapWidth*nLevel/10;

// 	switch (nLevel)
// 	{
// 	case 0:
// 		{
// 			m_nLevel=(int)m_nMapHeight*m_nMapWidth*0.1f;
// 		}
// 		break;
// 	case 1:
// 		{
// 			m_nLevel=(int)m_nMapHeight*m_nMapWidth*0.3f;
// 		}
// 		break;
// 	case 2:
// 		{
// 			m_nLevel=(int)m_nMapHeight*m_nMapWidth*0.5f;
// 		}
// 		break;
// 	}
}

void				MineLogic::DestroyMap()
{
	for(int i=0;i<this->m_nMapHeight;++i)
	{
		delete[](*(m_pMap+i));
	}
	delete[]m_pMap;
}

void				MineLogic::RandomMap()
{
	if(!m_pMap)
	{
		return;
	}

	this->ResetMap();

	//srand((unsigned int)time(NULL));
	srand(2);
	int n=0;
	int x,y;

	for(int i=0;i<m_nLevel;++i)
	{
		if(!m_pMap[(int)(m_nMapHeight*rand()/(RAND_MAX+1.0))][(int)(m_nMapHeight*rand()/(RAND_MAX+1.0))].bMine)
		{
			m_pMap[(int)(m_nMapHeight*rand()/(RAND_MAX+1.0))][(int)(m_nMapHeight*rand()/(RAND_MAX+1.0))].bMine=true;
		}
		else
		{
			--i;
		}
	}

	for(int i=0;i<m_nMapHeight;++i)
	{
		for(int j=0;j<m_nMapWidth;++j)
		{
			if(m_pMap[i][j].bMine)
			{
				m_pMap[i][j].nBomboNum=n;
				continue;
			}
			else
			{
				x=i-1;y=j-1;
				if(x>=0&&y>=0)
				{
					if(m_pMap[x][y].bMine)
					{
						++n;
					}
				}
				x=i-1;y=j;
				if(x>=0)
				{
					if(m_pMap[x][y].bMine)
					{
						++n;
					}
				}
				x=i-1;y=j+1;
				if(x>=0&&y<m_nMapWidth)
				{
					if(m_pMap[x][y].bMine)
					{
						++n;
					}
				}
				x=i;y=j-1;
				if(y>=0)
				{
					if(m_pMap[x][y].bMine)
					{
						++n;
					}
				}
				x=i;y=j+1;
				if(y<m_nMapWidth)
				{
					if(m_pMap[x][y].bMine)
					{
						++n;
					}
				}
				x=i+1;y=j-1;
				if(x<m_nMapHeight&&y>=0)
				{
					if(m_pMap[x][y].bMine)
					{
						++n;
					}
				}
				x=i+1;y=j;
				if(x<m_nMapHeight)
				{
					if(m_pMap[x][y].bMine)
					{
						++n;
					}
				}
				x=i+1;y=j+1;
				if(x<m_nMapHeight&&y<m_nMapWidth)
				{
					if(m_pMap[x][y].bMine)
					{
						++n;
					}
				}
				m_pMap[i][j].nBomboNum=n;
			}
			n=0;
		}
	}
}

bool				MineLogic::Clicked(int nRow,int nCol)
{
	m_pMap[nRow][nCol].bShow=true;

	if(m_pMap[nRow][nCol].bMine)
	{
		
		return false;
	}

	if(m_pMap[nRow][nCol].nBomboNum!=0)
	{
		return true;
	}

	int x,y;

	x=nRow-1;y=nCol-1;
	if(x>=0&&y>=0)
	{
		if(!m_pMap[x][y].bShow&&
			m_pMap[x][y].nBomboNum==0&&
			!m_pMap[x][y].bMine)
		{
			m_pMap[x][y].bShow=true;
			m_stPoint.push(x);
			m_stPoint.push(y);
		}
	}
	x=nRow-1;y=nCol;
	if(x>=0)
	{
		if(!m_pMap[x][y].bShow&&
			m_pMap[x][y].nBomboNum==0&&
			!m_pMap[x][y].bMine)
		{
			m_pMap[x][y].bShow=true;
			m_stPoint.push(x);
			m_stPoint.push(y);
		}
	}
	x=nRow-1;y=nCol+1;
	if(x>=0&&y<m_nMapWidth)
	{
		if(!m_pMap[x][y].bShow&&
			m_pMap[x][y].nBomboNum==0&&
			!m_pMap[x][y].bMine)
		{
			m_pMap[x][y].bShow=true;
			m_stPoint.push(x);
			m_stPoint.push(y);
		}
	}
	x=nRow;y=nCol-1;
	if(y>=0)
	{
		if(!m_pMap[x][y].bShow&&
			m_pMap[x][y].nBomboNum==0&&
			!m_pMap[x][y].bMine)
		{
			m_pMap[x][y].bShow=true;
			m_stPoint.push(x);
			m_stPoint.push(y);
		}
	}
	x=nRow;y=nCol+1;
	if(y<m_nMapWidth)
	{
		if(!m_pMap[x][y].bShow&&
			m_pMap[x][y].nBomboNum==0&&
			!m_pMap[x][y].bMine)
		{
			m_pMap[x][y].bShow=true;
			m_stPoint.push(x);
			m_stPoint.push(y);
		}
	}
	x=nRow+1;y=nCol-1;
	if(x<m_nMapHeight&&y>=0)
	{
		if(!m_pMap[x][y].bShow&&
			m_pMap[x][y].nBomboNum==0&&
			!m_pMap[x][y].bMine)
		{
			m_pMap[x][y].bShow=true;
			m_stPoint.push(x);
			m_stPoint.push(y);
		}
	}
	x=nRow+1;y=nCol;
	if(x<m_nMapHeight)
	{
		if(!m_pMap[x][y].bShow&&
			m_pMap[x][y].nBomboNum==0&&
			!m_pMap[x][y].bMine)
		{
			m_pMap[x][y].bShow=true;
			m_stPoint.push(x);
			m_stPoint.push(y);
		}
	}
	x=nRow+1;y=nCol+1;
	if(x<m_nMapHeight&&y<m_nMapWidth)
	{
		if(!m_pMap[x][y].bShow&&
			m_pMap[x][y].nBomboNum==0&&
			!m_pMap[x][y].bMine)
		{
			m_pMap[x][y].bShow=true;
			m_stPoint.push(x);
			m_stPoint.push(y);
		}
	}

	int preSize=m_stPoint.size();
	while(m_stPoint.size()!=0)
	{
		nCol=m_stPoint.top();
		m_stPoint.pop();
		nRow=m_stPoint.top();
		m_stPoint.pop();

		preSize=m_stPoint.size();
		x=nRow-1;y=nCol-1;
		if(x>=0&&y>=0)
		{
			if(!m_pMap[x][y].bShow&&
				m_pMap[x][y].nBomboNum==0&&
				!m_pMap[x][y].bMine)
			{
				m_pMap[x][y].bShow=true;
				m_stPoint.push(x);
				m_stPoint.push(y);
			}

			if(!m_pMap[x][y].bShow&&
				m_pMap[x][y].nBomboNum!=0&&
				!m_pMap[x][y].bMine)
			{
				m_pMap[x][y].bShow=true;
			}
		}
		x=nRow-1;y=nCol;
		if(x>=0)
		{
			if(!m_pMap[x][y].bShow&&
				m_pMap[x][y].nBomboNum==0&&
				!m_pMap[x][y].bMine)
			{
				m_pMap[x][y].bShow=true;
				m_stPoint.push(x);
				m_stPoint.push(y);
			}

			if(!m_pMap[x][y].bShow&&
				m_pMap[x][y].nBomboNum!=0&&
				!m_pMap[x][y].bMine)
			{
				m_pMap[x][y].bShow=true;
			}
		}
		x=nRow-1;y=nCol+1;
		if(x>=0&&y<m_nMapWidth)
		{
			if(!m_pMap[x][y].bShow&&
				m_pMap[x][y].nBomboNum==0&&
				!m_pMap[x][y].bMine)
			{
				m_pMap[x][y].bShow=true;
				m_stPoint.push(x);
				m_stPoint.push(y);
			}

			if(!m_pMap[x][y].bShow&&
				m_pMap[x][y].nBomboNum!=0&&
				!m_pMap[x][y].bMine)
			{
				m_pMap[x][y].bShow=true;
			}
		}
		x=nRow;y=nCol-1;
		if(y>=0)
		{
			if(!m_pMap[x][y].bShow&&
				m_pMap[x][y].nBomboNum==0&&
				!m_pMap[x][y].bMine)
			{
				m_pMap[x][y].bShow=true;
				m_stPoint.push(x);
				m_stPoint.push(y);
			}

			if(!m_pMap[x][y].bShow&&
				m_pMap[x][y].nBomboNum!=0&&
				!m_pMap[x][y].bMine)
			{
				m_pMap[x][y].bShow=true;
			}
		}
		x=nRow;y=nCol+1;
		if(y<m_nMapWidth)
		{
			if(!m_pMap[x][y].bShow&&
				m_pMap[x][y].nBomboNum==0&&
				!m_pMap[x][y].bMine)
			{
				m_pMap[x][y].bShow=true;
				m_stPoint.push(x);
				m_stPoint.push(y);
			}

			if(!m_pMap[x][y].bShow&&
				m_pMap[x][y].nBomboNum!=0&&
				!m_pMap[x][y].bMine)
			{
				m_pMap[x][y].bShow=true;
			}
		}
		x=nRow+1;y=nCol-1;
		if(x<m_nMapHeight&&y>=0)
		{
			if(!m_pMap[x][y].bShow&&
				m_pMap[x][y].nBomboNum==0&&
				!m_pMap[x][y].bMine)
			{
				m_pMap[x][y].bShow=true;
				m_stPoint.push(x);
				m_stPoint.push(y);
			}

			if(!m_pMap[x][y].bShow&&
				m_pMap[x][y].nBomboNum!=0&&
				!m_pMap[x][y].bMine)
			{
				m_pMap[x][y].bShow=true;
			}
		}
		x=nRow+1;y=nCol;
		if(x<m_nMapHeight)
		{
			if(!m_pMap[x][y].bShow&&
				m_pMap[x][y].nBomboNum==0&&
				!m_pMap[x][y].bMine)
			{
				m_pMap[x][y].bShow=true;
				m_stPoint.push(x);
				m_stPoint.push(y);
			}

			if(!m_pMap[x][y].bShow&&
				m_pMap[x][y].nBomboNum!=0&&
				!m_pMap[x][y].bMine)
			{
				m_pMap[x][y].bShow=true;
			}
		}
		x=nRow+1;y=nCol+1;
		if(x<m_nMapHeight&&y<m_nMapWidth)
		{
			if(!m_pMap[x][y].bShow&&
				m_pMap[x][y].nBomboNum==0&&
				!m_pMap[x][y].bMine)
			{
				m_pMap[x][y].bShow=true;
				m_stPoint.push(x);
				m_stPoint.push(y);
			}

			if(!m_pMap[x][y].bShow&&
				m_pMap[x][y].nBomboNum!=0&&
				!m_pMap[x][y].bMine)
			{
				m_pMap[x][y].bShow=true;
			}
		}
	}
	return true;
}

void				MineLogic::ShowMap()
{
	for(int i=0;i<m_nMapWidth;++i)
	{
		for(int j=0;j<m_nMapHeight;++j)
		{
			if(m_pMap[i][j].bMine)
			{
				printf("	B");
			}
			else
			{
				printf("	%d",m_pMap[i][j].nBomboNum);
			}
		}
		printf("\n");
	}
	printf("\n\n");
}

void				MineLogic::ShowUserMap()
{
	for(int i=0;i<m_nMapWidth;++i)
	{
		for(int j=0;j<m_nMapHeight;++j)
		{
			if(m_pMap[i][j].bShow)
			{
				if(m_pMap[i][j].bMine)
				{
					printf("	B");
				}
				else
				{
					printf("	%d",m_pMap[i][j].nBomboNum);
				}
			}
			else
			{
				printf("	X");
			}
			
		}
		printf("\n");
	}
	printf("\n\n");
}

void			MineLogic::SetFind(int nRow,int nCol,bool b)
{
	if(m_pMap[nRow][nCol].bMine)
	{
		m_pMap[nRow][nCol].bFind=b;
	}
}

bool			MineLogic::AllFind()
{
	for(int i=0;i<m_nMapHeight;++i)
	{
		for(int j=0;j<m_nMapWidth;++j)
		{
			if(!m_pMap[i][j].bFind&&
				m_pMap[i][i].bMine)
			{
				return false;
			}
		}
	}
	return true;
}

bool			MineLogic::GetFind(int nRow,int nCol)
{
	return m_pMap[nRow][nCol].bFind;
}


 

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

相关文章推荐

扫雷游戏 未完成

#include #include using namespace std; struct MapInfo { bool bMine; int nBomboNum; bool bShow...
  • sryan
  • sryan
  • 2012年03月21日 17:11
  • 729

//暂未完成

五行代码实现的算法好用吗?答案当时是肯定的

用Windbg调试一个Windows自带扫雷程序的逻辑bug

大二的时候玩Windows自带的扫雷很多,发现过一个在XP下让扫雷计时器停止的bug,具体参见过去我在mop上发的一个帖子http://dzh.mop.com/topic/readSub_557350...

java多线程案例——未完成

  • 2015年08月21日 19:48
  • 34.86MB
  • 下载

解决SpringMVC返回Json数据格式不严谨报异常的问题(草稿未完成)

周末调试程序的时候发现的该问题,表现如下:

2D星战游戏(进化未完成版)

  • 2014年06月20日 12:06
  • 10.84MB
  • 下载

一个未完成的记事本

  • 2013年07月04日 14:27
  • 2.86MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:暂未完成的扫雷逻辑
举报原因:
原因补充:

(最多只允许输入30个字)