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;
}
}
- java 实现连连看,有空做成图形界面的
- JAVA实现连连看
- java 实现 连连看的算法
- 连连看的实现
- 连连看 代码的实现
- 连连看游戏的实现
- 用java实现简单的连连看小游戏~~
- Java语言实现数字连连看源码
- j2me 实现连连看的算法
- 连连看游戏的编程实现
- 连连看算法,我的一种实现
- 控制上实现的连连看
- JAVA写的"连连看",一起学习!
- WPF实现连连看
- java连连看代码
- java连连看applet
- Java版连连看
- java连连看源代码
- X战警2
- java 单例模式简单用例
- vmware-tools重安装
- servletContext
- 抽象和封装
- java 实现连连看,有空做成图形界面的
- PHP的自动加载类的机制以及实现
- 2011最新浏览器性能评测
- UglifyJS 新一代的Javascript压缩工具
- delphi中Record 和Packed Record的区别
- windows主机的IIS连接数限制,Linux的Apache连接限制,PHP的CPU限制!
- ubuntu10.10构建内核树
- 使用批处理设置、启动和停止服务
- 一行代码完美解决fireFox,opera的页面居中对齐问题