📄 data.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 + -