Java下连连看算法

合集下载

基于Java的“连连看”游戏

基于Java的“连连看”游戏

功 能 区面 板
游 戏 区面 板
4 . 2 菜 单
菜 单 的 功 能 均没 有 实 现 .读 者 可 以 自行 添 加 :
J B u t t o n [ ] [ J J L a b e I
J L a b e l
Ti me r
d o t s t i m e s t r
J Bu t t o n
s t a r t
开 始 按 钮
J Me n u me n u G a me=n e w J Me n u ( ” 游戏“ ) : J Me n u me n u Se t= n e w J Me n u ( ” 设置“ ) :
J Me n u me n u H e l p= n e w J Me n u ( “ 帮助” ) :
t h i s . s e t S i z e ( 7 8 0 , 5 0 0 ) ;
t h i s . s e t T i t l e ( “ 连连看游戏” ) :
t h i s . S e t D e f a u l t C I o s e Op e r a t i o n ( J F r a me . E X I L ON — C L OS E ) : a d d my Me n u 0 ; / / 添 加 菜 单 a d d F u n c t i o n P a n e I ( ) : ∥添 力 口 功台 E 区
表 2 L i n k Ga me类 中的 方 法
方 法 名 方 法 功 能
I ma g e l c o n ( “ i ma g e / 2 . g i f “ ) ) ) : me n u He l p . a d d S e p a r a t o r ( ) :

连连看思路算法及实现

连连看思路算法及实现

连连看思路算法及实现1. 任务概述连连看是一款益智类图标消除游戏,玩家需要通过消除相同的图标来获得分数。

该游戏的思路算法主要包括图标布局、路径查找和消除逻辑。

本文将详细介绍连连看游戏的思路算法及其实现。

2. 游戏规则在连连看游戏中,通常会给出一个NxM的矩阵,矩阵中填充了各种不同类型的图标。

玩家需要通过点击两个相同的图标,使它们之间的路径最多只有两个直角转弯,从而消除这两个图标。

被消除的图标将被移除,并且上方的图标将下落填充空缺。

玩家的目标是在限定时间内消除尽可能多的图标,获得尽可能高的分数。

3. 思路算法及实现3.1 图标布局图标布局是连连看游戏的一个重要部分。

在游戏开始前,需要生成一个随机的NxM矩阵,并在每个格子中填充一个随机的图标。

为了保证游戏的可玩性,生成的矩阵需要满足以下条件: - 每个图标在矩阵中至少出现两次,确保存在与之相匹配的图标。

- 任意两个相同图标之间的路径不超过两个直角转弯,确保图标可以被消除。

其实现思路如下: 1. 随机生成NxM矩阵,并初始化为空。

2. 随机选择一个图标,将其填充到矩阵中某个随机的空格子。

3. 将该图标在矩阵中的位置存储到一个列表中。

4. 重复2-3步骤,直到每个图标至少在矩阵中出现两次。

5. 遍历矩阵,对于每一个空格子,随机选择一个已填充的图标填充进去,确保每个图标的数量相等。

6. 返回生成的矩阵。

3.2 路径查找路径查找是连连看游戏的关键算法之一。

在玩家点击两个图标后,需要通过路径查找算法判断这两个图标之间是否存在符合条件的路径。

一种常用的路径查找算法是深度优先搜索(DFS)算法。

其实现思路如下: 1. 从起点图标开始,将其标记为已访问。

2. 对于当前图标的每个相邻图标,判断是否满足消除条件(路径最多只有两个直角转弯)。

3. 如果相邻图标满足消除条件且没有被访问过,则递归调用步骤2。

4. 如果找到了与目标图标相匹配的路径,则返回True,否则返回False。

连连看原理

连连看原理

用 JAVA 开发游戏连连看其实不管是做软件也好,做游戏也好,只要是写程序,在动手之前是一定会存在需求和分析的,如果不经过一定的分析就开始动手写程序,那么,这个程序一定会很难写下去的,最后的结果可能会导致放弃。

那么,在我们动手之前,让我们先简单的分析一下吧。

由于“连连看”并不是一个我们凭空开发的游戏,并且网上也已经有很多别人已经开发好的版本,因此,对于我们来说,我们已经拥有了一个很好的原型(比如说 QQ 游戏中的“连连看”),分析起来也应该是轻松得多。

由于 QQ 中的“连连看”是网络版,为了开发上的简便,我们先放弃网络功能,做一个简单的单机版就行了。

现在,让我们现在来看一看 QQ 中的连连看吧。

“连连看”的游戏规则其实并不复杂,首先,游戏开始的时候,地图上会有由数张不同的图片随机分散在地图上(并且每张图片会出现偶数次,通常是 4 次),只需要在地图上找出两张相同的图片(点),并且这两个点之前可以用不超过 3 条的直线连接起来就可以消除这两点,如此下去,直到地图上的点全部消除完就算游戏结束,怎么样,规则很简单吧?:)我们的开发就完全按照些规则来吧。

分析游戏规则找出算法通过上面的分析,我们已经知道了游戏规则,可是,我们怎么样去实现呢?其实所谓的实现也就是算法,那我们怎么样找出算法呢?别急,让我们来看一看上图,或者自己动手玩一玩别人做好的。

通过对上图的观察,我们发现,可以将游戏中的地图看作是一个二维数组,其中的所有图片(以下称“点”)可以看作是数组中的一个具体的元素。

那么,游戏中相同的图片可以看作是数组中不同位置两个值相同的元素。

至于直线,让我们给组数中的每一个元素赋一个特殊的值如 0 ,以表示地图上空白的位置。

并且同时规定:当连续的具有该特殊值的点的横向索引或纵向索引相同时,可以认为这是一条直线,比如下图:当数组中两点的值相同并且两点间只需要不超过 3 根直线能连接起来的时候,就让这两点的值变为 0 ,如果数组中全是 0 值的点,就认为游戏已经结束:)怎么样,算法够简单了吧:)用伪代码来描述程序的结构现在,我们用伪代码来描述一下游戏,假设用户开始了游戏:消除两点;上次选择的点 = null ;if ( 地图上已没有可消除的点 ) { 游戏结束;}}else {上次选择的点 = 当前点;}}else {上次选择的点 = 当前点;}}游戏结束;看看有没有什么问题?如果没有问题,我们进入下一步吧:)确定程序需要的模块当伪代码完成后,并且在我们的大脑里转了几圈发现没有问题后,现在就可以开始进行模块的划分工作了。

连连看源代码

连连看源代码

摘要:近年来,Java作为一种新的编程语言,以其简单性、可移植性和平台无关性等优点,得到了广泛地应用,特别是Java与万维网的完美结合,使其成为网络编程和嵌入式编程领域的首选编程语言。

Java语言的学习热潮并没有因为时间的推移而消退,相反,由于计算机技术的发展所带来的新应用的出现,Java越来越流行,这种情况是以往程序设计语言在其生存周期内所不多见的。

Java语言之所以这样长盛不衰,一是因为其众多的技术特点与现今的应用十分合拍,可以覆盖大部分的需求;二是因为SUN公司不断推出新的版本,完善Java自身的功能。

有了这两点,Java语言成为程序员首选的程序设计开发工具就在情理之中了.连连看来源于街机游戏《四川麻将》和《中国龙》,是给一堆图案中的相同图案进行配对的简单游戏,在2003年,一个叫做朱俊的网友将这种形式搬到了PC上,立刻成为办公一族的新宠,并迅速传遍了世界各地。

饱受工作压力的人们没有太多的时间进行复杂的游戏,而对于这种动动鼠标就能过关的游戏情有独钟。

之后村子的连连看风靡版,阿达的连连看奥运版,连连看反恐版,还有敏敏连连看,水晶连连看等遍地开花,造就了一个连连看的新世界。

连连看游戏有多种地图样式和道具系统、大大加强了游戏的可玩性,是一款老少皆宜的休闲佳品。

关键字:发展,java,连连看,程序设计;1.课程设计介绍课题设计的目的:1) 进一步加深对Java语言的理解和掌握;将所学的JAVA知识运用于实践中。

2) 课程设计将理论与实践相结合,提供了一个既动手又动脑,独立实践的机会,锻炼我们的分析解决;实际问题的能力,提高学生适应实际,实践编程的能力。

3)熟练掌握JAVA语言中图形用户界面程序的编写;4)大体了解怎样用JAVA来编写小游戏的,增强我们实践能力和创新精神的综合培养。

课程设计的要求:由于Java语言是当今流行的网络编程语言,它具有面向对象、跨平台、分布应用等特点。

面向对象的开发方法是当今世界最流行的开发方法,它不仅具有更贴近自然的语义,而且有利于软件的维护和继承学会java程序开发的环境搭建与配置,并在实际运用中学习和掌握Java程序开发的全过程。

java蔬菜连连看游戏程序设计组

java蔬菜连连看游戏程序设计组

《面向对象的程序设计》课程设计1、题目:蔬菜连连看游戏程序设计2、实验目的:通过在指定的窗口界面完成“连连看”小游戏程序的编写和调试加深对面向对象程序设计的理解3、主要功能:相同图片相邻或连成一条直线可消除,相同图片之间只转一个或两个弯也可消除4、平台:在Windows 7下使用MyEclipse 开发5、设计参数:A.该程序界面为方格类型,由纵10横10的直线交叉组成,分别是8行8列方块拼接,共64格小方块。

方块上随即分布一些数字,数字的要求是至两两相同,位置随机打乱。

B.游戏规则是将相同数字的方块连接,若连接一对成功就消失于界面,继续游戏,知道游戏结束。

C.游戏设有时间要求,时间到,游戏结束。

D.游戏可以选择难度,分别为简单,中等,较难、超难。

E.游戏有记录得分和关卡。

F.6、设计组:7、完成情况:a.本程序源代码保存形式为lianliankan.java,在MyEclipse工具下开发。

b.本程序由两个类构成,分别是class lianliankan 和 class lianliankanJPanel,其中class lianliankanJPanel是内部类。

c.本程序由画画函数 painComponent()、重载函数chongzai()、重新开始游戏newGame()、所有方块清除,进入下一关guoguan()、新建地图newMap()、判断是否在一条直线上linecheck()、判断能否折角相连zhejiaocheck()、判断能否两次折角相连liangcizejiaocheck()、能否在两次折角内连接ifcanTouch()、清除两个一样的符合条件的方块clearBlock()、选择难度itemStateChanged()、主函数main()、画画函数paintCompinent()等十三个函数组成。

8、工作评价:9、其他说明:附上代码:package lianliankan;import java.awt.*;// java.awt包,即java抽象窗口工具包,提供如Button(按钮)、TextField(文本框)和List(列表) import javax.swing.*;//javax.swing是图形可视包,导入进行图形化软件的开发import java.awt.event.*;public class lianliankan extends JFrame{private static final long serialVersionUID = 1L;public lianliankan(){lianliankanJPanel llk=new lianliankanJPanel();//是个容器,可以把JButton,JTextArea,JTextFiled等加入add(llk);}class lianliankanJPanel extends JPanel implements ActionListener,ItemListener{private static final long serialVersionUID = 1L;private int[][] map=new int[10][10];private int kinds,randomx,randomy,randomx1,randomy1;private int coordinatex,coordinatey,coordinatex1,coordinatey1;private Point lineStart=new Point(0,0);private int clicktimes;private int jishushengyu;private int fruitKinds=4;private int score;private int guanshu;loudou ld=new loudou();JButton BlockButton[][]=new JButton[10][10];Choice difficultChoice = new Choice();JButton newgameButton=new JButton("开始");JButton reLoad=new JButton("刷新");ImageIcon aIcon = new ImageIcon("image/sucai1.jpg");ImageIcon bIcon = new ImageIcon("image/sucai2.jpg");ImageIcon cIcon = new ImageIcon("image/sucai3.jpg");ImageIcon dIcon = new ImageIcon("image/sucai4.jpg");ImageIcon eIcon = new ImageIcon("image/sucai5.jpg");ImageIcon fIcon = new ImageIcon("image/sucai6.jpg");ImageIcon gIcon = new ImageIcon("image/sucai7.jpg");ImageIcon hIcon = new ImageIcon("image/sucai8.jpg");ImageIcon iIcon = new ImageIcon("image/sucai9.jpg");ImageIcon jIcon = new ImageIcon("image/sucai10.jpg");ImageIcon k1Icon = new ImageIcon("image/sucai11.jpg");ImageIcon lIcon = new ImageIcon("image/sucai12.jpg");ImageIcon mIcon = new ImageIcon("image/sucai13.jpg");ImageIcon nIcon = new ImageIcon("image/sucai14.jpg");ImageIcon oIcon = new ImageIcon("image/sucai15.jpg");ImageIcon kIcon = new ImageIcon("image/kongbai.jpg");public lianliankanJPanel(){this.setLayout(null);newMap();for(int i=0;i<10;i++){for(int j=0;j<10;j++){BlockButton[i][j]=new JButton();add(BlockButton[i][j]);BlockButton[i][j].addActionListener(this);BlockButton[i][j].setBounds(j*40, i*40, 40, 40);}}difficultChoice.add("简单");difficultChoice.add("中等");difficultChoice.add("较难");difficultChoice.add("超难");newgameButton.setBounds(map[0].length*40+30, 20, 60, 20);reLoad.setBounds(map[0].length*40+30, 60, 60, 20);difficultChoice.setBounds(map[0].length*40+30, 100, 60, 20);difficultChoice.addItemListener(this);newgameButton.addActionListener(this);reLoad.addActionListener(this);ld.setBounds(map[0].length*40+30, 240, 70, 160);this.add(ld);this.add(newgameButton);this.add(reLoad);this.add(difficultChoice);}public void paintComponent(Graphics g) //画画函数{super.paintComponent(g);g.drawString("得分: "+score, 430, 160);g.drawString("第 "+(guanshu+1)+" 关", 430, 200);for(int i=0;i<10;i++){for(int j=0;j<10;j++){switch (map[i][j]){case 0:BlockButton[i][j].setIcon(kIcon);break;case 1:BlockButton[i][j].setIcon(aIcon);break;case 2:BlockButton[i][j].setIcon(bIcon);break;case 3:BlockButton[i][j].setIcon(cIcon);break;case 4:BlockButton[i][j].setIcon(dIcon);break;case 5:BlockButton[i][j].setIcon(eIcon);break;case 6:BlockButton[i][j].setIcon(fIcon);break;case 7:BlockButton[i][j].setIcon(gIcon);break;case 8:BlockButton[i][j].setIcon(hIcon);break;case 9:BlockButton[i][j].setIcon(iIcon);break;case 10:BlockButton[i][j].setIcon(jIcon);break;case 11:BlockButton[i][j].setIcon(k1Icon);break;case 12:BlockButton[i][j].setIcon(lIcon);break;case 13:BlockButton[i][j].setIcon(mIcon);break;case 14:BlockButton[i][j].setIcon(nIcon);break;case 15:BlockButton[i][j].setIcon(oIcon);break;default:break;}}}}public void chongzai() //重载函数{jishushengyu=0;for(int i=1;i<9;i++){for(int j=1;j<9;j++){if(map[i][j]>0){jishushengyu++;}}}int[][] map1=new int[10][10];this.map=map1;for(int i=0;i<jishushengyu/2;i++){kinds=(int)(Math.random()*1000)%fruitKinds+1;do {randomx1=(int)(Math.random()*1000)%8+1;randomy1=(int)(Math.random()*1000)%8+1;} while (map[randomy1][randomx1]>0);map[randomy1][randomx1]=kinds;do {randomx=(int)(Math.random()*1000)%8+1;randomy=(int)(Math.random()*1000)%8+1;} while (map[randomy][randomx]>0);map[randomy][randomx]=kinds;}repaint();}public void newGame() //重新开始游戏{for(int i=0;i<10;i++){for(int j=0;j<10;j++){BlockButton[j][i].setEnabled(true);}}int[][] map=new int[10][10];this.map=map;newMap();ld.setTimes(0);score=0;guanshu=0;ld.setdijiguan(guanshu);}public void guoguan() //过关后所有方块自动清除进行下一关{int jishushengyu2=0;for(int i=1;i<9;i++){for(int j=1;j<9;j++){if(map[i][j]>0){jishushengyu2++;}}}if(jishushengyu2==0){int[][] map=new int[10][10];this.map=map;newMap();ld.setTimes(0);guanshu++;ld.setdijiguan(guanshu);reLoad.setEnabled(true);}}public void newMap() //新建地图{for(int i=0;i<32;i++){kinds=(int)(Math.random()*1000)%fruitKinds+1;do {randomx1=(int)(Math.random()*1000)%8+1;randomy1=(int)(Math.random()*1000)%8+1;} while (map[randomy1][randomx1]>0);map[randomy1][randomx1]=kinds;do {randomx=(int)(Math.random()*1000)%8+1;randomy=(int)(Math.random()*1000)%8+1;} while (map[randomy][randomx]>0);map[randomy][randomx]=kinds;}}public boolean linecheck(int y1,int x1,int y2,int x2){ //判断是否在一条直线上if(y1==y2){if(x2>x1){int j=0;for(int i=0;i<x2-x1-1;i++){if(map[y1][x1+i+1]>0)j++;}if(j==0)return true;}if(x1>x2){int j=0;for(int i=0;i<x1-x2-1;i++){if(map[y1][x2+i+1]>0)j++;}if(j==0)return true;}}if(x1==x2){if(y2>y1){int j=0;for(int i=0;i<y2-y1-1;i++){if(map[y1+i+1][x1]>0)j++;}if(j==0)return true;}if(y1>y2){int j=0;for(int i=0;i<y1-y2-1;i++){if(map[y2+i+1][x1]>0)j++;}if(j==0)return true;}}return false;}public boolean zhejiaocheck(int y1,int x1,int y2,int x2) //判断能否折角相连{if(linecheck(y1,x1,y2,x1)&&linecheck(y2,x1,y2,x2)&&map[y2][x1]==0){return true;}if(linecheck(y1,x1,y1,x2)&&linecheck(y1,x2,y2,x2)&&map[y1][x2]==0) {return true;}return false;}public boolean liangcizhejiaocheck(int y1,int x1,int y2,int x2) //判断能否两次折角相连{for(int i=0;i<9;i++){if(x2+1+i<10&&map[y2][x2+1+i]==0&&linecheck(y2, x2, y2, x2+1+i)){if(zhejiaocheck(y1, x1, y2, x2+1+i))return true;}if(x2-1-i>=0&&map[y2][x2-1-i]==0&&linecheck(y2, x2, y2, x2-1-i)){if(zhejiaocheck(y1, x1, y2, x2-1-i))return true;}if(y2+1+i<10&&map[y2+1+i][x2]==0&&linecheck(y2, x2, y2+1+i, x2)){if(zhejiaocheck(y1, x1, y2+1+i, x2))return true;}if(y2-1-i>=0&&map[y2-1-i][x2]==0&&linecheck(y2, x2, y2-1-i, x2)){if(zhejiaocheck(y1, x1, y2-1-i, x2))return true;}}return false;}public boolean ifcanTouch(int y1,int x1,int y2,int x2) //能否在两次折角内连接{if(y1==y2&&(x1==x2+1||x1==x2-1)) //相邻{return true;}if(x1==x2&&(y1==y2+1||y1==y2-1)){return true;}if(linecheck(y1,x1,y2, x2)) //一条线上{return true;}if(zhejiaocheck(y1, x1, y2, x2)) //折角上return true;}if(liangcizhejiaocheck(y1, x1, y2, x2)) //两次折角{return true;}if(liangcizhejiaocheck(y2, x2, y1, x1)){return true;}return false;}public void clearBlock() //清除符合条件的方块{if(clicktimes>=2){if(map[coordinatey1][coordinatex1]==map[coordinatey][coordinatex]&&!((coordinatex1==coordinatex)&&(coordinatey1==coordinatey))) {if(ifcanTouch(coordinatey1, coordinatex1, coordinatey, coordinatex)){if(map[coordinatey1][coordinatex1]>0)score=score+10;map[coordinatey1][coordinatex1]=0;map[coordinatey][coordinatex]=0;guoguan();}}}}public void actionPerformed(ActionEvent e){if(ld.getTimes()==55){for(int i=0;i<10;i++){for(int j=0;j<10;j++){BlockButton[j][i].setEnabled(false);}}if(e.getSource()==reLoad){chongzai();reLoad.setEnabled(false);}if(e.getSource()==newgameButton){newGame();reLoad.setEnabled(true);}for(int i=0;i<10;i++){for(int j=0;j<10;j++){if(e.getSource()==BlockButton[j][i]){clicktimes++;lineStart.move(i,j);if(clicktimes%2==1){coordinatex1=i;coordinatey1=j;}if(clicktimes%2==0){coordinatex=i;coordinatey=j;}}}}this.requestFocus();clearBlock();repaint();}public void itemStateChanged(ItemEvent e) //选择难度{if(e.getSource()==difficultChoice){String selected = difficultChoice.getSelectedItem();if(selected=="简单"){fruitKinds=4;newGame();repaint();}else if(selected=="中等"){fruitKinds=8;newGame();repaint();}else if(selected=="较难"){fruitKinds=12;newGame();repaint();}else if(selected=="超难"){fruitKinds=15;newGame();repaint();}}}}public static void main(String[] args) //主函数{lianliankan frame=new lianliankan();frame.setTitle("水果蔬菜连连看王春辉陈坤炜王国林杨彬程秋瑜 ");frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.setLocation(440, 100);frame.setSize(540,440);frame.setVisible(true);}}class loudou extends JPanel implements Runnable{private static final long serialVersionUID = 1L;private int dijiguan;int remainTimes=0;int y1=35;int x2=60;int y2=155;Thread nThread1;JLabel overJLabel=new JLabel("GAMESTART");JDialog dialog=new JDialog();public loudou(){nThread1=new Thread(this);nThread1.start();this.setLayout(null);this.add(overJLabel);overJLabel.setBounds(0, 0, 90, 30);}public void setdijiguan(int x){this.dijiguan=x;}public void paintComponent(Graphics g) //画画函数{super.paintComponent(g);g.setColor(Color.red);g.drawLine(x1, y1, x2, y2);g.drawLine(x2, y1, x1, y2);g.drawLine(x1, y1, x2, y1);g.drawLine(x1, y2, x2, y2);g.fill3DRect(x1, y1-5, x2+1, y1, true);g.fill3DRect(x1, y2, x2+1, y1+3, true);g.setColor(Color.lightGray);g.drawLine(x1, y1, x1, y2);g.drawLine(x2, y1, x2, y2);g.setColor(Color.green);for(int i=0;i<60;i++){g.drawLine(x1+i/2+2, y1+i, x2-i/2-2, y1+i);}if(remainTimes<55){for(int i=0;i<remainTimes;i++)g.drawLine(x1+i/2+2, y2-i-1, x2-i/2-2, y2-i-1);}g.drawLine((x1+x2)/2, (y1+y2)/2, (x1+x2)/2 ,y2-2);g.drawLine((x1+x2)/2+1, (y1+y2)/2+1, (x1+x2)/2+1 ,y2-2);g.setColor(getBackground());for(int i=0;i<remainTimes;i++){g.drawLine(x1+i/2+2, y1+i, x2-i/2-2, y1+i);}}if(remainTimes>=50&&remainTimes<=55)overJLabel.setText(" "+(55-remainTimes)+" SCEND");}public void setTimes(int x){this.remainTimes=x;}public int getTimes(){return remainTimes;}public void run(){while(dijiguan<20){if(remainTimes==0){overJLabel.setText(" START !");}if(remainTimes==56){overJLabel.setText("TIME'S UP");JOptionPane.showMessageDialog(null,"游戏结束");}remainTimes++;repaint();try {if(dijiguan<6)Thread.sleep(1200-dijiguan*100);if(dijiguan>=6&&dijiguan<=8)Thread.sleep(700-(dijiguan-5)*50);if(dijiguan>8)Thread.sleep(550-(dijiguan-8)*20);}catch (InterruptedException e){e.printStackTrace();}}}}运行产生以下界面:。

连连看游戏编程教程

连连看游戏编程教程

连连看游戏编程教程连连看游戏是一款经典的益智类游戏,其独特的游戏规则让玩家们在娱乐的同时提高了思维能力和反应速度。

本篇文章将为大家介绍如何使用Python语言编写一个简单的连连看游戏。

一、游戏规则的设计在开始编写代码之前,我们需要先设计游戏规则。

连连看游戏的目标是通过消除相同图标的配对来清空游戏界面上的所有方块。

具体的游戏规则如下:1. 游戏界面是一个矩阵,每个方块上都有一个图标。

2. 玩家需要通过连接相同图标的路径来消除方块。

路径只能在水平和垂直方向上进行连接,不能有其他方块阻挡。

3. 每次消除相同图标的方块会得到一定的分数,随着游戏的进行,剩余方块的数量会减少。

4. 游戏会根据玩家的分数和剩余方块数量进行评分和排名。

二、游戏界面的设计在编写代码之前,我们需要使用Python中的图形库创建游戏界面。

这里我们推荐使用Pygame库,它是一款功能强大且易于上手的游戏开发库。

首先,我们需要创建一个窗口以及游戏界面的矩阵。

可以使用Pygame库提供的Surface对象来创建窗口,并使用二维列表来表示游戏界面的矩阵。

接下来,我们需要在窗口中绘制游戏界面的方块和图标。

可以使用Pygame库提供的绘制函数来实现,通过循环遍历游戏界面的矩阵,根据方块的状态来选择绘制的图标。

可以使用不同的颜色或者图片来表示不同的图标。

三、游戏逻辑的设计游戏逻辑是编写连连看游戏的核心部分。

主要包括方块的生成、方块的选择和判断是否可以连接的函数。

首先,在游戏开始时,需要生成随机的方块,并将其放置在游戏界面的矩阵中。

然后,需要实现方块的选择函数,玩家可以通过鼠标点击方块来选择两个需要连接的方块。

可以使用Pygame库提供的事件监听函数来实现。

接下来,需要实现判断两个方块是否可以连接的函数。

主要通过判断两个方块之间是否有可连通的路径来判断它们是否可以连接。

可以使用BFS或DFS等搜索算法来实现。

最后,在两个方块成功连接后,需要将它们从游戏界面的矩阵中移除,并计算玩家得分。

连连看实验报告

连连看实验报告

一、实验目的1. 熟悉并掌握使用Java语言进行图形界面编程的基本方法。

2. 理解并运用面向对象编程思想,提高编程能力。

3. 掌握连连看游戏的基本原理和实现方法。

4. 培养团队合作能力和创新意识。

二、实验内容1. 熟悉Java语言的基本语法和面向对象编程思想。

2. 使用Java Swing库开发图形界面。

3. 实现连连看游戏的基本功能,包括游戏界面、数据结构、逻辑算法等。

三、实验环境1. 操作系统:Windows 102. 开发工具:Eclipse3. 编程语言:Java四、实验步骤1. 创建Java项目,命名为“连连看游戏”。

2. 设计游戏界面,包括游戏区域、时间显示、分数显示等。

3. 定义数据结构,用于存储游戏中的图片和匹配关系。

4. 编写游戏逻辑算法,包括初始化游戏、随机生成图片、匹配图片等。

5. 实现游戏控制,包括鼠标点击事件、图片移动、匹配判断等。

6. 编写游戏结束判断和结果显示。

五、实验结果与分析1. 实验结果通过以上步骤,成功开发了一个连连看游戏。

游戏界面美观,功能完善,可以满足用户的基本需求。

2. 实验分析(1)游戏界面设计:采用Java Swing库中的JPanel、JLabel等组件,实现了游戏界面的布局。

通过设置背景图片、颜色等属性,使游戏界面更具吸引力。

(2)数据结构:使用二维数组存储游戏中的图片,每行每列代表一个位置。

通过遍历数组,判断相邻图片是否可以匹配。

(3)逻辑算法:在游戏开始时,随机生成图片并存储到数组中。

当用户点击一个图片时,判断其相邻图片是否可以匹配。

如果可以匹配,则将这两个图片移动到一起,并更新分数和时间。

(4)游戏控制:通过监听鼠标点击事件,实现图片的移动和匹配判断。

当图片移动到一起时,判断是否匹配,并更新游戏状态。

六、实验总结1. 通过本次实验,掌握了Java语言的基本语法和面向对象编程思想,提高了编程能力。

2. 熟悉了Java Swing库在图形界面编程中的应用,为以后开发类似项目奠定了基础。

连连看思路算法及实现

连连看思路算法及实现

连连看思路算法及实现连连看是一款经典的益智游戏,其玩法简单,规则清晰,深受广大玩家喜爱。

在这个游戏中,我们需要通过消除相同的图案来获得高分。

而要想在游戏中取得好成绩,则需要掌握一定的思路算法和实现方法。

一、思路算法1.寻找相同图案在连连看游戏中,最基本的操作就是寻找相同的图案。

因此,在进行游戏时,我们需要将所有可消除的图案都找出来,并建立起它们之间的关联关系。

2.建立关联关系建立图案之间的关联关系是为了方便后续操作。

我们可以使用二维数组或者链表等数据结构来存储每个图案以及它们之间的连接情况。

对于每一个图案,我们可以将其坐标作为数组下标,并将其与周围相邻的图案进行连接。

3.寻找可消除路径在建立好每个图案之间的连接关系后,我们就可以开始寻找可消除路径了。

通常情况下,可消除路径有两种:直线型和弯曲型。

对于直线型路径,我们只需要判断两个图案之间是否存在直线连接即可;而对于弯曲型路径,则需要考虑路径中是否存在转折点。

4.消除图案当我们找到了可消除路径后,就可以进行图案的消除操作了。

在消除时,我们需要将所有经过的图案都从数据结构中删除,并将得分累加到总分中。

此外,在进行消除操作时,我们还需要考虑一些特殊情况,如图案之间存在障碍物等。

5.判断游戏结束当所有的图案都被消除或者无法再进行消除操作时,游戏就结束了。

在判断游戏是否结束时,我们可以检查当前数据结构中是否还有未被消除的图案。

如果存在未被消除的图案,则说明游戏还未结束;否则,游戏就已经结束了。

二、实现方法1.数据结构在实现连连看游戏时,我们通常使用二维数组或链表等数据结构来存储每个图案以及它们之间的连接关系。

对于二维数组来说,其优点是存储简单、操作方便;而链表则更加灵活,可以动态地添加和删除元素。

2.算法实现在实现连连看游戏时,我们需要编写一些算法来完成相应的功能。

例如,在寻找可消除路径时,我们可以使用广度优先搜索算法(BFS)或深度优先搜索算法(DFS)来遍历所有可能的路径,并找到其中符合要求的路径。

Java课程设计连连看游戏(含代码)

Java课程设计连连看游戏(含代码)

Java程序课程设计任务书一、主要任务与目标1、了解图形用户界面的概念;2、了解AWT的基本体系结构,掌握窗口的基本原理;3、掌握几种布局管理器的使用方法;4、掌握java的事件处理机制;5、了解Swing的基本体系结构,掌握Swing组件的使用方法;6、掌握java小程序的工作原理和使用方法;7、该游戏还将设置退出,再来一局按钮,并实现相应的功能。

8、设计一个用户注册登录界面二、主要内容与基本要求游戏规则是模仿网络上普通的连连看游戏,主要是鼠标两次点击的图片能否消去的问题。

当前,前提是点击两张相同的图片,若点击的是同一张图片或者两张不同的图片,则不予处理。

在两张想同图片所能连通的所有路径中,如果存在一条转弯点不多于两个的路径,就可以消去;如果没有,则不予处理。

该游戏由30张不同的图片组成,游戏开始将会出现30张随机组合的图片,在规则下点击两张相同的图片后图片将会消失。

图片全部消完为游戏成功。

游戏还将设置退出,再来一局的按钮,和倒计时的功能,方便用户进行操作。

并且有一个用户登录注册界面,玩家必须登录以后才可以进行游戏。

三、计划进度12月28日~ 12月29日:课程设计选题,查找参考资料12月30日~ 12月31日:阅读参考书籍,收集资料,完成需求分析1月1日~ 1月3日:系统的代码设计及实现,数据库设计与实现1月4日~ 1月5日:系统的调试,修改,完善1月6日~ 1月7日:完成课程设计报告,准备答辩四、主要参考文献[1] 刘宝林.Java程序设计与案例习题解答与实验指导[M].[2] 王鹏何云峰.Swing图形界面开发与案例分析[M].[3](美)Karl Avedal , Danny Ayers, Timothy Briggs. JSP编程指南[M]. 电子工业出版社, 2004,47-125.[4](美)Mark Linsenbardt. JSP在数据库中的应用与开发[M]. 希望电子出版社,2005,210-236.[5] Dianne Phelan,Building a simple web database application[C].IEEE InternationalProfessional Communication Conference, 2004, 79-86.[6](美)Karl Avedal,Danny Ayers,Timothy Briggs.JSP编程指南[M].电子工业出版社,2006,47-125.[7] Dianne Phelan,Building a simple web database application[C].IEEE InternationalProfessional Communication Conference, 2005, 79-86.[8] Altendorf. Eric, Hohman. Moses, Zabicki. Roman. Using J2EE on a large,web-based project[J]. IEEE Software.2002,19(02):81-89.摘要当今社会,休闲型游戏越来越得到人们的喜爱,我所做的毕业设计实例“连连看游戏的设计与实现”是近几年来网络上非常流行的一种二维休闲游戏,它对电脑配置要求不高,娱乐性强,易于上手。

java小游戏连连看源代码

java小游戏连连看源代码

Java小游戏——连连看源码连连看java源代码import javax.swing.*;import java.awt.*;import java.awt.event.*;public class lianliankan implements ActionListener{JFrame mainFrame; //主面板Container thisContainer;JPanel centerPanel,southPanel,northPanel; //子面板JButton diamondsButton[][] = new JButton[6][5];//游戏按钮数组JButton exitButton,resetButton,newlyButton; //退出,重列,重新开始按钮JLabel fractionLable=new JLabel("0"); //分数标签JButton firstButton,secondButton; //分别记录两次被选中的按钮int grid[][] = new int[8][7];//储存游戏按钮位置static boolean pressInformation=false; //判断是否有按钮被选中int x0=0,y0=0,x=0,y=0,fristMsg=0,secondMsg=0,validateLV; //游戏按钮的位置坐标int i,j,k,n;//消除方法控制public void init(){mainFrame=new JFrame("JKJ连连看");thisContainer = mainFrame.getContentPane();thisContainer.setLayout(new BorderLayout());centerPanel=new JPanel();southPanel=new JPanel();northPanel=new JPanel();thisContainer.add(centerPanel,"Center");thisContainer.add(southPanel,"South");thisContainer.add(northPanel,"North");centerPanel.setLayout(new GridLayout(6,5));for(int cols = 0;cols < 6;cols++){for(int rows = 0;rows < 5;rows++ ){diamondsButton[cols][rows]=new JButton(String.valueOf(grid[cols+1][rows+1])); diamondsButton[cols][rows].addActionListener(this);centerPanel.add(diamondsButton[cols][rows]);}}exitButton=new JButton("退出");exitButton.addActionListener(this);resetButton=new JButton("重列");resetButton.addActionListener(this);newlyButton=new JButton("再来一局");newlyButton.addActionListener(this);southPanel.add(exitButton);southPanel.add(resetButton);southPanel.add(newlyButton);fractionLable.setText(String.valueOf(Integer.parseInt(fractionLable.getText()))); northPanel.add(fractionLable);mainFrame.setBounds(280,100,500,450);mainFrame.setVisible(true);}public void randomBuild() {int randoms,cols,rows;for(int twins=1;twins<=15;twins++) {randoms=(int)(Math.random()*25+1);for(int alike=1;alike<=2;alike++) {cols=(int)(Math.random()*6+1);rows=(int)(Math.random()*5+1);while(grid[cols][rows]!=0) {cols=(int)(Math.random()*6+1);rows=(int)(Math.random()*5+1);}this.grid[cols][rows]=randoms;}}}public void fraction(){fractionLable.setText(String.valueOf(Integer.parseInt(fractionLable.getText())+100)); }public void reload() {int save[] = new int[30];int n=0,cols,rows;int grid[][]= new int[8][7];for(int i=0;i<=6;i++) {for(int j=0;j<=5;j++) {if(this.grid[i][j]!=0) {save[n]=this.grid[i][j];n++;}}}n=n-1;this.grid=grid;while(n>=0) {cols=(int)(Math.random()*6+1);rows=(int)(Math.random()*5+1);while(grid[cols][rows]!=0) {cols=(int)(Math.random()*6+1);rows=(int)(Math.random()*5+1);}this.grid[cols][rows]=save[n];n--;}mainFrame.setVisible(false);pressInformation=false; //这里一定要将按钮点击信息归为初始init();for(int i = 0;i < 6;i++){for(int j = 0;j < 5;j++ ){if(grid[i+1][j+1]==0)diamondsButton[i][j].setVisible(false);}}}public void estimateEven(int placeX,int placeY,JButton bz) {if(pressInformation==false) {x=placeX;y=placeY;secondMsg=grid[x][y];secondButton=bz;pressInformation=true;}else {x0=x;y0=y;fristMsg=secondMsg;firstButton=secondButton;x=placeX;y=placeY;secondMsg=grid[x][y];secondButton=bz;if(fristMsg==secondMsg。

基于“连连看”实例的Java程序设计课程教学研究

基于“连连看”实例的Java程序设计课程教学研究

基 于实例 的教学是 近年来讨论 比较 多的话题 。 本文将结合 程序 设计课 程教学 实际 ,探讨如何将程序 实 例引入 到课 堂 ,让 学生更 好 的学 习面 向对象程 序设 计 这 门课 程 。 由于J a v a 语 言与 生俱来 的 “ 面 向对 象 ” 的特 点 ,众 多 高校 选 择 其作 为 面 向对 象 程 序设 计 课
构造出一个 1 1 1 9 的G r i d L a y o u t 布 局 ,而后在每个单元
格 中放人一个J B u t t o n  ̄ 的对象 ,代表贴砖对象 。这样 ,

通俗易懂 ,且能激发学生 的课堂兴趣。考 虑到学生通常 对小游戏存在兴趣 ,本文引入 了较为普及 的小游戏 “ 连 连看” ,通过该游戏 的设计 ,来探 索面向对象程序设计
码 ,从语法 的角度说明如何使用而 已,并不能给学生更 多的直观感受 。在 “ 连连看 ”实例 中,主界面 区域显然
二、 “ 连连 看 "实例 设计 与教 学
为 了能够 达到 教学效 果 ,实例 的选取需 要适 当斟
酌 。实例的选择 不仅要能够满足基本的教学需要 ,更要
可以看成是 一种典 型的G r i d L a y o u t 布局应用。我们 可以
程 教学 的编程 语言 。本文 的实 例亦建 立在J a v a 平 台之


与设计过程 。
B)当进行 可视化 程序设计 的时候 ,界面布局是无
法 回避的问题 。现在几乎所有 的教材在描述这个问题的
时候 ,通常只是 简要地罗列 出J a v a 平 台下的几种布局 , 诸 ̄ H F l o wL a y o u t 、B o r d e r L a y o u t 等 ,然后给出一小段代

JAVA开发连连看游戏

JAVA开发连连看游戏

1 引言1.1 连连看游戏发展[1]游戏“连连看”顾名思义就是找出相关联的东西,连连看游戏在网上基本是用于小游戏中,就是找出相同的两样东西,在一定的规则之内可以做为相关联处理。

“连连看”的发展经历了从桌面游戏、在线游戏、社交游戏三个过程。

在电脑普及发展的今天,网络小游戏、网页游戏越来越受网民欢迎,除了玩的方法简单外(不像其他游戏还需要注册下载繁琐过程),很多游戏不乏经典。

连连看游戏就是典型,因此不管走到哪个网页游戏网站,连连看游戏总是排在受玩家欢迎排名的前3位,休闲、趣味、益智是连连看玩不厌的精华,且不分男女老少、工薪白领,是一款适合大众的经典网络、单机休闲小游戏。

1.1.1 桌面连连看游戏发展游戏“连连看”是源自台湾的桌面小游戏,自从流入大陆以来风靡一时,也吸引众多程序员开发出多种版本的“连连看”。

这其中,顾方编写的“阿达连连看”以其精良的制作广受好评,这也成为顾方“阿达系列软件”的核心产品。

并于2004年,取得了国家版权局的计算机软件著作权登记证书。

1.1.2 在线连连看游戏发展随着Flash应用的流行,网上出现了多种在线Flash版本“连连看”。

如“水晶连连看”、“果蔬连连看”、“石头连连看”等。

1.1.3 社交连连看游戏发展2008年,随着社交网络的普及和开放平台的兴起,“连连看”被引入了社交网络。

“连连看”与个人空间相结合,被快速的传播,成为一款热门的社交游戏,其中以开发者Jonevey在Manyou开放平台上推出的“宠物连连看”最为流行。

1.2 连连看游戏介绍当今社会休闲型游戏越来越得到人们的喜爱,连连看游戏是近几年来网络上非常流行的一种二维休闲游戏,它对电脑配置要求不高,娱乐性强,易于上手,因此吸引了一大批玩家,且不分男女老少、工薪白领,是一款适合大众的经典网络、单机休闲小游戏。

1.2.1 连连看游戏基本规则如果两个相同的图案之间如果能画出一条不多于2折的连线,则消除这两个图案,直到所有的图案全部消除为止,这就是连连看。

连连看小游戏设计毕业设计

连连看小游戏设计毕业设计

摘要游戏“连连看”,只要将相同花色的两张牌用三根以内的直线连在一起就可以消除,规则简单容易上手。

这个程序的界面使用Jframe框架,主程序窗口包含一个主面板,其中包含两个子面板,左边一层子面板是游戏窗口,符合我们玩游戏的习惯,包含连连看游戏的图片元素,用户进行游戏能找到32对图片;右边一层用来实现游戏控制,有开始、刷新、选择难度、显示分数、进度条等功能选项。

结合Java 编程语言的简单、面向对象、分布式、解释性、健壮、安全与系统无关、可移植、高性能、多线程、动态和连连看游戏的休闲、趣味、益智加上美观的界面设计和秀色可餐的水果蔬菜游戏图片元素,使这款连连看游戏成为现代都市人们打发无聊,放松身心的好帮手。

加入了游戏时间控制和过关控制及进度条提示功能使游戏速度节奏快,画面清晰可爱,老少皆宜。

通过ActionEvent 组件进行动作事件的监听和处理。

游戏通过定义数组,根据一定的算法实现规定的路径判断。

关键字: Java连连看;Jframe;数组;路径判断AbstractThe game "lianliankan", as long as the two cards with the same suit straight up to three connected can be eliminated, rules are easy. This program of interface using Jframe framework, main program window contains a a main panel, which contains two a child Panel, left a layer child Panel is game window, meet we playing game of habits, contains fest see game of pictures element, user for game can found 32 on pictures; right a layer used to achieved game control, has began, and refresh, and select difficulty, and displayed score, and progress article, features option. Combines a simple Java programming language, object-oriented, distributed, interpreted, robust, secure system-independent, portable, high-performance, multithreaded, dynamic and lianliankan games, leisure, fun, puzzle together with attractive interface design and appetizing fruit vegetables picture elements, makes this lianliankan games become the modern city spending tedious, relaxed and good help. Joined the playing time control and border control and progress bar prompts make the game faster tempo, clear picture and lovely, both young and old. Action through the ActionEvent component event listening and handling. Games by defining an array according to certain algorithms provide path of judgment.Key words: Java Lianliankan ; Jframe ; array ; approaches目录1.引言 (1)2.游戏规则 (1)2.1概要 (1)2.2操作 (1)2.3胜利条件 (1)2.4失败条件 (1)3.发展概况 (1)3.1连连看游戏的历史 (1)3.2用java语言写连连看游戏的原因 (2)4.方案论证 (2)4.1设计原理 (2)4.2方案选择 (3)4.3主要问题 (3)4.4技术要求 (3)4.5游戏应用环境的构建 (4)5.系统分析 (4)5.1模块分析 (4)5.1.1 界面的设计和图片的随机生成模块 (5)5.1.2 菜单控制模块 (5)5.1.3算法模块 (5)5.2基本思路 (6)5.2.1 游戏地图设计思路 (6)5.2.2 连连看游戏图片 (6)5.2.3 获取图片位置 (6)5.2.4 路径判断思路 (7)6.系统设计 (8)6.1主界面的设计 (8)6.2图片的随机生成 (9)6.3单击控件的事件触发 (9)6.3.1开始游戏按钮 (9)6.3.2重列按钮 (10)6.3.3难度选择按钮 (10)6.4清除两个一样的符合条件的方块 (10)6.5过关设置 (10)7.结果分析 (11)7.1优点 (11)7.2缺点 (11)8.总结 (11)参考文献 (13)致谢 (14)1.引言网络小游戏、网页游戏越来越受网民欢迎,除了玩的方法简单外(不像其他游戏还需要注册下载繁琐过程),很多游戏不乏经典。

Java连连看程序代码

Java连连看程序代码
Button b26,b27,b28,b29,b30,bc;
Button p1,p2,br,bt1,bt2; //p1、p2为选定的按钮
Panel panel1,panel2;
int d[][]={ //用来和界面的按钮建立映射关系
{0,0,0,0,0,0,0},
{0,0,0,0,0,0,0},
{0,0,0,0,0,0,0},
{0,0,0,0,0,0,0},
{0,0,0,0,0,0,0},
{0,0,0,0,0,0,0},
{0,0,0,0,0,0,0},
{0,0,0,0,0,0,0}
};
public static void main(String[] args)
panel1.add(b7); panel1.add(b8); panel1.add(b9);
panel1.add(b10); panel1.add(b11); panel1.add(b12);
panel1.add(b13); panel1.add(b14); panel1.add(b15);
b4=new Button(String.valueOf(d[1][4]));
b5=new Button(String.valueOf(d[1][5]));
b6=new Button(String.valueOf(d[2][1]));
b7=new Button(String.valueOf(d[2][2]));
{0,0,0,0,0,0,0}
};
this.d=d;
suiji(); //调用随机函数,产生随机数;
f.setVisible(false);

连连看游戏算法

连连看游戏算法

• 2 障碍物属性的存放位置 障碍物属性尽量不要用方块是否可见等外 观因素来确定,外观因素应该由内部变量决 定. 因为很可能,某天你要改成消方块只是 需要让方块变灰,那么你的内部检验代码要 修改,比较麻烦.尽量使用一个数组来存放这 些属性.然后外观是另一套代码,这样便于维 护.Fra bibliotek谢谢大家!
• 二级检验(只有一个折点)在排除了一级 检验的条件后,对两方块的坐标关系没有要 求.所以,若横坐标或纵坐标相等,就直接进 入三级检验.
在上图中,红线由两线段组成,所以,这个检验 相当于两个一级检验结果的"且"运算.可见,一 级检验的方法可以用到这里.所以,把一级检验 定义为函数,在二级检验中,会方便很多.
注意其中的+1和-1的运算
• 该表达式返回true,那么checkNoBarrier 返回true.否则二级检验结果为false;要进 入三级检验
可以发现,所有的折线都有一个特点.两个折点分别跟两方块 的横坐标相等或纵坐标相等,因此,我们只需要对折线的中段 进行一级检验.至于折点的位置,就让两方块往四个方向走,走 到障碍物或者方阵边缘.于是,走过的点都有可能成为折线的 折点,在这些点里,看看哪些点对(点的组合)可以作一级检验.
• 注意::这里很容易忽略的一个情况就是 两个方块相邻.这时,y1与y2之间没有点.如 果不检验就会错误地跳到二级检验里去.为 了避免这种状况的出现,可以在循环之前,定 义一临时变量temp=true,然后才到循环语 句,遇到障碍物就让temp=false,并且跳出 循环.这时,对于相邻的情况来说,因为循环 次数为0,所以temp绝对为true. • 综上所述,temp=true,checkNoBarrier就 返回true,否则要进入二级检验.

连连看游戏算法实现

连连看游戏算法实现

连连看算法为了方便,我们假设棋盘大小为 4 * 4,棋子有 4 种。

数字化和布局算法首先,我们知道每种棋子有 4 个,我们可以先按顺序把每种棋子排好,然后再随机取其中两个棋子交换一下,多次交换后,棋子就是乱的了。

参考下面两图,图中用 4 种颜色表示 4 种棋子:(1)初始排布(2)多次随机交换两个棋子后实际上程序内部是不需要认识棋子的图象的,只需要用一个 ID 来表示,界面上画出来的棋子图形是根据 ID 取资源里的图片画的。

比如上图中用 4 种颜色表示 4 种棋子,我们可以定义红色棋子的 ID 为 0,绿色为 1,蓝色为 2,黄色为 3。

另外,如果棋子被消除 ID 可以定义为 -1。

把 ID 放在一个二维矩阵,画到界面上时,根据距阵里元素的位置和值(ID)决定在什么位置画什么颜色棋子。

我见过两种风格的连连看,有一种是和我写的水晶连连看一样,连线可以伸到棋子矩行外面,比如图(2)中的第一行有两个红色棋子,这两个是可以连的;另外一种和 QQGame 里的连连看一样,连线不能伸到棋子矩行外面,也就是说图(2)中的第一行的两个红色棋子是不能连的。

程序内部棋子都是数字,这两种风格的差别在于 ID 距阵的大小,第一种是:(行数 + 2) * (列数 + 2);第二种是:行数 * 列数,这更简单,所以下面只说第一种。

(行数 + 2) * (列数 + 2) 的距阵,边界上都是 -1(也可以定义为别的,比如 -2),即留了空位给连线通过,而且这些空位不能安排任何棋子,在有些“关”的时候,棋子会移动,也不可以移动到边界的空位上!参考图(3),其中灰色表示边界空位,灰色边界内部是棋盘:(3)棋盘矩阵化(4)棋子数字化连通算法(1)直连型:太简单不说了。

(2)一折型:其实相当于两个棋子划出一个矩形,这两个棋子是一对对角顶点,另外两个顶点如果可以同时和这两个棋子直连,那就说明可以“一折连通”。

见图(5)两个红色棋子的连通情况,右上角打叉的位置就是折点。

连连看小游戏编程实现

连连看小游戏编程实现

连连看小游戏编程实现连连看是一种非常经典的益智游戏,通过连接相同图案的方块来消除它们,最终目标是将所有方块都消除完毕。

本文将介绍如何使用编程语言实现一个简单的连连看小游戏。

1. 游戏规则连连看游戏的规则非常简单,玩家需要找到两个相同图案的方块,且它们之间的连线不能超过两个弯角。

当玩家成功连接一对相同的方块时,这对方块将会消失,同时玩家获得一定的分数。

玩家需要尽可能快地消除所有方块,以获取更高的分数。

2. 游戏界面设计在编程实现连连看游戏时,我们需要设计一个美观且易于操作的游戏界面。

可以使用图形库来实现游戏界面的绘制,比如Python的Tkinter库或者C++的SFML库。

游戏界面需要包括以下几个组件:a. 方块区域:用于显示游戏的方块布局,可以使用矩阵形式表示,每个元素表示一个方块。

b. 分数显示区域:用于显示玩家当前的得分情况。

c. 时间显示区域:显示剩余的游戏时间。

d. 游戏操作按钮:如开始游戏按钮、重新开始按钮等。

3. 方块生成在游戏开始时,需要生成一定数量的方块,并将它们随机地分布在方块区域内。

可以使用随机数生成算法来实现方块的随机生成,同时需要保证每种方块的数量相等。

4. 连接算法玩家通过点击两个相邻且相同的方块来进行消除。

为了判断两个方块是否可以相连,我们需要实现一个连线算法。

一种简单的实现方法是使用深度优先搜索算法(DFS)来寻找两个方块之间的路径。

通过遍历方块区域,查找与当前选中方块相同的邻居方块,然后递归搜索相邻方块的邻居,直到找到目标方块或者无法继续搜索为止。

5. 方块消除当玩家成功连接一对相同的方块时,需要将它们从方块区域中移除,并更新玩家的得分。

可以使用图形库提供的绘制函数来实现方块的消除效果,比如渐渐消失或者爆炸效果等。

6. 游戏结束当所有方块都被消除或者游戏时间结束时,游戏结束。

此时可以显示玩家的最终得分,并提供重新开始或退出游戏的选项。

通过以上步骤,我们可以使用编程语言实现一个简单的连连看小游戏。

用JAVA设计手机连连看游戏

用JAVA设计手机连连看游戏

且 ,此款游戏与以往的连连看游戏不同 ,可以让用户自主设计
连连 看 游 戏 的 背 景 图 片 ,还 有 欢 快 的 背 景 音乐 舒 缓 神 经 ,增 添
了更多乐趣。因此,此款游戏有一定有广大的市场。
2基 本概 念 ’
, / 下 一 关 为上 一关 减 去5 秒 的时 间
t o t a l Ti me 一 = 5:
能 的 部分 代码 如 下 :
p u b l i c v o i d o n C l i c k ( Vi e w v )( n e w Al e r t Di a l o g . B u i l d e r ( S e t D i a l o g . t h i s )

以支持手机运行 。
2 l 世 纪 ,人们 所 承 受 的 来 自各 方 面 的压 力越 来 越 大 ,人 们
需要一个释放 自我的途径 。连连看小游戏 ,规则简单 ,生动有
趣 ,对 于 需 要 释 放 压 力 ,打 发 时 间 的 人 来 说 ,是不 二 之 选 。并
p r i v a t e R e f r e s h Ha n d l e r r e f r e s h H a n d l e r =n e w R e f r e s h Ha n d l e r 0 ;
s t a r t P l a y 0 ; )
2 Mi c r o E d i t i o n ,主 要 针 对 嵌入 式 系 统 ,包 括 手 机 、P DA 等 。针
( 3 )游戏 更 换 图片 代码 。
对 手 机应 用程 序 的开发 ,s u n 还 提供 了 免费 的J 2 ME Wi r e l e s s

说说连连看游戏的算法设计——生成地图篇

说说连连看游戏的算法设计——生成地图篇

说说连连看游戏的算法设计——生成地图篇最近突发奇想,想写一个连连看小游戏玩一下。

没动手的时候以为这个游戏简单的不得了,写起来应该是一挥而就的感觉;等真的写起来才发现是纸上谈来终觉浅,绝知此事要躬行啊。

连连看的核心算法主要由两部分组成,第一个是地图的生成算法,另一个是地图寻路的算法。

本文主要讨论地图的生成。

我们设地图是一个m x n二维数组。

生成算法:生成算法要求生成一个不总有连续标记出现的二维数组,数组中每个元素都要出现偶数次。

分析:这个数组必须要有偶数个元素:所以m*n%2==0;其他就是考虑出现偶数次数据和乱序排列的问题了。

现在我们设m=6,n=6进行讨论。

并设现在数组中共有6个元素可供选择,不要求所有元素都出现,但如果出现必须出现偶数次。

方法一:先生成一个顺序排列的二位数组如:1map[m][n]={{1,2,3,4,5,6},2{1,2,3,4,5,6},3{1,2,3,4,5,6},4{1,2,3,4,5,6},5{1,2,3,4,5,6},6{1,2,3,4,5,6},}然后循环遍历数组元素和数组中任意位置的数交换,得到打乱顺序的数组。

7map[m][n]={{1,4,2,5,6,2,}8{2,1,6,5,1,2,}9{1,2,3,5,3,4,}10{1,4,3,6,6,6,}11{4,6,3,5,3,5,}12{4,2,5,1,4,3,}}评价:此方法生成初始数组的过程简单,但是初识变量需要人为规定好如何布局,以确保有偶数个元素出现,并且每个元素出现的次数固定,对元素个数也有一定要求。

随机打乱后数组元素的离散度不高。

方法二:1、根据数组可用元素个数x,先生成二维数组的前m*n-x个元素。

这些元素的值随机取任意有效值(可让每个元素与前方,上方元素不等)。

2、另开辟一长度x的一维数组a[x]记录每个有效值出现的次数。

3、根据a将出现奇数次的元素排列于二维数组末尾,其余位置用随机一对儿相投元素填充。

java 数字连续 判断 算法

java 数字连续 判断 算法

java 数字连续判断算法要判断一个数组中的数字是否连续,可以使用以下算法:1. 将数组进行排序。

2. 检查数组的每一个数字是否连续。

遍历数组,从第二个数字开始,依次判断当前数字是否等于前一个数字加一。

3. 如果所有数字都连续,则返回true;否则,返回false。

代码示例:```javaimport java.util.Arrays;public class Main {public static boolean isConsecutive(int[] nums) {// 对数组进行排序Arrays.sort(nums);// 检查每个数字是否连续for (int i = 1; i < nums.length; i++) {if (nums[i] != nums[i - 1] + 1) {return false;}}return true;}public static void main(String[] args) {int[] nums = {1, 2, 3, 4, 5};boolean result = isConsecutive(nums);System.out.println(result); // 输出:trueint[] nums2 = {1, 3, 4, 5};boolean result2 = isConsecutive(nums2);System.out.println(result2); // 输出:false}}```以上代码先对数组进行排序,然后遍历数组检查是否连续。

如果数组中的每个数字都是连续的,则返回true;否则,返回false。

在示例中,输出结果分别为true和false。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

两点之间只需要一条直线连接:
( 注意:为了简单省事,我们用java.awt 包中的
Poin(x, y)t 来描述二维数组中元素的坐标,但是有
一点要特别小心,x 和y 与二维数组中元素的下
标值恰好相反,如左上图中A 的下标为
array[1][0] ,Point 的描述却是为Point(0, 1) ,
如果不注意这一点,程序会出错的。

)
两点之间需要两条直线连接:
如上图, A 、 B 两点如果需要两条直线连接起
来,有可能有两种方式,于是,我们可以巧妙的构
建一个 C 点和一个 D 点,并且规定C 点的横
坐标为 A 点的横坐标,C 点的纵坐标为B 点
的纵坐标, D 点的横坐标为B 点的横坐标,D
点的纵坐标为A 点的纵坐标(这一点很重要,因
为 C 、D 决定了AC 、BC 、AD 、BD 的
连线方式),如下图:
如果此时C 点(或D 点)能同时满足AC
(AD )、BC (BD )只需要一条直线相连,
就表示 A 、B 之前能够使用两条直线连接起来,
并且C 点( D 点)为拐点(以后会用上的)
//A 、B 之间有一个拐点
boolean oneCorner(Point a, Point b) {
Point c, d;
boolean isMatch;
c = new Point(a.x, b.y);
d = new Point(b.x, a.y);
if (map[c.x][c.y] == 0) { //C 点上必须没有
障碍
isMatch = horizonMatch(a, c) &&
verticalMatch (b, c);
if (isMatch) {
return isMatch;
}
}
if (map[d.x][d.y] == 0) { //D 点上必须没有
障碍
isMatch = verticalMatch (a, d) &&
horizonMatch (b, d);
( 注意:由于 C 点和 D
点的构建方式确定了 AC 、 BD 永远是竖连线、
BC 、 AD 永远是横
连线 )
两点之间需要三条直线连接:
这种方式是最复杂的了,我们还是先分析一下出现三条直线的所有可能性吧。

( 图 A)
( 图 B :这种方式比较容易忽略掉 )
以上图说明了两点间三条直线的所有可能性,和二条直线的情况相比,拐点是两个,麻烦了一点,但也不难处理。

下面我们来分析一下该怎么处理二个拐点的情况(三条直线)。

由上面的图可以看出, A 、 B 如果要通过三条直线相连,则必须有 C 、 D 两个拐点,如果能确定下 C 、 D ,问题就好解决多了。

怎么样来确定 C 、 D 两点呢?我们以图 A 中的左图为例,在此之前,我们规定 C 点与 A 点
在同一竖线上, D 点与 A 点在同一直线上。

同时,从图中我们也可以看出, A 、 B 两点间如果只能通过三条直线连接起来,则必定有一条直线处于 A 、 B 的横向夹线纵向夹线中(如画圈的线)。

我们假设相等的线为在 A 、 B 两点的横坐标相等、纵坐标为 0~Setting.ROW 构成的区域上 ( 如
图 ) 。

我们先扫描出所有的线,并且我们发现,如果在 A 、 B 构成的区域中存在两个点能构成直线,那么,这条直线就 有可能 是我们需要的直线,我们称此线为符合线,如果符合线的两端( C 、 D 两点)与 A 、 B 两点分别能 AC 、 CD 、 DB 能构成直线的原则,则 AB 间一定可以通过三条直
线连接起来。

(这个可能我描述得不太清楚,但相信你应该不难明白的)
我们把所有找到的符合线保存起来,并且要记录下符合线是横向上的还是纵向上的,然后通过这些找到的符合线,依次和 A 、 B 两点进行判断,一旦找到这样的 C 、 D 两点,能满足 AC 、 CD 、 DB 这三条线上都没有障碍,那么, A 、 B 就可以消除了。

还是用算法来描述一下吧。

首先我们构建一个保存 C 、 D 点的类 Line ,并且要指明 C 、 D 的方向是横向还是纵向。

//Line.java public class Line { public Point a, b;
public int direct; //1 表示横线, 0 表示竖线 public Line() { }
public Line(int direct, Point a, Point b) { this.direct = direct; this.a = a; this.b = b; } }
同时,由于在扫描的过程中,会找到多根符合线,因此,我们可以用 Vector 来保存这些找到的符合线(为了提高效率,也可以使用 LinkedList 来保存)。

扫描两点构成的矩形内有没有完整的空白线段 Vector scan(Point a, Point b) { Vector v = new Vector();
// 从 a, c 连线向 b 扫描,扫描竖线 // 扫描 A 点左边的所有线 for (int y = a.y; y >= 0; y--) {
if (map[a.x][y] == 0 && map[b.x][y] == 0 &&
verticalMatch(new Point(a.x, y), new Point(b.x, y))) { // 存在完整路线
v.add(new Line(0, new Point(a.x, y), new Point(b.x, y))); } }
// 扫描 A 点右边的所有线
for (int y = a.y; y < COLUMN; y++) { if (map[a.x][y] == 0 && map[b.x][y] == 0 &&
verticalMatch(new Point(a.x, y), new Point(b.x, y))) { // 存在完整路线
v.add(new Line(0, new Point(a.x, y), new Point(b.x, y))); } }
// 从 a, d 连线向 b 扫描,扫描横线
// 扫描 A 点上面的所有线 for (int x = a.x; x >= 0; x--) {
if (map[x][a.y] == 0 && map[x][b.y] == 0 &&
horizonMatch(new Point(x, a.y), new Point(x, b.y))) {
v.add(new Line(1, new Point(x, a.y), new Point(x, b.y))); } }
// 扫描 A 点下面的所有线
for (int x = a.x; x < ROW; x++) { if (map[x][a.y] == 0 && map[x][b.y] == 0 &&
horizonMatch(new Point(x, a.y), new Point(x, b.y))) {
v.add(new Line(1, new Point(x, a.y), new Point(x, b.y))); } } return v; }
现在,我们对所有找到的符合线进行判断,看看 AC 、 DB 是否同样也可以消除
段,无解 return false; }
for (int index = 0; index < vector.size(); index++) {
Line line = (Line) vector.elementAt(index); if (line.direct == 1) { // 横线上的扫描段,找到了竖线
if (verticalMatch(a, line.a) &&
verticalMatch(b, line.b)) { // 找到了解,返回 return true; } }
else { // 竖线上的扫描段,找到了横线 if (horizonMatch(a, line.a) && horizonMatch(b, line.b)) { return true; } } }
return false; }
消除该两个元素时,只需要将两个元素的值置为 0 即可。

更多的功能:自动寻找匹配的点
现在,算法基本上是实现了,但是,为了使游戏更丰富,我们还需要实现更多的功能,现在,我们添加一个自动寻找匹配的点的功能。

该功能需要分两步走:
第一步,从左上向右下搜索二维数组中第一个值不为0 的元素A ,找到该点后,然后再从该点向后找到一个值与该点值相等的元素B ,然后对这两个元素进行是否可消除的判断,如果可以消除,则说明该两点匹配,如果不能消除,则继续寻找与A 点值相等的B 点,如果找不到 B 点,则寻找下一个 A 点,依次下去,直到找不到这个 A 点,这就表时地图上已经不存在可消除的点了,我们用伪算法描述如下:
找到第一个 A 点
while (A 点存在时) {
while ( 能找到与A 点值相等的B 点) {
if (Match(A, b)) {
返回找到的AB 点;
}
}
寻找下一个 A 点
;
}
找不到点;
更多的功能:刷新地图
刷新地图的功能其实非常简单,只是需要将二维数组中现有的元素打乱后然后放回这个二维数组):。

相关文档
最新文档