一看二做三总结
分类: C/C++
2007-03-01 17:43:46
设图片被分为M行N列则背景图片可以表示为矩阵A(M*N)。图片在显示窗口里显示的顺序为矩阵B(M*N),其中A矩阵存储的维背景图片的各个图块,B矩阵存储的是每个位置对应的图块。B的元素为A中的各个图块,B的行列号对应该行列号对应的B中元素在视图中的显示位置。
即:视图中(i,j)位置显示的是A(B(i,j).x, B(i,j).y)图块
二、随机分布的实现
随机分布是通过把前十五个位置通过随机插入B矩阵的方式实现的。最后一个位置(即右下角)要固定存放最后一个图块,所以不算入随机过程。
void CPintuDlg::SetMatrix(int *nMatrix)
{
srand(GetCurrentTime()); //设置随机数初始值
int i,j,k,tt;
for (i=0; i<WITHBMP/WITHBLOCK; i++)
{ for (j=0; j<LENGTHBMP/LENGTHBLOCK; j++)
{
*(nMatrix+i*(LENGTHBMP/LENGTHBLOCK)*2+j*2) = -1;
*(nMatrix+i*(LENGTHBMP/LENGTHBLOCK)*2+j*2+1) = -1;
}
} //设置矩阵的初始值为-1,以识别是否插入了值
k = 0;
for (i=0; i<WITHBMP/WITHBLOCK; i++)
{
for (j=0; j<LENGTHBMP/LENGTHBLOCK; j++)
{
if (i!=WITHBMP/WITHBLOCK-1 || j!=LENGTHBMP/LENGTHBLOCK-1)
{
tt = rand()%99;
while (tt != 0)
{
while (*(nMatrix+k*2) != -1)
{
k++;
if (k >= (WITHBMP/WITHBLOCK)*(LENGTHBMP/LENGTHBLOCK)-1)
{
k=0;
} //判断是否到了矩阵尾部
} //寻找下一个未插值的位置
k++;
if (k >= (WITHBMP/WITHBLOCK)*(LENGTHBMP/LENGTHBLOCK)-1)
{
k=0;
}
tt--; //没找到一个未插值的位置则tt自减一
}
while (*(nMatrix+k*2) != -1)
{
k++;
if (k >= (WITHBMP/WITHBLOCK)*(LENGTHBMP/LENGTHBLOCK)-1)
{
k=0;
}
}
*(nMatrix+k*2) = i;
*(nMatrix+k*2+1) = j; //存储插入的位置
}
}
} //随机插值过程
}
三、移动图片时数据结构的组织方式
初始化完成变的时候,左下角的位置空缺,这样也只有左下角的图块相邻的图块是可以移动的。把这个空缺的位置记为P(x,y)。每次移动图块后,就把新的空缺位置存入P。
四、游戏结束的判定
当B矩阵的元素与该元素的位置都一致时,游戏结束。
即:B(i,j).x=i; B(i,j).y=j
作者:fireaxe_hq@hotmail.com