游戏地址:
http://www.3366.com/game/76549.shtml
地图索引的生成
/***********************************
/crate map
/
/
*/
function arrInit(arr:Array):void{
for(var i:int=0;i<row*column;i++){
arr[i]=0;
}
}
function creatRandomArr(arr:Array,level:int):void {
for (var i:int = 0; i < level; i+=2){
var ran:int = 1 + Math.random() * kindNum;
arr[i]=ran;
arr[i+1]=ran;
}
arr.sort(sortRandom);
}
function sortRandom(a:int, b:int):int {
return Math.pow( -1, Math.floor(Math.random() * 2));
}
function putArray(SY:Array,arr:Array){
for(var i:int=0;i<row+2;i++){
SY[i]=new Array();
for(var j:int=0;j<column+2;j++){
SY[i][j]=0;
}
}
for(i=1;i<row+1;i++){
for(j=1;j<column+1;j++){
SY[i][j]=arr.pop();
}
}
}
function creatSY(arr:Array,level:int,SY:Array){
arrInit(arr);
creatRandomArr(arr,level);
putArray(SY,arr);
}
function creatMap(){
clearSprite(cellContainer);
var type;
for(var i:int=0;i<row+2;i++){
Map[i]=new Array();
for(var j:int=0;j<column+2;j++){
type=SY[i][j];
var map:MovieClip=new Tile();
map.setType("t"+type);
map.setXY(i,j);
map.x=startX+j*tileWidth;
map.y=startY+i*tileHeight;
Map[i][j]=map;
map.buttonMode = true;
cellContainer.addChild(map);
}
}
this.addChild(cellContainer);
}
核心算法,也即是判断两个方块是否可以消除(通路)。连连看的规则比较简单,能消掉的状况可以用枚举法,不外乎以下三种情况。
也即是
1.直线
2.一折(一个拐角)
3.二折(两个拐角)
以上三种情况每种又可分两种情况
1.直线:横方向,纵方向
2.一折:拐角在上方,拐角在下方
3.二折:两个拐角在横方向,两个拐角在纵方向
示意图:
第3种情况看似比较复杂,其实如上所述只是两种情况,两角在横方向或纵方向,只要对地图进行一次X轴方向遍历和Y方向遍历就可以了
/******************************
/core
/
/
*/
function checkSamePoint(point1:Point,point2:Point):Boolean{
if(point1.x==point2.x){
if(point1.y==point2.y){
return false;
}
}
return true;
}
function checkColumn(point1:Point,point2:Point):Boolean{
var x1,x2;
if(point1.x!=point2.x){
return false;
}
if(point1.y>point2.y){
x1=point2.y;
x2=point1.y;
}
else{
x1=point1.y;
x2=point2.y;
}
if(x2-x1==1){
return true;
}
for(var i:int=x1+1;i<x2;i++){
if(Map[point1.x][i].isAccess==false){
return false;
}
}
return true;
}
function checkRow(point1:Point,point2:Point):Boolean{
var x1,x2;
if(point1.y!=point2.y){
return false;
}
if(point1.x>point2.x){
x1=point2.x;
x2=point1.x;
}
else{
x1=point1.x;
x2=point2.x;
}
if(x2-x1==1){
return true;
}
for(var i:int=x1+1;i<x2;i++){
if(Map[i][point1.y].isAccess==false){
return false;
}
}
return true;
}
function checkFinal(point1:Point,point2:Point):Boolean{
if(checkSamePoint(point1,point2)==false){
return false;
}
if(checkColumn(point1,point2)|| checkRow(point1,point2) || checkOneBroken(point1,point2)){
return true;
}
if(checkTwoBroken(point1,point2)){
return true;
}
return false;
}
function checkOneBroken(point1:Point,point2:Point){
var pointO=new Point(),pointM=new Point(),pointT=new Point();
if(point1.y<point2.y){
pointO=point1;
pointT=point2;
}else{
pointO=point2;
pointT=point1;
}
pointM.x=pointO.x;
pointM.y=pointT.y;
if(Map[pointM.x][pointM.y].isAccess==true){
if(checkColumn(pointO,pointM)&&checkRow(pointT,pointM)){
return true;
}
}
pointM.x=pointT.x;
pointM.y=pointO.y;
if(Map[pointM.x][pointM.y].isAccess==true){
if(checkRow(pointO,pointM)&&checkColumn(pointT,pointM)){
return true;
}
}
return false;
}
function checkTwoBroken(point1:Point,point2:Point){
var pointM1=new Point(),pointM2=new Point();
pointM1.y=point1.y;
pointM2.y=point2.y;
for(var i=0;i<row+2;i++){
pointM1.x=i;
pointM2.x=i;
if(Map[i][point1.y].isAccess==true && Map[i][point2.y].isAccess==true && checkRow(point1,pointM1) && checkOneBroken(pointM1,point2) ){
return true;
}
}
pointM1.x=point1.x;
pointM2.x=point2.x;
for(i=0;i<column+2;i++){
pointM1.y=i;
pointM2.y=i;
if(Map[point1.x][i].isAccess==true && Map[point2.x][i].isAccess==true && checkColumn(point1,pointM1) && checkOneBroken(pointM1,point2) ){
return true;
}
}
return false;
}