• 【设为首页】
  • 【收藏闪客居】
当前位置:主页>FLASH AS 编程>AS游戏篇>文章内容
  • 对对碰设计思路与源码(as3.0)
  • 来源:conanlwl.net 作者:conanlwl 2008-06-19 【

对对碰游戏,相信大家也并陌生了.游戏规则也很简单,就是随意转换地图中的相邻的两个图案,只要转换后,能够使得某一种图形在横排或竖排相邻并且个数超过三个,即可消除这几个图形.不过今天研究的不是怎样玩游戏,而是如何来写游戏.先试玩一下就游戏先吧 点击试玩  源码下载

根据流程,我们就可以一步一步的来完成游戏的编写了.在连连看设计思路与源码那里我已经介绍了一些基本的前期工作,例如,生成地图,显示,还有地图的一些操作如洗牌等的一些讲解,所以这里就略过了介绍,主要讲一下几个主要算法.

第一个,就是遍历整个地图,寻找符合消除条件的所有方块.

由于消除条件是有横排跟竖排之分,所以我们也必须对这两种情形,进行检测.

首先判断相连的三个图形(例如第1,2,3个)是否相同,不是则右移一位再判断另三个图形(此时应是第2,.3,4个)是否相同,如果第1,2,3 个图形相同,则继续尝试判断第4个,第5个....是否也相同,直到找到不相同的为止.然后下次另找一对进行比较时就不用再从2,3,4开始了,而是从可消除的方块之后开始判断了,如前次1,2,3,4,5图形相同,则本次判断就从,6,7,8三个开始判断,再判断成功后,我们用一个数组cancelArray来存放这些可消除的方块的位置,..然后一直遍历整个地图..以下是该算法的代码:

//检测地图中的可消除元素并存于数组cancelArray里面.
        public function findCancel():Boolean{           
            var i:uint;
            var j:uint;
            var result:Boolean = false;
            cancelArray = new Array();
                   
            //先测试横行是否可以消除   
            for(i=0;i<Map.ROWS;i++){
                for(j=0;j<Map.COLS-2;j++){
                    if(mapArray[i][j]==mapArray[i][j+1] && mapArray[i][j] == mapArray[i][j+2]){                   
                        result = true;
                        cancelArray.push(i + "_" + j,i + "_" + (j+1),i + "_" + (j+2));                       
                        if(j+3<Map.COLS){
                            var k:uint=j+3;
                            while(mapArray[i][j]==mapArray[i][k]){
                                cancelArray.push(i + "_" + k);
                                if(k+1<Map.COLS){
                                    k++;
                                }
                                else{
                                    j=k;
                                    break;
                                }
                            }
                        }
                    }
                }
            }
            //再测试竖行是否可以削除
            for(i=0;i<Map.COLS;i++){
                for(j=0;j<Map.ROWS-2;j++){
                    if(mapArray[j][i] == mapArray[j+1][i] && mapArray[j][i] == mapArray[j+2][i]){
                        result=true;
                        cancelArray.push(j + "_" + i,(j+1) + "_" + i,(j+2) + "_" + i);
                        if(j+3<Map.ROWS){
                            var k:uint = j+3;
                            while(mapArray[j][i] == mapArray[k][i]){
                                cancelArray.push(k + "_" + i);
                                if(k+1 < Map.ROWS){
                                    k++;
                                }else{
                                    j=k;
                                    break;
                                }                               
                            }
                        }
                    }
                }
            }           
            distinctArray(cancelArray);   
            return result;       
        }
另外一个算法就是,检查整个地图是否有解,如无解,则必须重新洗牌,如有解则游戏继续.

那么地图要怎样才能有解呢?

 

 

 1

 

 

 

 

 

 

 

 

 

 

 2

 

 3

 

 

 1

 

 

 2

 

 

 

 

 

 

 

 3

 

 

 

 

 4

 

 

 

 

 

 

 

 5

 

 

 6

 

 

 

 4

 

 6

 

 

 

 

 

 

 

 

 

 

 5

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 1

 

 

 

 

 2

 

 3

 

 

 2

 

 

 

 3

 

 

 

 

 

 

 

 

 

 4

 

 

 

 

 

 4

 

 

 

 

 

 

 

 

 

 

 由图可以知道,只要地图中标数字的地方所在的图形只要有一个,地图就有解.以下是本算法的代码,有点长,但都有注释.

public function findRoad():Boolean{
            //有解的情况  只要任何一个数字为A便有解
            //   一                           二
            //  X  1  X      或者    X  1  X  X  2  X
            //  2  X  3                3  X  A  A  X  4
            //  X  A  X               X  5  X  X  6  X
            //  X  A  X 
            //  4  X  5
            //  X  6  X
            //
            //    三                      四
            //  X  3  X
            //  X  A  X               X  X  1  X  X
            //  1  X  2     或者   3  A  X  A  4
            //  X  A  X              X  X  2  X  X
            //  X  4  X
            var i:uint,j:uint;           
            //横向测试
            for(i=0;i<Map.ROWS;i++){
                for(j=0;j<Map.COLS-1;j++){
                    //其中有两个相连  图二
                    if(mapArray[i][j] == mapArray[i][j+1]){
                        //检测 1
                        if(i-1>=0 && j-1>=0){
                            if(mapArray[i][j] == mapArray[i-1][j-1]){
                                addHintArray(j-1,i-1,j-1,i);                               
                                return true;
                            }
                        }
                        //检测 2
                        if(i-1 >= 0 && j+2<Map.COLS){
                            if(mapArray[i][j] == mapArray[i-1][j+2]){
                                addHintArray(j+2,i-1,j+2,i);
                                return true;
                            }
                        }
                        //检测 3
                        if(j-2>=0){
                            if(mapArray[i][j] == mapArray[i][j-2]){
                                addHintArray(j-2,i,j-1,i);
                                return true;
                            }
                        }
                        //检测 4
                        if(j+3<Map.COLS){
                            if(mapArray[i][j] == mapArray[i][j+3]){
                                addHintArray(j+3,i,j+2,i);
                                return true;
                            }
                        }
                        //检测 5
                        if(i+1<Map.ROWS && j-1>=0){
                            if(mapArray[i][j] == mapArray[i+1][j-1]){
                                addHintArray(j-1,i+1,j-1,i);
                                return true;
                            }
                        }
                        //检测 6
                        if(i+1<Map.ROWS && j+2 < Map.COLS){
                            if(mapArray[i][j] == mapArray[i+1][j+2]){
                                addHintArray(j+2,i+1,j+2,i);
                                return true;
                            }
                        }
                    }
                    else{
                        //两个相隔一格 图四
                        if(j+2<Map.COLS){
                            if(mapArray[i][j] == mapArray[i][j+2]){
                                //检测1
                                if(i-1>=0){
                                    if(mapArray[i][j] == mapArray[i-1][j+1]){
                                        addHintArray(j+1,i-1,j+1,i);
                                        return true;   
                                    }
                                }
                                //检测2
                                if(i+1<Map.ROWS){
                                    if(mapArray[i][j] == mapArray[i+1][j+1]){
                                        addHintArray(j+1,i+1,j+1,i);
                                        return true;
                                    }
                                }
                                //检测3
                                if(j-1>=0){
                                    if(mapArray[i][j] == mapArray[i][j-1]){
                                        addHintArray(j+2,i,j+1,i);
                                        return true;
                                    }
                                }
                                //检测4
                                if(j+3<Map.COLS){
                                    if(mapArray[i][j] == mapArray[i][j+3]){
                                        addHintArray(j,i,j+1,i);
                                        return true;
                                    }
                                }
                            }
                        }
                    }
                }
            }               
            for(i=0;i<Map.COLS;i++){
                for(j=0;j<Map.ROWS-1;j++){
                    //如果有两个相连  图一
                    if(mapArray[j][i] == mapArray[j+1][i]){
                        //检测1
                        if(j-2>=0){
                            if(mapArray[j][i] == mapArray[j-2][i]){
                                addHintArray(i,j-2,i,j-1);
                                return true;
                            }
                        }
                        //检测2
                        if(j-1>=0  && i-1>=0){
                            if(mapArray[j][i] == mapArray[j-1][i-1]){
                                addHintArray(i-1,j-1,i,j-1);
                                return true;
                            }
                        }
                        //检测3
                        if(j-1>=0 && i+1<Map.COLS){
                            if(mapArray[j][i] == mapArray[j-1][i+1]){
                                addHintArray(i+1,j-1,i,j-1);
                                return true;
                            }
                        }
                        //检测4
                        if(j+2<Map.ROWS && i-1>=0){
                            if(mapArray[j][i] == mapArray[j+2][i-1]){
                                addHintArray(i-1,j+2,i,j+2);
                                return true;
                            }
                        }
                        //检测5
                        if(j+2<Map.ROWS && i+1 <Map.COLS){
                            if(mapArray[j][i] == <