面
其代码如下:
void CLinkToLinkDlg::StartNewGame()
{
//初始化地图,将地图中所有方块区域位置置为空方块状态
for(int iNum=0;iNum<(m_nCol*m_nRow);iNum++)
{
m_map[iNum] = BLANK_STATE;
}
//部下随机种子
srand(time(NULL));
//生成随机地图
//将所有匹配成对的动物物种放进一个临时的地图中
CDWordArray tmpMap;
for(int i=0;i<(m_nCol*m_nRow)/6;i++)
for(int j=0;j<6;j++)
tmpMap.Add(i);
//每次从上面的临时地图中取走(获取后并在临时地图删除)
//一个动物放到地图的空方块上
for(i=0;i
{
//随机挑选一个位置
int nIndex=(int(rand()*0.1+rand()*0.01+rand()))%tmpMap.GetSize();
//获取该选定物件放到地图的空方块
m_map[i]=tmpMap.GetAt(nIndex);
//在临时地图除去该动物
tmpMap.RemoveAt(nIndex);
}
//更新显示
Invalidate(TRUE);
}
在游戏进行初始化的过程中
应该先对整个地图中的各个区域做必要的初始化操作
将它们的状态设置为BLANK_START空白方块状态(无动物图案方块)
关于BLANK_START空白方块状态的定义跟其他动物方块的物种定义表达类似
也是用整数ID来对它进行标识不过不同的是
由于他代表该方块区域无图案所以这里用-1的宏值来表示
具体定义如下:
#define BLANK_STATE -1 //空方块(没有任何动物)
可以看到
对图案方块的布局先用srand()函数对时间函数布下随机种子
然后调用rand()函数对具体的图案方块的种类进行随机的获取。
在这里需要引入一个临时地图tmpMap,该临时地图的大小与内核数据地图的大小一致,
并且先添置好4组完全一样的图案类型ID数据(0~(m_nCol*m_nRow)/4)
然后再将已经安放在tmpMap中的图案作随机抽取
并放到内核地图数据中去将取出的元素从tmpMap中除去。
4.3图案方块的连接判断
对于选中的两个方块的销毁,
他们必须符合下面3个条件:
(1)选中的两个方块图案相同。
(2)选中的两个方块之间没有障碍物阻碍的情况下,
可以用若干个垂直的直线线段连接起来。
(3)这些将它们连接起来的直线线段的折点不超过两个(连接线由x轴和轴的平行线组成)。
现在针对(2)和(3)进行分析,如图4-3。
图4-2所示可知道,
同种物件的连接方式大致可以分成以下3种:
(1)直接方式。
(2)有一个折点的垂直线段连接。
(3)有两个折点的垂直线段连接.。
①直接连接方式
在直接连接方式中,
必须要求所选定的两个方块在同一水平直线上(可以为x方向或y方向)
并且两个方块之间没有任何其他图案方块。
②一个这点连接方式
所选定的两个方块如果通过折点的方式连接,
那么对于折点来说每个折点必定有且至少有一个坐标(x或y)是和其中一个目标点相同的
即折点必定在两个目标点所在的x方向或y方向的直线上。
此外,对于一个折点连接的情况,折点应该为第一个选中方块的横向线或纵向线与第二个选中方块的纵向线和横向线相交而得出。
③两个折点的连接方式
这种方式的两个折点所连成的直线与两物件的直接连线可以构成平行线,
因此可以根据这个规律将这条水平线在游戏区域允许的条件上下移动
然后通过判断整条带垂直折线点的曲线之间有无障碍物方式来确定是否可以连同。
这种情况可以分为两种情况:
(1)选中的两图案方块在同一直线,
两折点间的直连线可在其这两个方块之间的空间位置作移动
其约束是不超过游戏边界区域。
(2)选中的两图案方块不在同一直线,两折点间的直连线可在两个方块之间的空间位置作移动,
其约束是两方块之间的区域。
经过上面详细的分析后,可以对选定的两方块是否可以作抵消操作可以这样设计下去。
首先,对简单的直接连情况进行判断,看其是否符合条件,
假如不能再加深一个级别的复杂度对一个折点的情况进行判断
依次类推如下图4-2所示。
图4-2连线规则图
图4-3 连线流程图
根据如图4-3所示的流程图,
可以对选定的两个方块(分别在(x1y1)以及(x2
y2)两个区域位置其中xy分别代表行与列的概念)是否可以抵消作以下实现。
把该功能封装在IsLink()函数里面,
其代码如下所示:
// 判断选中的两个方块是否可以消除
BOOL CLinkToLinkDlg::IsLink(int x1, int y1, int x2, int y2)
{
//X直连方式
if(x1==x2)
{
if(X1_Link_X2(x1,y1,y2))
return TRUE;
}
//Y直连方式
else if(y1==y2)
{
if(Y1_Link_Y2(x1,x2,y1))
return TRUE;
}
//一个转弯直角的联通方式
if(OneCornerLink(x1,y1,x2,y2))
{
return TRUE;
}
//两个转弯直角的联通方式
else if(TwoCornerLink(x1,y1,x2,y2))
{
return TRUE;
}
return FALSE;
}
在上面的实现中,
先是对直连方式中的x方向直连Y1_Link_Y2()以及y方向直连X1_Link_X2()这两种情况进行判断
如果尚未取得结果再通过调用OneCornerLink()函数对一个折点的情况进行判断
或者更糟糕的时候调用TwoCornerLink()函数对两个这点的情况进行判断
然后得出最终结果。
下面将对上面涉及到的子功能模块进行实现,
代码如下所示:
//X直接连通
BOOL CLinkToLinkDlg::X1_Link_X2(int x, int y1,int y2)
{
//保证y1的值小于y2
if(y1>y2)
{
//数据交换
int n=y1;
y1=y2;
y2=n;
}
//直通
for(int i=y1+1;i<=y2;i++)
{
if(i==y2)
return TRUE;
if(m_map[i*m_nCol+x]!=BLANK_STATE)
break;
}
//左通
if(XThrough(x-1,y1,FALSE)&&XThrough(x-1,y2,FALSE))
return TRUE;
//右通
if(XThrough(x+1,y1,TRUE)&&XThrough(x+1,y2,TRUE))
return TRUE;
return FALSE;
}
//Y直接连通
BOOL CLinkToLinkDlg::Y1_Link_Y2(int x1,int x2,int y)
{
if(x1>x2)
{
int x=x1;
x1=x2;
x2=x;
}
//直通
for(int i=x1+1;i<=x2;i++)
{
if(i==x2)
return TRUE;
if(m_map[y*m_nCol+i]!=BLANK_STATE)
break;
}
//上通
if(YThrough(x1,y-1,FALSE)&&YThrough(x2,y-1,FALSE))
return TRUE;
//下通
if(YThrough(x1,y+1,TRUE)&&YThrough(x2,y+1,TRUE))
return TRUE;
return FALSE;
}
// 是否同一直线通
//
BOOL CLinkToLinkDlg::LineX(int x,int y1,int y2)
{
if(y1>y2)
{
int y=y1;
y1=y2;
y2=y;
}
for(int y=y1;y<=y2;y++)
{
if(m_map[y*m_nCol+x]!=BLANK_STATE)
return FALSE;
if(y==y2)
return TRUE;
}
return FALSE;
}
//
// 是否同一直线通
//
BOOL CLinkToLinkDlg::LineY(int x1,int x2,int y)
{
if(x1>x2)
{
int x=x1;
x1=x2;
x2=x;
}
for(int x=x1;x<=x2;x++)
{
if(m_map[y*m_nCol+x]!=BLANK_STATE)
return FALSE;
if(x==x2)
return TRUE;
}
return FALSE;
}
// ○1直角接口连通
BOOL CLinkToLinkDlg::OneCornerLink(int x1, int y1,int x2, int y2)
{
if(x1>x2)
{
int n=x1;
x1=x2;
x2=n;
n=y1;
y1=y2;
y2=n;
}
if(y2 {
if(LineY(x1+1,x2,y1)&&LineX(x2,y1,y2+1))
return TRUE;
if(LineY(x2-1,x1,y2)&&LineX(x1,y2,y1-1))
return TRUE;
return FALSE;
}
else
{
if(LineY(x1+1,x2,y1)&&LineX(x2,y1,y2-1))
return TRUE;
if(LineY(x2-1,x1,y2)&&LineX(x1,y2,y1+1))
return TRUE;
return FALSE;
}
return FALSE;
}
// ○2直角接口连通
BOOL CLinkToLinkDlg::TwoCornerLink(int x1, int y1, int x2, int y2)
{
if(x1>x2)
{
int n=x1;
x1=x2;
x2=n;
n=y1;
y1=y2;
y2=n;
}
//右通
if(XThrough(x1+1,y1,TRUE)&&XThrough(x2+1,y2,TRUE))
return TRUE;
//左通
if(XThrough(x1-1,y1,FALSE)&&XThrough(x2-1,y2,FALSE))
return TRUE;
//上通
if(YThrough(x1,y1-1,FALSE)&&YThrough(x2,y2-1,FALSE))
return TRUE;
//下通
if(YThrough(x1,y1+1,TRUE)&&YThrough(x2,y2+1,TRUE))
return TRUE;
//右
for(int x=x1+1;x {
if(m_map[y1*m_nCol+x]>-1)
break;
if(OneCornerLink(x,y1,x2,y2))
return TRUE;
}
//左
for(x=
上一篇:VC设计简单的聊天室毕业论文设计
下一篇:近三年来思想工作小结(德能勤绩廉)