最近做了一个连连看的游戏,虽然还不能作为产品使用,但关键算法已经成型。
算法
连连看的连接成功的方式可简单叙述为,两张相同图片在不途径其他图片的情况下,用不多于两个拐角的直线连接起来。
再简单的叙述,可表示为,两相同图片连接途中最多只有三条不会被中断的直线。
因此我们只需写好一条直线,然后是两条直线,然后是三条直线的方法。如果方法可行,就返回一个boolean类型的参数,为true即消除两相同图片,反之,不消除。
默认大家已经知道怎么用数组的方式判断行和列,以及随机出最后的模型。在此,不多做叙述。
判断图片是否相同,可在监听器中实现,也不多叙述。
直接跳到算法,如何正确的将两图片连接。
首先实现,只有一条直线的情况:
显然一条直线时,必然是同行或者同列的。
请看
public boolean zero(int width, int length, int width_1, int length_1, Graphics g, int[][] image) {
boolean j=false; //width,length指的是第一张图片的行列,width_1,length_1指的第二张图片的行列
//g用来画连接线,image为我的图片代码,0,1,2,3,4,5为不同图片,6为空图片,
//不了解的话可以看我放在末尾的我敲的图片排列代码
if(width==width_1){
if(Math.abs(length-length_1)==1){
j=true;
}
else if(Math.abs(length-length_1)>=2){
if(length<length_1){
for(int i=1;i<Math.abs(length-length_1);i++){
if(image[width][length+i]!=6){
//图片不为空,6指的是空图片,下同
j=false;
break;
}
else{
j=true;
}
}
}
else if(length>length_1){
for(int k=1;k<Math.abs(length-length_1);k++){
if(image[width][length_1+k]!=6){
j=false;
break;
}
else{
j=true;
}
}
}
}
}
if(length==length_1){
if(Math.abs(width-width_1)==1){
j=true;
}
else if(Math.abs(width-width_1)>=2){
if(width<width_1){
for(int i=1;i<Math.abs(width-width_1);i++){
if(image[width+i][length]!=6){
j=false;
break;
}
else{
j=true;
}
}
}
else if(