java 实现连连看,有空做成图形界面的

来源:互联网 发布:红叶知弦 本子 编辑:程序博客网 时间:2024/05/18 00:02

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;

}

 

   elseif(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;

}

}

原创粉丝点击