连连看java源码分析
java源码阅读技巧

java源码阅读技巧
阅读Java源码是每个Java程序员都应该具备的重要技能,以
下是一些阅读Java源码的技巧:
1. 理清目的,在阅读Java源码之前,首先要明确自己的阅读
目的是什么,是为了理解某个特定功能的实现,还是为了学习优秀
的编程实践和设计模式。
2. 选择合适的版本,Java的版本更新很快,不同版本的源码
可能会有一些差异,因此要根据自己的需要选择合适的版本进行阅读。
3. 从入口开始,通常情况下,阅读Java源码应该从入口开始,比如某个类或者某个方法,然后根据需要逐步深入。
4. 注重关键类和方法,Java源码非常庞大,不可能一下子全
部理解,因此要有选择地关注一些关键的类和方法,比如常用的集
合类、IO类等。
5. 结合文档,阅读Java源码时,要结合官方文档,了解每个
类和方法的作用和用法,这样能更好地理解源码的含义。
6. 调试和实践,阅读Java源码不仅仅是 passively reading,更重要的是要结合自己的实际项目进行调试和实践,这样能更深入
地理解源码的运行逻辑和细节。
7. 查阅其他资料,有时候Java源码本身并不能完全解答你的
疑惑,这时候可以查阅一些权威的书籍或者网络资料,加深自己的
理解。
总的来说,阅读Java源码需要耐心和细心,要有一颗渴望探索
的心态,同时要善于总结和归纳,不断地积累经验和知识。
希望以
上技巧对你有所帮助。
基于Flex和Java的网页小游戏连连看的开发

平顶山学院本科毕业设计基于Flex和Java的网页小游戏连连看的开发摘要游戏在现今社会里正成为人们释放压力、放松自己最行之有效的娱乐方式之一。
随着网络技术的快速发展,Flex网页小游戏以其界面美观、操作简单、无需安装、对硬件要求低等优点备受广大玩家的青睐。
因此,设计一款符合大众风格的网页小游戏具有重要意义。
在分析Flex游戏的基础上,首先通过游戏策划和需求分析确定游戏规则、界面布局和游戏所需实现的功能;然后用Flash Builder 4.6处理各种界面元素,完成游戏界面的制作;最后采用ActionScript3.0语言编程实现游戏选关、游戏开始、时间显示、得分显示、关卡显示、路径判断、图片消除、图片重置,以及重新开始和下一关等功能。
为了体现游戏的竞技性,增加趣味性,特设计Mysql数据库以保存玩家的得分及排名信息,用Java实现对数据库的直接操作,通过BlazeDs 插件连接Flex前端页面和后台Java代码,实现提交分数和查看排行榜的功能。
同时为了提高游戏性能,对路径判断算法进行了优化。
本文论述了网页游戏连连看的开发背景、意义,介绍了系统开发所使用的环境、工具以及开发语言,并对相关的开发技术进行了阐述。
重点论述了游戏策划、需求分析、详细设计、路径判断算法设计、代码实现和游戏测试的过程。
关键词:连连看,Flex,ActionScript3.0,B/S平顶山学院本科毕业设计Linkgame Development Based on Flex and JavaAbstractGame in today's society is becoming people to release pressure, relax the most effective way of a kind of entertainment. Along with the rapid development of network technology, the Flex web games, with its beautiful interface, easy operation, no installation is required, the advantages of low hardware requirements of the majority of players. Therefore, design a popular style of web games is of great significance.On the basis of analyzing the Flex game, first of all, through planning and demand analysis to determine the rules of the game, game interface layout and functionality needed for game; Then use Flash Builder 4.6 processing all kinds of interface elements, complete the game interface; Game selection is realized by using actionscript 3 language programming, game start, time display, scoring display, barriers, reset path elimination judgment, pictures, images, and start again the next level, and other functions. In order to reflect the athletics of the game, add interest, design the Mysql database to hold the player's score and ranking information, Use Java to realize the direct manipulation of the database, through the BlazeDs plugin connects Flex front-end and back-end Java code, submit scores and view the list of functions. At the same time to improve game performance, the path judgment algorithm is optimized.This paper discusses the web linkgame development background, significance, introduced the system development environment, tools, used by as well as the development language, and the development of related technology are expounded. Detailed discusses the planning, requirements analysis, detailed design, game path judgment algorithm design, code realization and game testing process.Keywords: linkgame, Flex, ActionScript3.0, B/S平顶山学院本科毕业设计目录1 绪论 (1)1.1 研究背景 (1)1.2 研究意义 (1)1.3 研究内容 (2)1.4 论文主要工作和结构安排 (2)1.5 本章小结 (2)2 相关技术及工具介绍 (3)2.1 Flex技术 (3)2.1.1 Flex介绍 (3)2.1.2 Flex的应用前景 (3)2.2 ActionScript语言 (4)2.2.1 ActionScript介绍 (4)2.2.2 ActionScript的优点 (5)2.3 Java语言 (5)2.4 BlazeDS技术 (6)2.5 开发工具 (6)2.5.1 Tomcat服务器 (6)2.5.2 Flash Builder (7)2.5.3 MyEclipse (7)2.5.4 MySQL (8)2.6 本章小结 (8)3 策划与需求分析 (9)3.1 游戏策划 (9)3.2 需求分析 (10)3.2.1 界面需求 (10)3.2.2 功能需求 (10)3.3 数据库需求 (17)3.4 本章小结 (17)4 设计与实现 (18)基于Flex和Java的网页小游戏连连看的开发4.1 总体设计 (18)4.2 详细设计和实现 (21)4.2.1 游戏界面 (21)4.2.2 级别选择 (22)4.2.3 游戏说明 (22)4.2.4 开始游戏 (23)4.2.5 图片区的显示 (24)4.2.6 关卡计时器 (24)4.2.7 得分记录 (24)4.2.8 关卡记录 (24)4.2.9 消除图片 (25)4.2.10 重置图片 (25)4.2.11 查看排行榜 (25)4.2.12 后台数据操作 (26)4.3 本章小结 (27)5 路径判断算法 (28)5.1 算法构思 (28)5.1.1 简化地图路径 (28)5.1.2 数组判断 (28)5.2 算法实现 (30)5.3 本章小结 (31)6 测试 (32)6.1 测试步骤 (32)6.1.1 界面测试 (32)6.1.2 功能测试 (32)6.2 测试结果 (34)6.3 测试分析 (34)6.4 本章小结 (34)7 结束语 (35)附录 (36)参考文献 (43)致谢 (44)平顶山学院本科毕业设计1 绪论连连看小游戏的开发是为了满足玩家休闲的需要。
基于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 ( ) :
连连看原理

用 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蔬菜连连看游戏程序设计组

《面向对象的程序设计》课程设计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();}}}}运行产生以下界面:。
连连看游戏分析设计与实现

连连看游戏分析设计与实现1.连连看(picture matching)游戏简介连连看游戏界面上均匀分布2N个尺寸相同的图片,每张图片在游戏中都会出现偶数次,游戏玩家需要依次找到两张相同的图片,而且这两张图片之间只用横线、竖线相连(连线上不能有其他图片),并且连线的条数不超过3条,那么游戏会消除这两个图片。
连连看是一款广受欢迎的小游戏,它具有玩法简单、耗时少等特征,尤其适合广大白领女性在办公室里休闲、放松.2。
分析连连看连连看是一个小的、简单的游戏程序,所以不需要大量的分析.首先,我们列出用例。
用例不多。
有:用户开始游戏,用户进行配对图片。
图1。
连连看用例图下一步就是为每个用例和相关场景写一个文本描述。
连连看相当简单,只有一个参与者,就是游戏玩家。
在使用这个程序的过程中也不会碰到出错的情况,所以场景也很短。
开始游戏的场景:玩家打开应用程序,点击“开始”按钮,会生成三种不同的图片排列方式(矩阵、竖向、横向排列).配对图片的场景:玩家对图片进行配对,配好后会消除这对图片。
当在规定的时间内配对完所有图片时,弹出胜利对话框,否则弹出失败对话框。
尽管只有2个简单用例,但它们确实揭示了我们所需完成的任务的重要方面。
大的应用程序会有更多的用例,有些更为复杂,有些一样简单。
用例导致了场景。
场景通常要比这个例子中的复杂,反映了在某项特征或功能上,用户和开发者之间的更为细节化的合约。
每个场景所需的细节程序取决于许多方面,但将场景写下来有助于确保每个人理解系统应该完成什么任务。
我们在连连看的用例和场景的呈现上不是太正规。
有时,这种非正规的方式和几张纸或白板就足够了。
更为正规的面向对象方法学在确定用例及相应场景方面有更正规的做法,也提供了特定的软件来创建和跟踪用例和场景。
3.(分析阶段)发现对象、属性和操作通过阅读问题描述以及实际情况,我们得到以下名词清单:图片,游戏视图,图片的排列方式,服务组件.包图通过对问题的声明的名词进行分析,我们得到游戏的包图:图2,连连看包图其中util包负责与图片加载有关的处理,view包负责呈现界面,Object包是整个游戏的配置参数,impl是图片的排列方式,board包含了整个游戏的面板类。
连连看算法及实现原理详解(C++源码)

void FunctionalModule::m_ColorToNum(HWND hwnd) //把像素转换为数组格式
{
HDC hdc=GetDC(hwnd);
break;
default:
break;
}
}
}
}
}
}
}
}
}
}
////////////////////////////////////////////////////////////////////////
int icolor=0;
COLORREF ccolor1,ccolor2;
for (int n1=0,nx=10;n1<5;n1++,nx-=5)
{
for (int m1=0,my=10;m1<5;m1++,my-=5)
int m_LeftTop(int ax,int ay,int bx,int by); //左上 11
int m_YLeft(int ax,int ay,int bx,int by); //y左 12
int m_LeftBottom(int ax,int ay,int bx,int by); //左下 13
{
ptLineOne.x=0;ptLineOne.y=0;//转折点的两个坐标设为0
ptLineTwo.x=0;ptLineTwo.y=0;
numTotal=(xLast+1)*(yLast+1);//图案总的个数
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
因为有朋友在站内信中问到连连看的具体算法,所以我就把算法post出来,这个算法也是参考网上Flash游戏的算法改写的,原来的参考信息已经找不到了,不过非常感谢那些无私的朋友。
改写的连连看算法如下:
前置条件:用一二维数组存放Map,-1表示没有图案可以连通,非-1表示不同的图案。
首先是横向检测:
Java代码
1.private boolean horizon(Point a, Point b)
2. {
3. if(a.x == b.x && a.y == b.y)//如果点击的是同一个图案,直
接返回false
4. return false;
5. int x_start = a.y <= b.y ? a.y : b.y;
6. int x_end = a.y <= b.y ? b.y : a.y;
7. for(int x = x_start + 1; x < x_end; x++)//只要一个不是
-1,直接返回false
8. if(map[a.x][x] != -1){
9. return false;
10. }
11. return true;
12. }
其次是纵向检测:
Java代码
1.private boolean vertical(Point a, Point b)
2.{
3. if(a.x == b.x && a.y == b.y)
4. return false;
5. int y_start = a.x <= b.x ? a.x : b.x;
6. int y_end = a.x <= b.x ? b.x : a.x;
7. for(int y = y_start + 1; y < y_end; y++)
8. if(map[y][a.y] != -1)
9. return false;
10. return true;
11.}
一个拐角的检测:
如果一个拐角能连通的话,则必须存在C、D两点。
其中C点的横坐标和A相同,纵坐标与B相同,D的横坐标与B相同,纵坐标与A相同。
Java代码
1.private boolean oneCorner(Point a, Point b)
2.{
3. Point c = new Point(a.x, b.y);
4. Point d = new Point(b.x, a.y);
5. if(map[c.x][c.y] == -1)
6. {
7. boolean method1 = horizon(a, c) && vertical(b, c);
8. return method1;
9. }
10. if(map[d.x][d.y] == -1)
11. {
12. boolean method2 = vertical(a, d) && horizon(b, d);
13. return method2;
14. } else
15. {
16. return false;
17. }
18.}
两个拐角的检测:
这个比较复杂,如果两个拐角能连通的话,则必须存在图中所示的连线,这些连线夹在A、B的横、纵坐标之间,这样的线就以下这个类存储,direct是线的方向,用0、1表示不同的方向
LIne类结构如下:
Java代码
1.class Line
2. {
3. public Point a;
4. public Point b;
5. public int direct;
6.
7. public Line()
8. {
9. }
10.
11. public Line(int direct, Point a, Point b)
12. {
13. this.direct = direct;
14. this.a = a;
15. this.b = b;
16. }
17. }
从A、B点的横纵两个方向进行扫描,就是Scan函数做的事情,把合适的线用LinkList存起来。
Java代码
1.private LinkedList scan(Point a, Point b)
2. {
3. ll = new LinkedList<Line>();
4. //Point c = new Point(a.x, b.y);
5. //Point d = new Point(b.x, a.y);
6. for(int y = a.y; y >= 0; y--)
7. if(map[a.x][y] == -1 && map[b.x][y] == -1 && vertic
al(new Point(a.x, y), new Point(b.x, y)))
8. ll.add(new Line(0, new Point(a.x, y), new Point
(b.x, y)));
9.
10. for(int y = a.y; y < map.row; y++)
11. if(map[a.x][y] == -1 && map[b.x][y] == -1 && vertic
al(new Point(a.x, y), new Point(b.x, y)))
12. ll.add(new Line(0, new Point(a.x, y), new Point
(b.x, y)));
13.
14. for(int x = a.x; x >= 0; x--)
15. if(map[x][a.y] == -1 && map[x][b.y] == -1 && horizo
n(new Point(x, a.y), new Point(x, b.y)))
16. ll.add(new Line(1, new Point(x, a.y), new Point
(x, b.y)));
17.
18. for(int x = a.x; x < map.column; x++)
19. if(map[x][a.y] == -1 && map[x][b.y] == -1 && horizo
n(new Point(x, a.y), new Point(x, b.y)))
20. ll.add(new Line(1, new Point(x, a.y), new Point
(x, b.y)));
21.
22. return ll;
23. }
最后是两个拐角的算法:
取出LinkList里面的线,测试A与B到该线的两点是否连通。
Java代码
1.private boolean twoCorner(Point a, Point b)
2.{
3. ll = scan(a, b);
4. if(ll.isEmpty())
5. return false;
6. for(int index = 0; index < ll.size(); index++){
7. Line line = (Line)ll.get(index);
8. if(line.direct == 1){
9. if(vertical(a, line.a) && vertical(b, line.b)){
10. return true;
11. }
12.
13. } else
14. if(horizon(a, line.a) && horizon(b, line.b)){
15. return true;
16. }
17. }
18. return false;
19.}
前面的函数有以下这个总的调用函数来调用,传入两个点,就可以判断这两个点是否符合连连看的算法了:
Java代码
1.public boolean checkLink(Point a,Point b){
2. if(map[a.x][a.y] != map[b.x][b.y])//如果图案不同,直接为
false
3. return false;
4. if(a.x == b.x && horizon(a, b))
5. return true;
6. if(a.y == b.y && vertical(a, b))
7. return true;
8. if(oneCorner(a, b))
9. return true;
10. else
11. return twoCorner(a, b);
12.}。