JAVA 连连看 源代码行行注释
连连看原理

用 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 常见注解Java 中的注解(Annotation)是一种代码标记机制,用于为代码添加元数据。
这些元数据可以在编译时或运行时被处理,用于生成代码、控制程序的运行逻辑或进行其他操作。
Java 提供了一些内置的注解,也支持自定义注解。
以下是一些常见的Java 注解:1.@Override: 用于指示一个方法是重写了父类中的方法。
如果被标记的方法并没有在父类中对应的方法,编译器会报错。
2.@Deprecated: 用于标记一个已过时的方法或类。
编译器会检查是否使用了过时的元素,并给出警告。
3.@SuppressWarnings: 用于抑制编译器警告。
4.@SafeVarargs: 用于声明一个泛型数组或可变参数的方法是类型安全的。
5.@FunctionalInterface: 用于标记一个接口是函数式接口,即该接口只包含一个抽象方法的接口。
6.@NotNull: 用于标注一个参数或返回值不是null。
7.@Nullable: 用于标注一个参数或返回值可以为null。
8.@CheckForNull: 用于检查一个值是否为null。
9.@Tested: 用于标记一个类或方法已经进行了测试。
10.@RunWith(Suite.class)和@Suite: 用于定义一个测试套件,将多个测试类组合在一起执行。
11.@ContextConfiguration: 用于加载Spring 配置文件。
12.@Autowired, @Resource, @Qualifier: 用于Spring 中的依赖注入。
13.@PostConstruct和@PreDestroy: 用于标记在构造函数之后和析构函数之前执行的方法。
14.@Transactional: 用于声明一个方法或类需要进行事务管理。
15.@Component, @Service, @Repository, @Controller: 用于标记Spring 中的组件,分别表示业务逻辑层、数据访问层、数据持久化层和表现层组件。
java 链式写法注解

Java 链式写法通常是通过在方法返回值上调用另一个方法来实现的。
这种写法可以让代码更加简洁、易读和易于维护。
下面是一个使用注解的Java 链式写法的示例:```javapublic class Person {private String name;private int age;private String address;@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +", age=" + age +", address='" + address + '\'' +'}';}public Person setName(String name) { = name;return this;}public Person setAge(int age) {this.age = age;return this;}public Person setAddress(String address) {this.address = address;return this;}}```在上面的代码中,我们定义了一个Person 类,并使用了链式写法的set 方法来设置属性值。
在每个set 方法中,我们返回当前对象的实例,以便可以在同一个对象上进行多个设置。
同时,我们还使用了注解@Override 来覆盖了toString 方法,以便在打印对象时能够以更友好的方式显示属性值。
连连看游戏编程教程

连连看游戏编程教程连连看游戏是一款经典的益智类游戏,其独特的游戏规则让玩家们在娱乐的同时提高了思维能力和反应速度。
本篇文章将为大家介绍如何使用Python语言编写一个简单的连连看游戏。
一、游戏规则的设计在开始编写代码之前,我们需要先设计游戏规则。
连连看游戏的目标是通过消除相同图标的配对来清空游戏界面上的所有方块。
具体的游戏规则如下:1. 游戏界面是一个矩阵,每个方块上都有一个图标。
2. 玩家需要通过连接相同图标的路径来消除方块。
路径只能在水平和垂直方向上进行连接,不能有其他方块阻挡。
3. 每次消除相同图标的方块会得到一定的分数,随着游戏的进行,剩余方块的数量会减少。
4. 游戏会根据玩家的分数和剩余方块数量进行评分和排名。
二、游戏界面的设计在编写代码之前,我们需要使用Python中的图形库创建游戏界面。
这里我们推荐使用Pygame库,它是一款功能强大且易于上手的游戏开发库。
首先,我们需要创建一个窗口以及游戏界面的矩阵。
可以使用Pygame库提供的Surface对象来创建窗口,并使用二维列表来表示游戏界面的矩阵。
接下来,我们需要在窗口中绘制游戏界面的方块和图标。
可以使用Pygame库提供的绘制函数来实现,通过循环遍历游戏界面的矩阵,根据方块的状态来选择绘制的图标。
可以使用不同的颜色或者图片来表示不同的图标。
三、游戏逻辑的设计游戏逻辑是编写连连看游戏的核心部分。
主要包括方块的生成、方块的选择和判断是否可以连接的函数。
首先,在游戏开始时,需要生成随机的方块,并将其放置在游戏界面的矩阵中。
然后,需要实现方块的选择函数,玩家可以通过鼠标点击方块来选择两个需要连接的方块。
可以使用Pygame库提供的事件监听函数来实现。
接下来,需要实现判断两个方块是否可以连接的函数。
主要通过判断两个方块之间是否有可连通的路径来判断它们是否可以连接。
可以使用BFS或DFS等搜索算法来实现。
最后,在两个方块成功连接后,需要将它们从游戏界面的矩阵中移除,并计算玩家得分。
JAVA代码注释规范

JAVA代码注释规范目录JA V A代码注释规范 (1)注释的原则 (1)注释的简洁 (1)注释的一致性 (1)注释的位置 (2)注释的数量 (2)删除无用注释 (2)复杂的注释 (2)多余的注释 (2)必加的注释 (3)JA V A注释技巧 (3)JA V A注释具体实现 (4)源文件注释 (4)类(模块)注释: (5)接口注释: (5)构造函数注释: (6)方法注释: (6)方法内部注释: (7)全局变量注释: (7)局部(中间)变量注释: (7)常量 (7)p.s. 注释使用统一的注释文件 (8)注释的原则注释形式统一在整个应用程序中,使用具有一致的标点和结构的样式来构造注释。
如果在其他项目组发现他们的注释规范与这份文档不同,按照他们的规范写代码,不要试图在既成的规范系统中引入新的规范。
注释的简洁内容要简单、明了、含义准确,防止注释的多义性,错误的注释不但无益反而有害。
注释的一致性在写代码之前或者边写代码边写注释,因为以后很可能没有时间来这样做。
另外,如果有机会复查已编写的代码,在今天看来很明显的东西六周以后或许就不明显了。
通常描述性注释先于代码创建,解释性注释在开发过程中创建,提示性注释在代码完成之后创建。
修改代码的同时修改相应的注释,以保证代码与注释的同步。
注释的位置保证注释与其描述的代码相邻,即注释的就近原则。
对代码的注释应放在其上方相邻或右方的位置,不可放在下方。
避免在代码行的末尾添加注释;行尾注释使代码更难阅读。
不过在批注变量声明时,行尾注释是合适的;在这种情况下,将所有行尾注释要对齐。
注释的数量注释必不可少,但也不应过多,在实际的代码规范中,要求注释占程序代码的比例达到20%左右。
注释是对代码的“提示”,而不是文档,程序中的注释不可喧宾夺主,注释太多了会让人眼花缭乱,注释的花样要少。
不要被动的为写注释而写注释。
删除无用注释在代码交付或部署发布之前,必须删掉临时的或无关的注释,以避免在日后的维护工作中产生混乱。
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中获取类注释和方法注释的方法。
二、获取类注释1. 使用反射机制在Java中,可以使用反射机制来获取类的注释信息。
通过反射可以获取类的所有信息,包括注释。
下面是一个简单的示例:```javaClass clazz = Class.forName(.example.TestClass");String classComment =clazz.getCanonicalName().getClass().getAnnotation(Comment.cl ass).value();System.out.println("类注释:" + classComment);```2. 使用工具类除了使用反射机制,还可以使用一些Java类库提供的工具类来获取类的注释。
可以使用Apache Commons Lang库中的ClassUtils类来获取类的注释:```javaString classComment =ClassUtils.getShortClassName(TestClass.class) + " - " + ClassUtils.getPackageCanonicalName(TestClass.class); System.out.println("类注释:" + classComment);```三、获取方法注释1. 使用反射机制和获取类注释类似,使用反射机制也可以获取方法的注释信息。
下面是一个简单的示例:```javaClass clazz = Class.forName(.example.TestClass");Method[] methods = clazz.getDeclaredMethods();for (Method method : methods) {if (method.isAnnotationPresent(Comment.class)) {String methodComment =method.getAnnotation(Comment.class).value();System.out.println("方法注释:" + methodComment);}}```2. 使用工具类同样地,可以使用一些Java类库提供的工具类来获取方法的注释。
java 注释标准
java 注释标准在Java开发中,注释被广泛应用于代码的编写与维护过程中。
通过注释,开发人员可以为自己的代码添加解释说明,方便其他开发人员理解和使用代码。
本文将介绍Java中常用的注释标准,以及它们的使用方法与注意事项。
一、单行注释单行注释以"//"开头,用于对单行代码进行解释说明。
它可以出现在代码的任何位置,对该行代码进行注释,不会影响代码的执行。
例如:```javaint x = 10; // 定义一个整型变量x,初始值为10二、多行注释多行注释以"/*"开头,以"*/"结尾,用于对多行代码进行注释。
多行注释常用于对函数、类或一段代码的功能进行描述。
例如:```java/** 计算两个整数的和* @param a 整数1* @param b 整数2* @return 两个整数的和*/public int add(int a, int b) {return a + b;}三、文档注释文档注释以"/**"开头,以"*/"结尾,用于对类、接口、方法、字段等进行详细的描述。
文档注释是Java API文档的一部分,在生成API 文档时会被提取出来。
例如:```java/*** 学生类*/public class Student {/*** 学生姓名*/private String name;/*** 获取学生姓名* @return 学生姓名*/public String getName() {return name;}/*** 设置学生姓名* @param name 学生姓名*/public void setName(String name) { = name;}}四、注释的使用方法与注意事项1. 注释应该简洁明了,使用清晰的语言描述代码的功能、用途、参数、返回值等信息,以便其他开发人员理解和使用。
2. 注释应该与代码保持同步更新,避免注释与代码不一致的情况发生。
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。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
所实现应用的功能及具体实现. 需求规定退出:退出界面,停止游戏。
重列:重新排列按键。
再来一局:重新开始一局,分数不重计。
运行环境硬件要求:普通计算机即可。
操作系统:windows XP,windows 7 等开发环境:Myeclipse 8.5流程图实现思路1:将整张地图拆分为n行m列,接着用一个二维数组表示将在地图中显示什么,例如0表示此处没有东西(如果两个按键可以消除时,就可以将数组中对应的元素赋为0)。
2:游戏中需要处理鼠标按下时间和获取鼠标当前点击坐标信息。
3:如果其在地图范围内按下某个按键,则将其转换为在二维数组中对应的行和列。
4:游戏关键就是如何判断两张图片可以消除,这也是连连看游戏的关键吧。
在这个简单连连看中可以直接比较两个按键标示的数字,如果数字相等则可以消去,如果不相等则不能消去。
我们可以将开始点的前后左右四个方向的结点都推入队列中,继续查看其前后左右的前后左右,如果其中有为0的(代表此处没有图片,存在通路),还是元素值和开始点相同的都推入队列中。
在判断前后左右时就可以对转弯次数进行累加了,如果还是原来的方向,则保持转弯次数不变,否则转弯次数+1。
如果搜索的过程中,发现存在转弯的次数少于或者等于2的,且其结点信息和结束点一样,代表我们已经找到了开始点和结束点之间的通路了,这时也就是两个按键可以消去了。
5:如何画出两张图片消去的路径呢,我的思路是这样的,每次寻找到一个新结点时,我们可以将其上一步结点的信息也保存下来,这样当我们找到结束点时,我们就可以沿着相反的方向,搜索回去,找出原来的整条路径。
代码介绍及分析。
package test;import javax.swing.*; //AWT的扩展import java.awt.*; //抽象窗口工具包import java.awt.event.*;class lianliankan implements ActionListener //实现ActionListener接口{JFrame mainFrame; //主面板,JFrame定义的是一个容器,可向里面添加组件Container thisContainer; //定义一个容器JPanel centerPanel,southPanel,northPanel; //子面板,JPanel是个轻量级容器,可添加入JFrame中JButton diamondsButton[][] = new JButton[6][5];//定义存储游戏按钮的数组JButton exitButton,resetButton,newlyButton; //定义退出,重列,重新开始按钮JLabel fractionLable=new JLabel("0"); //定义分数标签,并初始化为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(){ //init方法mainFrame=new JFrame("连连看"); //定义主面板为命名为“连连看”的JFrame容器thisContainer = mainFrame.getContentPane(); //初始化mainFrame. thisContainer.setLayout(new BorderLayout()); //定义布局为东西南北中的形式centerPanel=new JPanel(); //初始化centerPanelsouthPanel=new JPanel(); //初始化southPanelnorthPanel=new JPanel(); //初始化northPanelthisContainer.add(centerPanel,"Center"); //将centerPanel加入mainFrame中的Center位置thisContainer.add(southPanel,"South"); //将southPanel加入mainFrame中的South位置thisContainer.add(northPanel,"North"); //将northPanel加入mainFrame中的North位置centerPanel.setLayout(new GridLayout(6,5)); //将centerPanel初始化为6*5的网格布局for(int cols = 0;cols < 6;cols++){ //依次对第0列到第5列进行操作for(int rows = 0;rows < 5;rows++ ){ //依次对第0行到第4行进行操作diamondsButton[cols][rows]=newJButton(String.valueOf(grid[cols+1][rows+1])); //新建按钮diamondsButton[cols][rows].addActionListener(this);//向此按键添加动作监听以接收来自它的动作centerPanel.add(diamondsButton[cols][rows]);//将按键添加到centerPanel中}}exitButton=new JButton("退出"); //新建“退出”按钮exitButton.addActionListener(this); //向“退出”按钮添加事件监听resetButton=new JButton("重列"); //新建“重列”按钮resetButton.addActionListener(this); //向“重列”按钮添加事件监听newlyButton=new JButton("再来一局"); //新建“再来一局”按钮newlyButton.addActionListener(this); //向“再来一局”按钮添加事件监听southPanel.add(exitButton); //将“退出”按钮添加到southPanel southPanel.add(resetButton); //将“重列”按钮添加到southPanel southPanel.add(newlyButton); //将“再来一局”按钮添加到southPanel fractionLable.setText(String.valueOf(Integer.parseInt(fractionLable.g etText())));northPanel.add(fractionLable); //将“分数”标签加入northPanel mainFrame.setBounds(280,100,500,450); // x:X轴上的起点,y:Y轴上的起点,width:长度, height:宽度mainFrame.setVisible(true); //框架可见}public void randomBuild() {int randoms,cols,rows;for(int twins=1;twins<=15;twins++) {randoms=(int)(Math.random()*25+1); //在1-25之间随机产生一个数字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.g etText())+100));//在原有数字上加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]; //将现在任然存在的数字存入save中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]; //将save中的数字放入所选择的的格子中n--;}mainFrame.setVisible(false);pressInformation=false; //这里一定要将按钮点击信息归为初始init(); //调用initfor(int i = 0;i < 6;i++){for(int j = 0;j < 5;j++ ){if(grid[i+1][j+1]==0) //如果格子的值为0diamondsButton[i][j].setVisible(false); //则按键不可见}}}public void estimateEven(int placeX,int placeY,JButton bz){if(pressInformation==false) //尚未有按键被选中{x=placeX;y=placeY;secondMsg=grid[x][y]; //将该键的值存储到secondMsgsecondButton=bz; //令secondButton为按下的键pressInformation=true; //标示已经有键被选中}else { //已经有按键被选中x0=x; //将second中的值转存到firsty0=y;fristMsg=secondMsg;firstButton=secondButton;x=placeX;y=placeY; //将该键存入secondsecondMsg=grid[x][y];secondButton=bz;if(fristMsg==secondMsg&& secondButton!=firstButton){ //如果两个格子数字相等且格子不相同xiao(); //调用xiao方法}}}public void xiao() {if((x0==x &&(y0==y+1||y0==y-1)) || ((x0==x+1||x0==x-1)&&(y0==y))){ //判断是否相邻remove(); //调用remove}else{for (j=0;j<7;j++ ) {if (grid[x0][j]==0){ //判断第一个按钮同行哪个按钮为空if (y>j) { //如果第二个按钮的Y坐标大于空按钮的Y坐标说明第一按钮在第二按钮左边for (i=y-1;i>=j;i-- ){ //判断第二按钮左侧直到第一按钮中间有没有按钮if (grid[x][i]!=0) {k=0;break;}else{ k=1; } //K=1说明通过了第一次验证}if (k==1) {linePassOne();}}if (y<j){ //如果第二个按钮的Y坐标小于空按钮的Y坐标说明第一按钮在第二按钮右边for (i=y+1;i<=j ;i++ ){ //判断第二按钮左侧直到第一按钮中间有没有按钮if (grid[x][i]!=0){k=0;break;}else { k=1; }}if (k==1){linePassOne();}}if (y==j ) {linePassOne();}}if (k==2) {if (x0==x) {remove();}if (x0<x) {for (n=x0;n<=x-1;n++ ) {if (grid[n][j]!=0) {k=0;}if(grid[n][j]==0 && n==x-1) { remove();}}}if (x0>x) {for (n=x0;n>=x+1 ;n-- ) {if (grid[n][j]!=0) {k=0;break;}if(grid[n][j]==0 && n==x+1) { remove();}}}}}for (i=0;i<8;i++ ) { //列if (grid[i][y0]==0) {if (x>i) {for (j=x-1;j>=i ;j-- ) {if (grid[j][y]!=0) {k=0;break;}else { k=1; }}if (k==1) {rowPassOne();}}if (x<i) {for (j=x+1;j<=i;j++ ) {if (grid[j][y]!=0) {break;}else { k=1; }}if (k==1) {rowPassOne();}}if (x==i) {rowPassOne();}}if (k==2){if (y0==y) {remove();}if (y0<y) {for (n=y0;n<=y-1 ;n++ ) {if (grid[i][n]!=0) {k=0;break;}if(grid[i][n]==0 && n==y-1) { remove();}}}if (y0>y) {for (n=y0;n>=y+1 ;n--) {if (grid[i][n]!=0) {k=0;break;}if(grid[i][n]==0 && n==y+1) { remove();}}}}}}}public void linePassOne(){if (y0>j){ //第一按钮同行空按钮在左边for (i=y0-1;i>=j ;i-- ){ //判断第一按钮同左侧空按钮之间有没按钮if (grid[x0][i]!=0) {k=0;break;}else { k=2; } //K=2说明通过了第二次验证}}if (y0<j){ //第一按钮同行空按钮在与第二按钮之间for (i=y0+1;i<=j ;i++){if (grid[x0][i]!=0) {k=0;break;}else{ k=2; }}}}public void rowPassOne(){if (x0>i) {for (j=x0-1;j>=i ;j-- ) {if (grid[j][y0]!=0) {k=0;break;}else { k=2; }}}if (x0<i) {for (j=x0+1;j<=i ;j++ ) {if (grid[j][y0]!=0) {k=0;break;}else { k=2; }}}}public void remove(){firstButton.setVisible(false); //第一个按键不可见secondButton.setVisible(false); //第二个按键不可见fraction(); //调用fraction,在当前分数上加100分pressInformation=false; //使该静态变量还原为falsek=0;grid[x0][y0]=0; //清除该游戏按钮grid[x][y]=0; //清除该游戏按钮}public void actionPerformed(ActionEvent e) {if(e.getSource()==newlyButton){ //如果newlyButton产生动作int grid[][] = new int[8][7]; //产生新的存储按键的数组this.grid = grid;randomBuild(); //调用randomBuildmainFrame.setVisible(false); //使当前mainFrame不可见pressInformation=false; //使该静态变量还原为falseinit(); //调用init}if(e.getSource()==exitButton) //如果exitButton产生动作System.exit(0); //退出程序if(e.getSource()==resetButton) //如果resetButton产生动作reload(); //调用reloadfor(int cols = 0;cols < 6;cols++){for(int rows = 0;rows < 5;rows++ ){if(e.getSource()==diamondsButton[cols][rows]) //如果游戏按键产生动作estimateEven(cols+1,rows+1,diamondsButton[cols][rows]); //调用estimateEven}}}public static void main(String[] args) {lianliankan llk = new lianliankan(); //初始化llk.randomBuild(); //调用randomBuildllk.init(); //调用init}}个人总结这次通过JAVA实现连连看这个小游戏,我遇到了很多困难,比如各种编译错误、代码错误等,但是我也学到了很多东西。