⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 data.cpp

📁 symbian 的lian-liankan
💻 CPP
字号:
// Data.cpp: implementation of the CData class.
//
//////////////////////////////////////////////////////////////////////

#include "Data.h"
#include "E32MATH.H"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CData::CData(TInt aW,TInt aH,TInt aNum)
{
	iW=aW;
	iH=aH;
	iNum=aNum;

	InitData();
	NewData();
	int k=0;
}

CData::~CData()
{
	for(int m=0;m<iW;m++)
	{
		delete[] iData[m];
	}
	delete[] iData;

	for(int b=0;b<iW+2;b++)
	{
		delete[] iTemp[b];
	}
	delete[] iTemp;
}

void CData::InitData()
{
	iData=new int*[iW];
	for(int m=0;m<iW;m++)
	{
		iData[m]=new int[iH];
		for(int n=0;n<iH;n++)
		{
			iData[m][n]=0;
		}
	}

	iTemp=new int*[iW+2];//先加一个边框,值全为0
	for(int a=0;a<iW+2;a++)
	{
		iTemp[a]=new int[iH+2];
		for(int b=0;b<iH+2;b++)
		{
			iTemp[a][b]=0;
		}
	}
}

void CData::NewData()
{
/*	int num=0;				//  NO.1
	int k=iW*iH/2;

	while(num<k)
	{
		int v=Math::Random()%iNum+1;

		int x=Math::Random()%iH;
		int y=Math::Random()%iW;
		while(iData[x][y])
		{
			x=Math::Random()%iH;
			y=Math::Random()%iW;
		}
		iData[x][y]=v;

		x=Math::Random()%iH;
		y=Math::Random()%iW;
		while(iData[x][y])
		{
			x=Math::Random()%iH;
			y=Math::Random()%iW;
		}
		iData[x][y]=v;

		num++;
	}*/

	for(int m=0;m<iW;m++) 	//  NO.2
	{
		for(int n=0;n<iH;n++)
		{
			if(iData[m][n])
				continue;

			int v=Math::Random()%iNum+1;
			iData[m][n]=v;

			int x=Math::Random()%iW;
			int y=Math::Random()%iH;
			while(iData[x][y])
			{
				x=Math::Random()%iW;
				y=Math::Random()%iH;
			}
			iData[x][y]=v;
		}
	}

/*  	//  NO.3  使用收集类,先全加入,选好二个就删除二个,再在剩下的中选

*/
}

/*
bool CData::UpdateGrid(TInt aOldX,TInt aOldY,TInt aX,TInt aY) // 方法一,乱!
{
	if(aOldX==aX && aOldY==aY) // 判断是否同一格
		return false;

	if(iData[aOldX][aOldY]==0 || iData[aX][aY]==0) // 判断二格是否为空
		return false;

	if(iData[aOldX][aOldY]!=iData[aX][aY]) // 判断是否相同
		return false;

	// 简单判断************************
	if(aOldX==aX)
	{
		if(aOldY==aY+1 || aOldY==aY-1) // 判断是否相邻
			return true;

		if(aX==0 || aX==iW-1) // 判断是否在边上
			return true;

		int k1= aOldY>aY ? aY:aOldY ;
		int k2= aOldY+aY-k1 ;
		for(int m=k1+1;m<k2;m++) // 判断同一条线是否中间有格
		{
			if(iData[aX][m])
				break;
			if(m==k2-1)
				return true;
		}
	}
	if(aOldY==aY)
	{
		if(aOldX==aX+1 || aOldX==aX-1) // 判断是否相邻
			return true;

		if(aY==0 || aY==iH-1) // 判断是否在边上
			return true;

		int k1= aOldX>aX ? aX:aOldX ;
		int k2= aOldX+aX-k1 ;
		for(int m=k1+1;m<k2;m++) // 判断同一条线是否中间有格
		{
			if(iData[m][aY])
				break;
			if(m==k2-1)
				return true;
		}
	}

	// 加两点判断************************ //先复制一个边框
	for(int a=1;a<iW+1;a++)
	{
		for(int b=1;b<iH+1;b++)
		{
			iTemp[a][b]=iData[a-1][b-1];
		}
	}

	int x1= aOldX>aX ? aX:aOldX ;
	int x2= aOldX+aX-x1 ;
	int y1= aOldY>aY ? aY:aOldY ;
	int y2= aOldY+aY-y1 ;
	bool b=true;  // 判断是左上(true)还是左下(false)

	if(x1==aOldX)
	{
		if(y1==aOldY)
			b=true;
		else
			b=false;
	}
	else
	{
		if(y1==aOldY)
			b=false;
		else
			b=true;
	}

	for(int m=x1;m<=x2;m++)
	{
		if(!CheckLineX(m,y1,y2))
		{
			continue;
		}
		if(b)
		{
			if(!CheckLineY(y1,x1,m))
			{
				continue;
			}
			if(CheckLineY(y2,m,x2))
			{
				return true;
			}
		}
		else
		{
			if(!CheckLineY(y1,m,x2))
			{
				continue;
			}
			if(CheckLineY(y2,x1,m))
			{
				return true;
			}
		}
	}
	for(int n=y1;n<=y2;n++)
	{
		if(!CheckLineY(n,x1,x2))
		{
			continue;
		}
		if(b)
		{
			if(!CheckLineX(x1,y1,n))
			{
				continue;
			}
			if(CheckLineX(x2,n,y2))
			{
				return true;
			}
		}
		else
		{
			if(!CheckLineX(x1,n,y2))
			{
				continue;
			}
			if(CheckLineX(x2,y1,n))
			{
				return true;
			}
		}
	}

	return false;
}

bool CData::CheckLineX(TInt x,TInt y1,TInt y2)  //用于检查两点(同X轴)间是否有格,且y2>y1
{
	if(y1==y2+1 || y1==y2-1 || y1==y2)  // 检查是否相邻
		return true;

	for(int m=y1;m<=y2;m++)
	{
		if(iTemp[x+1][m+1])
			return false;
		if(m==y2)
			return true;
	}
}

bool CData::CheckLineY(TInt y,TInt x1,TInt x2)  //用于检查两点(同Y轴)间是否有格,且x2>x1
{
	if(x1==x2+1 || x1==x2-1 || x1==x2)  // 检查是否相邻
		return true;

	for(int m=x1;m<=x2;m++)
	{
		if(iTemp[m+1][y+1])
			return false;
		if(m==x2)
			return true;
	}
}
*/

bool CData::UpdateGrid(TInt aOldX,TInt aOldY,TInt aX,TInt aY)
{
	if(aOldX==aX && aOldY==aY) // 判断是否同一格
		return false;

	if(iData[aOldX][aOldY]==0 || iData[aX][aY]==0) // 判断二格是否为空
		return false;

	if(iData[aOldX][aOldY]!=iData[aX][aY]) // 判断是否相同
		return false;

	if(aOldX==aX && (aX==0 || aX==iW-1)) // 判断是否在边框的一边
		return true;
	if(aOldY==aY && (aY==0 || aY==iH-1))
		return true;

	if(CheckLine(aOldX,aOldY,aX,aY,iData))  // 判断二格在一条线上,且线上全空
		return true;

	for(int a=1;a<iW+1;a++) // 将原图加上一个全为0的外框
	{
		for(int b=1;b<iH+1;b++)
		{
			iTemp[a][b]=iData[a-1][b-1];
		}
	}
	bool b=CheckPosition(aOldX,aOldY,aX,aY);

	int x1= aOldX<aX ? aOldX:aX ;  // 得到二个点的极值
	int x2=aOldX+aX-x1;
	int y1= aOldY<aY ? aOldY:aY ;
	int y2=aOldY+aY-y1;
	x1++;				// 将点扩一 使相对应于iTemp
	y1++;
	x2++;
	y2++;

	for(int m=0;m<iH+2;m++) // 判断 以二格间从上到下的中间同Y轴水平两点作辅助点
	{

		if(b)
		{
			if(iTemp[x1][m]!=0 && m!=y1) // 先要判断两个参照点是否为空或等于两源点
				continue;
			if(iTemp[x2][m]!=0 && m!=y2)
				continue;
			
			if(CheckLine(x1,y1,x1,m,iTemp))
				if(CheckLine(x1,m,x2,m,iTemp))
					if(CheckLine(x2,m,x2,y2,iTemp))
						return true;
		}
		else
		{
			if(iTemp[x1][m]!=0 && m!=y2) // 先要判断两个参照点是否为空或等于两源点
				continue;
			if(iTemp[x2][m]!=0 && m!=y1)
				continue;
			
			if(CheckLine(x1,y2,x1,m,iTemp))
				if(CheckLine(x1,m,x2,m,iTemp))
					if(CheckLine(x2,m,x2,y1,iTemp))
						return true;
		}
	}
	for(int n=0;n<iW+2;n++) // 判断 以二格间从左到右的中间同X轴竖直两点作辅助点
	{

		if(b)
		{
			if(iTemp[n][y1]!=0 && n!=x1) // 先要判断两个参照点是否为空或等于两源点
				continue;
			if(iTemp[n][y2]!=0 && n!=x2)
				continue;

			if(CheckLine(n,y1,x1,y1,iTemp))
				if(CheckLine(n,y1,n,y2,iTemp))
					if(CheckLine(n,y2,x2,y2,iTemp))
						return true;
		}
		else
		{
			if(iTemp[n][y1]!=0 && n!=x2) // 先要判断两个参照点是否为空或等于两源点
				continue;
			if(iTemp[n][y2]!=0 && n!=x1)
				continue;

			if(CheckLine(n,y1,x2,y1,iTemp))
				if(CheckLine(n,y1,n,y2,iTemp))
					if(CheckLine(n,y2,x1,y2,iTemp))
						return true;
		}
	}

/*
	int x1= aOldX<aX ? aOldX:aX ;  // 得到二个点的极值
	int x2=aOldX+aX-x1;
	int y1= aOldY<aY ? aOldY:aY ;
	int y2=aOldY+aY-y1;
	if(x1!=0) x1++;				// 将在边框的点扩一
	if(y1!=0) y1++;
	if(x2==iW-1) x2++;
	if(y2==iH-1) y2++;

	for(int m=0;m<=iW+1;m++)
	{
		if(b)
		{
			if(CheckLine(x1,y1,m,y1,iTemp))
				if(CheckLine(m,y1,m,y2,iTemp))
					if(CheckLine(m,y2,x2,y2,iTemp))  // ~|_
				return true;
		}
		else
		{
			if(CheckLine(x1,y2,m,y2,iTemp))
				if(CheckLine(m,y1,m,y2,iTemp))
					if(CheckLine(m,y1,x2,y1,iTemp)) // _|~
				return true;
		}
	}
	for(int n=0;n<=iH+1;n++)
	{
		if(b)
		{
			if(CheckLine(x1,y1,x1,n,iTemp))
				if(CheckLine(x1,n,x2,n,iTemp))
					if(CheckLine(x2,n,x2,y2,iTemp))  // └┐
				return true;
		}
		else
		{
			if(CheckLine(x1,n,x1,y2,iTemp))
				if(CheckLine(x1,n,x2,n,iTemp))
					if(CheckLine(x2,y1,x2,n,iTemp))  // ┌┘
				return true;
		}
	}
*/
	return false;
}

bool CData::CheckLine(TInt ax,TInt ay,TInt bx,TInt by,TInt** temp)  // 二格在一条线上的判断
{
	if(ax==bx)
	{
		if(ay==by) // 同一点
			return true;

		if(ay==by+1 || ay==by-1) // 相邻
			return true;

		int y1= ay<by? ay:by ; // 两Y中的小值
		int y2=ay+by-y1;

		for(int m=y1+1;m<y2;m++)
		{
			if(temp[ax][m])
				return false;
		}
		return true;
	}
	else if(ay==by)
	{
		if(ax==bx+1 || ax==bx-1) // 相邻
			return true;

		int x1= ax<bx? ax:bx ; // 两Y中的小值
		int x2=ax+bx-x1;

		for(int m=x1+1;m<x2;m++)
		{
			if(temp[m][ay])
				return false;
		}
		return true;
	}

	return false;
}

bool CData::CheckPosition(TInt ax,TInt ay,TInt bx,TInt by) // 判断二格方位是左上右下(true),还是左下右上(false)
{
	TReal x=(ax+bx)/2;
	TReal y=(ay+by)/2;

	if(ax>x)
	{
		if(ay>y)
			return true;
		else
			return false;
	}
	else
	{
		if(ay>y)
			return false;
		else 
			return true;
	}
}

bool CData::CheckCanDo()
{
	return true;
}

void CData::ResetData()
{
}

bool CData::CheckWin()
{
	for(int m=0;m<iW;m++)
	{
		for(int n=0;n<iH;n++)
		{
			if(iData[m][n])
				return false;
		}
	}
	return true;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -