小游戏系列算法之三连连看算法及原理

游戏地址:

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;
	
}


 

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值