测试截图:
实际上,这里只是试图给出判定前后点击的两个的单元格是否可以连通的一个通用算法。
连通的要求是
1、判断是否连通的始末两个单元格均不为空且值相同(即真正实现连连看的时候图片相同)
2、连通的路径上,有图片的单元格是不能通过的
3、路径不能走回头路,也就是说在路径上节点不能重复出现
4、不可以溢出图形的边缘寻找路径
下面贴出所有所有的代码,能够直接运行测试的。
如果你想试试是不是能跑,而又不想复制粘贴下面的代码,可以直接到附件里下载。
import java.util.Random;
import java.util.Stack;
/**
* 打印行的连连看模拟实现
* 用到栈的FILO特性实现。
*
* 模式实现说明:
* 1、PosType类的value属性不同的值代表不同的图片,为0时表明
* 此处的图片已经被消掉了。
* 2、在main函数中模拟的两个例子,给出的试图用"-"来图形化显示路径,
* 不过当路径纵向移动的时候"|"比较难给出,所以没有画出,不过一般
* 不影响大家形象化的观察出找出的路径。
* @author 贾懂凯
*/
public class LLKDemo {
public static void main(String args[]){
/****************************************
* Test1:自动生成节点值
* **************************************
*/
LLKDemo llkDemo=new LLKDemo();
System.out.println("********************Test1:随机生成节点数据********************");
System.out.println("初始表:");
llkDemo.initLLKTable();
String s=null;
if(!llkDemo.containPath(llkDemo.llkTalbe[3][4],llkDemo.llkTalbe[3][5])){
System.out.println("(3,4)->(3,5)没有路径可连通");
}else{
System.out.println("(3,4)->(3,5)"+"路径如图");
//遍历,画出路径
//初始化llkTable
s=null;
for(int i=0;i<llkDemo.rows;i++){
for(int j=0;j<llkDemo.cols;j++){
if(llkDemo.llkTalbe[i][j].getDi()==1){
s=" "+llkDemo.llkTalbe[i][j].getSeat().getValue()+"-";
}else if(llkDemo.llkTalbe[i][j].getDi()==3){
s="-"+llkDemo.llkTalbe[i][j].getSeat().getValue()+" ";
}else{
s=" "+llkDemo.llkTalbe[i][j].getSeat().getValue()+" ";
}
System.out.print(s);
}
System.out.println();
}
}
llkDemo=null;
System.out.println("\r\n");
/************************************
* Test2:手动配置节点值
* ***********************************
*/
llkDemo=new LLKDemo();
System.out.println("********************Test2:手动配置节点数据********************");
System.out.println("初始表:");
llkDemo.imgs=4;
llkDemo.rows=5;
llkDemo.cols=5;
int[][] datas={{1,3,2,1,2},
{2,3,0,0,1},
{3,2,0,0,0},
{2,1,0,0,2},
{1,3,3,1,2}};
int[] pos=null;
//初始化llkTable
for(int i=0;i<llkDemo.rows;i++){
for(int j=0;j<llkDemo.cols;j++){
pos=new int[2];
pos[0]=i;
pos[1]=j;
llkDemo.llkTalbe[i][j]=llkDemo.new Node();
llkDemo.llkTalbe[i][j].setSeat(llkDemo.new PosType(pos,datas[i][j]));
System.out.print(" "+llkDemo.llkTalbe[i][j].getSeat().getValue()+" ");
}
System.out.println();
}
System.out.println();
if(!llkDemo.containPath(llkDemo.llkTalbe[1][1],llkDemo.llkTalbe[4][2])){
System.out.println("(1,1)->(4,2)没有路径可连通");
}else{
System.out.println("(1,1)->(4,2)"+"路径如图");
//遍历,画出路径
//初始化llkTable
s=null;
for(int i=0;i<llkDemo.rows;i++){
for(int j=0;j<llkDemo.cols;j++){
if(llkDemo.llkTalbe[i][j].getDi()==1){
s=" "+llkDemo.llkTalbe[i][j].getSeat().getValue()+"-";
}else if(llkDemo.llkTalbe[i][j].getDi()==3){
s="-"+llkDemo.llkTalbe[i][j].getSeat().getValue()+" ";
}else{
s=" "+llkDemo.llkTalbe[i][j].getSeat().getValue()+" ";
}
System.out.print(s);
}
System.out.println();
}
}
}
//节点(即连连看中的一个单元格)的数据结构
private class Node{
private PosType seat;//坐标
private int di=0;//下一次探索的方向标记
public PosType getSeat() {
return seat;
}
public void setSeat(PosType seat) {
this.seat = seat;
}
public int getDi() {
return di;
}
public void setDi(int di) {
this.di = di;
}
public void incDi(){
this.di++;
}
}
//节点内部
private class PosType{
public PosType(int[] pos,int v){
this.pos=pos;
this.value=v;
}
private int[] pos;//表明节点索引位置(i,j)=(pos[0],pos[1])
public int[] getPos() {
return pos;
}
public void setPos(int[] pos) {
this.pos = pos;
}
public int getValue() {
return value;
}
public void setValue(int value) {
this.value = value;
}
private int value=0;
}
private int rows=8;//初始的行列数
private int cols=8;
private int imgs=2;//imgs-1为图片种类
private Node[][] llkTalbe=new Node[rows][cols];
private Stack<Node> stack=new Stack<Node>();
public void initLLKTable(){
int[] pos=null;
Random ran=new Random();
//初始化llkTable
for(int i=0;i<rows;i++){
for(int j=0;j<cols;j++){
pos=new int[2];
pos[0]=i;
pos[1]=j;
llkTalbe[i][j]=new Node();
llkTalbe[i][j].setSeat(new PosType(pos,ran.nextInt(imgs)));
System.out.print(" "+llkTalbe[i][j].getSeat().getValue()+" ");
}
System.out.println();
}
}
/**
* 判断两个结点是否有路径连通
* @param n1
* @param n2
* @return
*/
public boolean containPath(Node n1,Node n2){
this.stack=new Stack<Node>();//新的栈
if(n1.getSeat().getValue()
!= n2.getSeat().getValue()
|| (n1.getSeat().getValue()==0
&& n2.getSeat().getValue()==0)){//结点值不等,即图片不同
return false;
}
Node curNode=n1;
Node nextNode=null;
curNode.incDi();//下一个探索方向
this.stack.push(curNode);
nextNode=this.nextPos(curNode);
do{
if(nextNode!=null && (nextNode==n2 || nextNode.equals(n2))){
//到达终点
return true;
}
if(pass(nextNode)){//下一个节点可以通过
stack.push(nextNode);
curNode=nextNode;
curNode.incDi();//下一个探索方向
nextNode=this.nextPos(curNode);
}else{
if(!stack.isEmpty()){
while(curNode.getDi()==4){
stack.pop();
if(stack.isEmpty()){return false;}
curNode=stack.peek();
}
curNode.incDi();//下一个探索方向
nextNode=this.nextPos(curNode);
}
}
}while(!this.stack.isEmpty());//空说明探索结束,没有合适路径
return false;
}
private boolean pass(Node n){
if(n==null){return false;}
if(stack.contains(n)){return false;}
if(n.getSeat().getValue()!=0){return false;}
if(n.getDi()==4){return false;}
return true;
}
private Node nextPos(Node n){
int r=n.getSeat().getPos()[0];
int c=n.getSeat().getPos()[1];
if(r==0 || r>=rows-1 || c==0 || c>=cols-1){
return null;
}
switch(n.getDi()){
case 1://东方,列增1
return this.llkTalbe[r][c+1];
case 2://南方,行增1
return this.llkTalbe[r+1][c];
case 3://西方,列减1
return this.llkTalbe[r][c-1];
case 4://北方,行减1
return this.llkTalbe[r-1][c];
}
return null;
}
}
- 大小: 12.6 KB
分享到:
相关推荐
QQ连连看秒杀源码 - 易语言
以圣诞节为主题的连连看游戏Christmas--Linking-Game-master.zip
连连看游戏是一款深受各年龄段玩家喜爱的经典消除类游戏,它主要考验玩家的观察力和反应速度。本详细设计说明书将全面解析基于FLEX技术开发的连连看游戏的设计思路与实现方案,为软件开发提供详尽的指导。 1. 引言 ...
【连连看游戏可行性分析报告】 引言: 连连看游戏,作为一种经典的休闲益智游戏,深受各年龄段玩家的喜爱。本报告旨在探讨使用FLEX技术开发连连看游戏的可行性,包括技术、经济和社会三个层面的考量,旨在为项目...
连连看游戏概要设计说明书 概要设计是软件开发过程中的重要阶段,旨在解决实现游戏需求的程序模块设计问题。本文对连连看游戏的概要设计进行了详细的说明,涵盖了游戏的模块划分、模块之间的接口、信息传递和模块...
《EmotionLink工程文件-连连看-linklinklook》是由开发者Xugeer编写的休闲益智游戏,名为"连连看"。这个项目展示了编程技术在游戏开发中的应用,特别是在娱乐软件中如何实现用户交互和逻辑控制。以下是这个游戏项目...
【连连看游戏--软件需求说明书】是一份详细指导开发基于FLEX技术的连连看游戏的文档,旨在为项目团队提供明确的方向,确保游戏的开发、设计和数据结构满足预定的需求。该说明书不仅对项目的整体进度起到指导作用,还...
### 连连看游戏——BASIC4PPC源码解析 #### 游戏概述 本游戏为一款基于BASIC4PPC编写的连连看游戏,适用于掌上电脑平台。该游戏利用了BASIC4PPC的强大功能,实现了丰富的游戏功能与交互体验。 #### 开发环境介绍 -...
《水果连连看》是一款经典的休闲益智游戏,其核心玩法是通过寻找并消除两个相同图案的水果,直至清空所有方块。在这个项目中,我们分析的是它的源代码实现,这将涉及到计算机图形学、算法设计、用户界面设计等多个IT...
连连看是一款广受欢迎的休闲消除类游戏,其源码用Java实现,对于学习Java编程和游戏开发的初学者来说,是一份很好的参考资料。这个压缩包包含的文件很可能是游戏的完整代码,我们可以从中学到很多关于Java编程和游戏...
根据给定的文件信息,我们可以提炼出以下关于“基于FLEX开发的连连看游戏”的重要知识点: ### 连连看游戏概述 连连看是一种流行的益智游戏,属于图案配对类型,与“找出两幅图片中的不同”游戏相似,考验玩家的...
【标题】"改进版连连看--FLASH小游戏"揭示了这个软件是基于经典的连连看游戏进行了一定程度的创新和优化,旨在提供更为刺激的游戏体验。连连看,又称对对碰,是一款深受各年龄段玩家喜爱的休闲益智游戏,其基本玩法...
连连看游戏源码是基于Java ME(J2ME)平台开发的一款经典休闲游戏。Java ME是一种轻量级的Java应用程序接口,主要用于移动设备、嵌入式设备和智能卡等资源有限的平台。在这个源码中,我们可以深入学习到如何利用J2ME...
《Delphi编写的超级连连看助手源代码解析》 Delphi是一种基于Object Pascal语言的集成开发环境,以其高效、简洁的编程风格深受程序员喜爱。在本项目中,“超级连连看助手”是一个使用Delphi编写的工具,它能够帮助...
《连连看》是一款深受大众喜爱的经典消除类游戏,它的核心在于通过寻找并消除一对对相同的图形,直至所有可消除的图形都被消除为止。在编程领域,实现连连看算法具有一定的挑战性,涉及到图论、深度优先搜索(DFS)...
《连连看背单词-程序的完善》项目是一个利用C#编程语言实现的基于TCP/IP协议的Socket编程案例,主要用于创建一个客户端/服务器(C/S)架构的应用程序。在这个项目中,开发者可以深入学习如何利用C#进行网络通信,并...
【JavaScript连连看游戏详解】 本项目是一个基于JavaScript实现的连连看游戏,采用了QQ头像作为游戏元素,使得游戏更具趣味性。在这个项目中,我们主要会涉及到以下几个关键知识点: 1. **HTML布局**:游戏界面的...