import java.util.Scanner;
import java.util.Random;
class Contact
{
static int size=4;
static Random rd=new Random();
private static int[] matrix=new int[size*size];//矩阵
int[] sides=new int[(size+2)*(size+2)];//定义一个大矩阵
public static void main(String[] args)
{
initialize();//初始化矩阵
show();//显示矩阵
int leave=0;//矩阵中剩余没消除的个数
while(leave<size*size)
{
System.out.println("请输入您认为可消除的两个坐标:");
int x1,x2,y1,y2;
x1=new Scanner(System.in).nextInt();
y1=new Scanner(System.in).nextInt();
x2=new Scanner(System.in).nextInt();
y2=new Scanner(System.in).nextInt();
if((x1<size&&x2<size&&y1<size&&y2<size)&&(matrix[y1*size+x1]==matrix[y2*size+x2]))
{
if((matrix[y2*size+x2]!=0)&&(canConnection(x1,y1,x2,y2)))//判断是否能连接
{
matrix[y1*size+x1]=0;
matrix[y2*size+x2]=0;
leave+=2;
}
else
{
System.out.println("傻孩子,这怎么能连线呢?");
}
}
else
{
System.out.println("****您输入的坐标超出了范围或您指定的2张图片不是同一类型*****");
}
show();//显示
}
System.out.println("娃子,不错!");
}
//初始化矩阵(产生矩阵内容并打乱顺序)
public static void initialize()
{
for(int i=0;i<size*size;i++)
{
matrix[i]=i/2+1;
}
int temp;
for(int i=0;i<size*size/2;i++)
{
int a=rd.nextInt(size*size);
int b=rd.nextInt(size*size);
temp=matrix[a];
matrix[a]=matrix[b];
matrix[b]=temp;
}
}
public static void show()
{
System.out.println("———————————————————————————");
for(int i=0;i<size*size;i++)
{
if(matrix[i]!=0)
{
System.out.print("| "+matrix[i]+" ");
}
else
System.out.print("| "+" ");
if((i+1)%size==0)
System.out.println("|/n———————————————————————————");
}
}
//检验用户输入的2个点是否能消除
public static boolean canConnection(int x1,int y1,int x2,int y2)
{
if(x1==x2&&y1==y2)
{
System.out.println("*****您输入的两个坐标是同一个图像*****");
return false;//两次输入都是同一个点
}
if(canConnection0(x1,y1,x2,y2))//能直接消除的,返回真
{
return true;
}
else if(canConnection1(x1,y1,x2,y2))//能转一个弯消除的
{
return true;
}
else if(canConnection2(x1,y1,x2,y2))//能转2个弯消除的
{
return true;
}
return false;
}
//检验用户输入的2个点是否能不转弯的情况下消除
public static boolean canConnection0(int x1,int y1,int x2,int y2)
{
int temp;
int sum=100;
if(y1==y2)
{
sum=0;
if(x1>x2)
{
temp=x1;x1=x2;x2=temp;
}
for(int x=x1+1;x<x2;x++)
{
sum+=matrix[y1*size+x];
}
}
if(x1==x2)
{
sum=0;
if(y1>y2)
{
temp=y1;y1=y2;y2=temp;
}
for(int y=y1+1;y<y2;y++)
{
sum+=matrix[y*size+x1];
}
}
if(sum!=0)
return false;
else
return true;
}
//重载转0次弯是否可消除(转2次弯专用)
public static boolean canConnection0(int x1,int y1,int x2,int y2,int no)
{
int temp;
int sum=100;
if(y1==y2)
{
sum=0;
if(x1>x2)
{
temp=x1;x1=x2;x2=temp;
}
for(int x=x1+1;x<x2;x++)
{
sum+=sides[y1*size+x];
}
}
if(x1==x2)
{
sum=0;
if(y1>y2)
{
temp=y1;y1=y2;y2=temp;
}
for(int y=y1+1;y<y2;y++)
{
sum+=sides[y*size+x1];
}
}
if(sum!=0)
return false;
else
return true;
}
//检验用户输入的2个点在转1个弯的情况下是否能消除
public static boolean canConnection1(int x1,int y1,int x2,int y2)
{
if(canConnection0(x1,y1,x2,y1)&&canConnection0(x2,y1,x2,y2)&&(matrix[y1*size+x2]==0))
{
return true;
}
if(canConnection0(x1,y1,x1,y2)&&canConnection0(x1,y2,x2,y2)&&(matrix[y2*size+x1]==0))
{
return true;
}
return false;
}
public static boolean input()//将小数组放进大数组
{
for(int i=0;i<(size+2)*(size+2);i++)//实例化大数组
{
matrix[i]=0;
}
int start=(size+2)+1;//小数组第一个数对应于大数组的第一个位置
for(int i=0;i<size*size;i++)//将小数组中的值填充到大数组里,外层留0
{
sides[start]=matrix[i];
start++;
}
}
//检验用户输入的2个点在转2个弯的情况下是否能消除
public static boolean canConnection2(int x1,int y1,int x2,int y2)
{
input();//把小数组放进大数组
//将小数组的坐标转换成对应于在大数组中的坐标
x1+=1;
y1+=1;
x2+=1;
y2+=1;
//
int temp;//中间变量
if(x1==x2)//两张图片在垂直方向的直线上
{
for(int x=x1-1;x>=0;x--)
{
if(canConnection0(x1,y1,x,y1,0)&&canConnection0(x,y1,x,y2,0)&&canConnection0(x,y2,x2,y2,0))
return true;
}
for(int x=x1+1;x<size;x++)
{
if(canConnection0(x1,y1,x,y1,0)&&canConnection0(x,y1,x,y2,0)&&canConnection0(x,y2,x2,y2,0))
return true;
}
}
else if(y1==y2)//两张图片在水平方向的直线上
{
for(int y=y1-1;y>=0;y--)
{
if(canConnection0(x1,y,x1,y1,0)&&canConnection0(x1,y,x2,y,0)&&canConnection0(x2,y,x2,y2,0))
return true;
}
for(int y=y1+1;y<size;y++)
{
if(canConnection0(x1,y,x1,y1,0)&&canConnection0(x1,y,x2,y,0)&&canConnection0(x2,y,x2,y2,0))
return true;
}
}
else if((x1<x2&&y1>y2)||(x1>x2&&y1<y2))//两点呈左下——右上的关系
{
if(x1<x2)
{//交换,确保点1在右上角
temp=x1;
x1=x2;
x2=temp;
temp=y1;
y1=y2;
y2=temp;
}
for(int x=x1-1;x>x2;x--)
{
if(canConnection0(x1,y1,x,y1,0)&&(sides[y1*(size+2)+x]==0)&&canConnection0(x,y1,x,y2,0)&&(sides[y2*(size+2)+x]==0)&&canConnection0(x,y2,x2,y2,0))
return true;
}
for(int y=y1+1;y<y2;y++)
{
if(canConnection0(x1,y1,x1,y,0)&&(sides[y*(size+2)+x1]==0)&&canConnection0(x1,y,x2,y,0)&&(sides[y*(size+2)+x2]==0)&&canConnection0(x2,y,x2,y2,0))
return true;
}
}
else if((x1>x2&&y1>y2)||(x1<x2&&y1<y2))//两点呈左上——右下的关系
{
if(x1>x2)
{//交换,确保点1在左上角
temp=x1;
x1=x2;
x2=temp;
temp=y1;
y1=y2;
y2=temp;
}
for(int x=x1+1;x<=x2;x++)
{
if(canConnection0(x1,y1,x,y1,0)&&(matrix[y1*(size+2)+x]==0)&&canConnection0(x,y1,x,y2,0)&&(sides[y2*(size+2)+x]==0)&&canConnection0(x,y2,x2,y2,0))
return true;
}
for(int y=y1+1;y<=y2;y++)
{
if(canConnection0(x1,y1,x1,y,0)&&(sides[y*(size+2)+x1]==0)&&canConnection0(x1,y,x2,y,0)&&(sides[y*(size+2)+x2]==0)&&canConnection0(x2,y,x2,y2,0))
return true;
}
}
return false;
}
}