Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1362629
  • 博文数量: 118
  • 博客积分: 3888
  • 博客等级: 中校
  • 技术积分: 2940
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-10 18:15
个人简介

一看二做三总结

文章分类

全部博文(118)

分类: C/C++

2007-03-01 17:43:46

本文乃fireaxe原创,使用GPL发布,可以自由拷贝,转载。但转载请保持文档的完整性,并注明原作者及原链接,严禁用于任何商业用途。
作者:fireaxe_hq@hotmail.com
博客:fireaxe.blog.chinaunix.net
    小时候经常玩拼图的游戏,不是现在流行的那种。一个很小的板子上有一副图片,被横三竖四的分成了小块,每个小块都可以移动,开始的时候有一个人打乱顺序,然后另一个人来把图恢复出来,下面是我用vc仿照该游戏编写的。
 
一、图片的表示方法(源码在资源中心)

    设图片被分为MN列则背景图片可以表示为矩阵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原创,使用GPL发布,可以自由拷贝,转载。但转载请保持文档的完整性,并注明原作者及原链接,严禁用于任何商业用途。
作者:fireaxe_hq@hotmail.com
博客:fireaxe.blog.chinaunix.net

阅读(3474) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~