扫雷游戏 未完成

原创 2012年03月21日 17:11:00
 
#include <time.h>
#include <stack>

using namespace std;

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);
public:
	const MapInfo**		GetMap(){return (const MapInfo**)m_pMap;}
	int					GetMapHeight(){return m_nMapHeight;}
	int					GetMapWidth(){return m_nMapWidth;}
};

#include "MineLogic.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)*m_nMapWidth);
	}
}

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(1);
	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][j].bMine)
			{
				return false;
			}
		}
	}
	return true;
}

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

class MineGame:public SGameBase
{
public:
	MineGame();
	~MineGame(){}
private:
	MineLogic m;
protected:
	virtual bool                    UserInitial();  
	virtual void                    UserUninitial();  
	virtual void                    UserFrameFunc();  
	virtual void                    UserRenderFunc(); 
	virtual bool                    UserProcCommand(); 
private:
	HTEXTURE						m_hBack;
	hgeSprite*						m_pSpBack;
	hgeSprite*						m_arrBtnMax[4];
	hgeSprite*						m_arrBtnNom[4];
};

MineGame::MineGame():SGameBase("Mine",600,450)
{
	m.InitMap(8,8);
	m.SetLevel(1);
	m.RandomMap();
}

bool			MineGame::UserInitial()
{
	m_hBack=0;
	m_hBack=m_pHGE->Texture_Load("bg1.png");

	m_pSpBack=NULL;
	m_pSpBack=new hgeSprite(m_hBack,0,0,600,450);

	HTEXTURE hMax=m_pHGE->Texture_Load("maxbutton.png");
	HTEXTURE hNom=m_pHGE->Texture_Load("close.png");
	for(int i=0;i<4;++i)
	{
		m_arrBtnMax[i]=new hgeSprite(hMax,0,30*i,31,30);
		m_arrBtnNom[i]=new hgeSprite(hNom,0,30*i,31,30);
	}

	return true;
}


void			MineGame::UserFrameFunc()
{
	static float fMouseX,fMouseY;
	static int	row,col;

	m_pHGE->Input_GetMousePos(&fMouseX,&fMouseY);

	if(m_pHGE->Input_KeyUp(HGEK_LBUTTON))
	{
		if(fMouseX>=0&&
			fMouseX<=m.GetMapWidth()*40&&
			fMouseY>=0&&
			fMouseY<=m.GetMapHeight()*40)
		{
			row=fMouseX/40;
			col=fMouseY/40;
			if(!m.Clicked(row,col))
			{
				MessageBoxA(m_hWin,"GAME OVER","DEAD",MB_OK);
				m.RandomMap();
			}
		}
	}

	if(m_pHGE->Input_KeyUp(HGEK_RBUTTON))
	{
		if(fMouseX>=0&&
			fMouseX<=m.GetMapWidth()*40&&
			fMouseY>=0&&
			fMouseY<=m.GetMapHeight()*40)
		{
			row=fMouseX/40;
			col=fMouseY/40;
			m.SetFind(row,col,!m.GetFind(row,col));
			if(m.AllFind())
			{
				MessageBoxA(m_hWin,"YOU WIN","WIN",MB_OK);
				m.RandomMap();
			}
		}
	}
}

void			MineGame::UserUninitial()
{

}

void			MineGame::UserRenderFunc()
{
	m_pSpBack->Render(0,0);

	for(int i=0;i<m.GetMapHeight();++i)
	{
		for(int j=0;j<m.GetMapWidth();++j)
		{
			if(!m.GetMap()[i][j].bShow)
			{
				if(m.GetMap()[i][j].bFind)
				{
					m_arrBtnNom[3]->Render(i*40,j*40);
				}
				else
				{
					m_arrBtnMax[0]->Render(i*40,j*40);
				}
			}
			else if(m.GetMap()[i][j].bMine)
			{
				m_arrBtnNom[0]->Render(i*40,j*40);
			}
			else
			{
				m_arrBtnMax[3]->Render(i*40,j*40);
			}
		}
	}
}

bool			MineGame::UserProcCommand()
{
	return false;
}

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

java 扫雷游戏源码案例项目

代码如下 import java.awt.*; import javax.swing.*; //图形计数器JCounter三位 class JCounter extends JPanel { ...
  • guangxiaove
  • guangxiaove
  • 2015年02月03日 09:59
  • 8204

java扫雷游戏源代码下载

java扫雷游戏源代码下载 源代码下载地址:http://www.zuidaima.com/share/1550463791090688.htm...
  • springmvc_springdata
  • springmvc_springdata
  • 2015年06月13日 12:31
  • 1174

c++ 控制台版 扫雷游戏

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

C#编写的扫雷游戏

我突发奇想,想用C#编写了一个扫雷游戏,在网上搜了半天,结果一无所获。 在图书馆翻了半天的书,硬着头皮把一本很厚很厚的书看完了,总之,还是觉得收获挺大。 为了能够学以致用,我开始通过C#来编写扫雷游戏...
  • qq_16635325
  • qq_16635325
  • 2015年11月01日 20:17
  • 6964

java实现扫雷游戏

java 扫雷 改进 右键标记雷
  • Limbos
  • Limbos
  • 2015年08月16日 12:16
  • 4178

最新版红包扫雷游戏

[全网独家开源源码版v10.9]2017年12月最新微信红包牛牛+pc蛋蛋+北京28+加拿大28+扫雷+接龙唯一发布,其他任何论坛或者地址均为假冒诈骗,请分清谨慎。 本站源码为原生源码的升级和完善,...
  • qq_41609151
  • qq_41609151
  • 2018年01月11日 11:55
  • 81

NOIP2015普及组-扫雷游戏

题目太简单,不解释: #include int main(void) { char a[101][101]; int sum[100][100]={0}; int ...
  • qq_16964363
  • qq_16964363
  • 2016年08月20日 10:59
  • 1685

c++趣味入门——扫雷游戏

阵列中的地雷、数字、空白格与标记格设计 用一个二维矩阵代表阵列: 元素值统一初始化为-1; 随机产生10组坐标,每组坐标对应地雷元素,共10个地雷,并均赋值为9,即地雷的元素值为9; 元素值为n(...
  • buptlrw
  • buptlrw
  • 2014年12月16日 16:11
  • 5177

扫雷游戏(C语言实现)

扫雷游戏 自己动手写了扫雷游戏(C语言版)。 我使用了EasyX这个库(下载地址:http://www.easyx.cn EasyX 2014冬至版)。 在写扫雷游戏过程中用到了 1.二维数...
  • qq_27602093
  • qq_27602093
  • 2015年07月28日 08:50
  • 1727

java扫雷游戏代码

import java.awt.BorderLayout; import java.awt.Container; import java.awt.Font; import java.awt.Gr...
  • eland_edwiin
  • eland_edwiin
  • 2012年11月10日 14:23
  • 1808
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:扫雷游戏 未完成
举报原因:
原因补充:

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