基于java的连连看游戏
- 格式:doc
- 大小:621.00 KB
- 文档页数:15
基于JAVA的《连连看》游戏一引言《连连看》游戏在网上种类非常多,比如《水果连连看》,《宠物连连看》等等,虽然版本各种各样,但是其基本玩法,或者说基本算法是相同的,就是显示一些图标,让用户依次去点击两个图标,如果这两个图标相同,并且这两个图标通过直线可以相连,或者通过直角相连,或者通过双折线相连就可以消掉,消掉所有图标即为胜利。
如图1所示:图1 正在进行中的连连看游戏通过该游戏的制作,我们可以对Java的基础语法、Java图形界面以与简单的算法设计有一个比较全面的了解。
二设计要求为了避免叙述的繁琐,我们只实现连连看游戏的基本功能,如下:●制作如图1所示的游戏界面,尽量做到美观大方,使用方便●当两个图标相同,且通过直线相连、直角相连、双折线相连时,能够消掉图标●能够让游戏随时暂停,然后继续●当游戏进行到一定程度,无法消除剩余图标时,要能够提供重排功能对图标进行重排,从而让游戏继续进行三实现思路我们先讲一下程序中的几个难点,主要是说清楚具体的实现思路,具体的代码会在文后给出,大家可以参考。
1、界面设计需要实现如图2所示的界面:图 2 连连游戏界面整个界面分为三个区域:菜单区、功能区、游戏区。
首先在窗体上放置三个面板JPanel,分别存放三个区域,如图3所示:图3 界面的设计系统菜单区放置菜单即可,用户游戏区放置一个8*9的按钮数组来构成游戏界面,用户交互区放置开始,暂停等功能按钮以与提示信息。
2、生成游戏区运行程序后,游戏区并不显示按钮数组,当点击开始按钮后,再自动生成。
在生成按钮时要求按钮上的图案是随机的,且每个图案必须是偶数,否则会出现无法消除的按钮。
如何实现呢?我们可以这样考虑:假设有12个图片,把图片名字按照数字序号从0到11命名;假设游戏区共72个按钮,那么产生36个12以内的随机数字(每个随机数字代表一个图片),放入一个ArrayList中,最后使用ArrayList的addAll方法对已经产生的36个随机数字复制一份,这样就获得了72个随机数字,并且是成对的。
基于java的连连看游戏设计与实现的研究报告随着信息化时代的发展和互联网的普及,网络游戏成为现代生活的重要组成部分之一,连连看游戏作为其中的佼佼者一直深受玩家们的喜爱。
本次研究以Java语言为基础,设计并实现了一款基于图形用户界面的连连看游戏,从游戏设计、编程实现以及测试三个方面进行详细介绍。
一、游戏设计该连连看游戏设计的基础是二维数组。
玩家通过鼠标点击选择两个同样的图片,连接它们的线路不能经过其他图标,且路径短优先。
游戏共18个关卡,每个关卡的难度依次递增,并拥有不同主题的图片素材。
二、编程实现该游戏使用Java Swing绘制图形用户界面,整个游戏主要包括五个类:Main、Game、Node、Action、Panel。
1.Main类:主要作用为程序入口。
通过创建Game对象启动游戏。
2.Game类:游戏类。
在该类中主要完成游戏的初始化、监听器、关卡切换、连通性判断等操作。
3.Node类:节点类。
主要用于表示每一个图标,包括坐标以及图标种类等信息。
4.Action类:动作类。
主要用于计算玩家所选的两点是否可以连通。
5.Panel类:面板类。
界面主要交由Panel完成。
在该类中完成了界面布局、游戏信息展示等工作。
三、测试在游戏的测试过程中,主要测试了游戏的各个关卡能否正常切换和连通性判断能否正常运行。
此外,还通过在不同操作系统和不同分辨率下的测试,保证了游戏适用性和兼容性。
四、总结本次研究成功地设计并实现了一款基于Java的连连看游戏。
通过该游戏的设计与实现过程,进一步深入了解了Java编程语言以及Swing界面库的应用与优势。
最终测试结果表明,该游戏在各种操作系统和分辨率下均表现出良好的兼容性和适用性,可供广大玩家使用。
但仍有一些不足之处,需要进一步完善和优化。
在本次基于Java的连连看游戏设计与实现研究中,我们对玩家游戏数据进行了收集与分析。
具体数据如下:1. 游戏总胜利次数:1022. 最高得分:97633. 游戏失败次数:464. 游戏累计时间:20小时15分通过对这些游戏数据的分析,我们可以得出以下结论:1. 游戏整体受欢迎度较高,玩家胜利次数较多。
连连看游戏java课程设计一、课程目标知识目标:1. 理解Java语言中面向对象编程的基本概念,如类、对象、继承、封装等;2. 学会使用Java编写连连看游戏的界面布局和逻辑控制;3. 掌握运用Java集合框架处理游戏数据结构;4. 了解Java事件处理机制,并能应用于游戏交互。
技能目标:1. 能够运用面向对象的方法设计游戏类和对象,实现游戏功能;2. 独立编写连连看游戏的界面和逻辑代码,完成一个完整的Java游戏项目;3. 学会使用集合框架优化游戏数据存储和访问;4. 提高问题分析、程序设计和调试能力。
情感态度价值观目标:1. 培养学生对编程的兴趣,激发创造力和创新能力;2. 培养学生合作学习、分享交流的良好习惯,提高团队协作能力;3. 强化学生的逻辑思维能力,提高解决实际问题的能力;4. 培养学生面对挑战时的积极态度,勇于克服困难,持续优化和完善自己的作品。
课程性质:本课程为信息技术学科选修课程,以项目为导向,注重实践操作和团队合作。
学生特点:学生具备一定的Java编程基础,对游戏开发有浓厚兴趣,具有较强的动手能力和创新能力。
教学要求:结合实际项目需求,引导学生运用所学知识解决问题,注重培养学生的编程能力和团队协作能力,提高学生的综合素质。
通过本课程的学习,使学生能够独立完成一个连连看游戏的Java课程设计。
二、教学内容1. 面向对象编程基础复习:复习Java中类与对象、继承、封装等基本概念,参考教材第二章。
2. 游戏界面设计:学习使用Java的Swing库设计连连看游戏界面,包括菜单、按钮、网格布局等,结合教材第四章。
- 界面组件及布局管理器;- 事件监听器和处理机制;- 图形和图标的使用。
3. 游戏逻辑实现:学习实现游戏核心逻辑,如数据结构设计、游戏规则、配对消除等,参考教材第六章。
- 集合框架的使用;- 算法实现(如查找、排序);- 游戏流程控制。
4. 游戏对象设计:设计游戏中的对象类,如卡片类、游戏引擎类等,运用封装、继承等面向对象原则,参考教材第三章。
基于java下的连连看小游戏程序package mybase.programe;/** lianliankan总体算法思路:由两个确定的按钮。
若这两个按钮的数字相等,就开始找它们相连的路经。
这个找路经* 分3种情况:(从下面的这三种情况,我们可以知道,需要三个检测,这三个检测分别检测一条直路经。
这样就会有* 三条路经。
若这三条路经上都是空按钮,那么就刚好是三种直线(两个转弯点)把两个按钮连接起来了)* 1.相邻** 2. 若不相邻的先在第一个按钮的同行找一个空按钮。
1).找到后看第二个按钮横向到这个空按钮* 所在的列是否有按钮。
2).没有的话再看第一个按钮到与它同行的那个空按钮之间是否有按钮。
3).没有的话,再从* 与第一个按钮同行的那个空按钮竖向到与第二个按钮的同行看是否有按钮。
没有的话路经就通了,可以消了.** 3.若2失败后,再在第一个按钮的同列找一个空按钮。
1).找到后看第二个按钮竖向到这个空按钮所在的行是否有按钮。
* 2).没有的话,再看第一个按钮到与它同列的那个空按钮之间是否有按钮。
3).没有的话,再从与第一个按钮同列的* 那个空按钮横向到与第二个按钮同列看是否有按钮。
没有的话路经就通了,可以消了。
** 若以上三步都失败,说明这两个按钮不可以消去。
*/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; // 分别记录两次被选中的按钮// 储存游戏按钮位置(这里其实只要6行,5列。
基于Java的图片连连看游戏设计研究基于Java的图片连连看游戏设计研究摘要:连连看(Link Up)游戏是一款经典的益智游戏,通过消除相同的图案来获得分数。
本文基于Java编程语言,对连连看游戏的设计进行深入研究。
通过实现游戏的基本功能和特色功能,对游戏进行优化和改进,提升游戏的用户体验。
通过实践验证,本设计具有一定的可行性和实用性。
1. 引言连连看游戏是一种非常受欢迎的益智游戏,其规则简单,操作容易上手。
随着移动互联网的快速发展,游戏市场越来越庞大。
设计一款基于Java的图片连连看游戏,可以满足用户对游戏的需求,同时也是提升自己编程能力的学习机会。
2. 游戏的基本功能设计2.1 游戏界面设计游戏主界面分为游戏区和得分区。
游戏区由多个方格组成,每个方格里面有一张图案,玩家需要通过点击两个相同的图案来消除它们。
得分区显示玩家的得分、剩余时间和游戏关卡等信息。
2.2 游戏规则设计游戏开始时,系统会随机生成一定数量的图案并填充到游戏区中。
玩家需要通过连接相同的图案来消除它们,直到清空游戏区中所有的图案。
连接两个图案的连线只能是水平或垂直直线,并且在连线路径上不能有其他图案阻挡。
玩家每消除一对图案,得分增加,游戏关卡随之升级。
如果无法连接两个图案,玩家可以使用提示功能获取一定的帮助。
3. 游戏特色功能设计3.1 计时功能游戏设置了一个倒计时器,玩家需要在规定的时间内完成游戏。
当倒计时为0时,游戏结束,系统会显示玩家的得分和游戏结束画面。
3.2 关卡功能游戏设计了多个关卡,每个关卡的游戏难度和图案数量都不同。
玩家需要通过完成前一关卡的要求才能解锁下一关卡。
3.3 提示功能当玩家遇到无法连接的图案时,可以使用提示功能,系统会自动给出可以连接的图案,并帮助玩家找到解决方案。
4. 游戏的优化与改进4.1 性能优化在游戏的设计过程中,需要考虑到游戏的性能问题。
通过合理的算法设计和资源管理,减少游戏的内存占用和运行时的开销,提高游戏的运行速度和流畅度。
本科毕业设计(论文)题目:基于java的连连看游戏的设计与实现专题题目:学院:软件学院专业:软件工程班级:软件冶金学号:学生:指导教师:职称:指导教师:职称:时间:年月日江西理工大学本科毕业设计(论文)任务书软件学院软件工程题目:基于java的连连看游戏的设计与实现专题题目(若无专题则不填):原始依据(包括设计(论文)的工作基础、研究条件、应用环境、工作目的等):●工作基础已经熟练的掌握java的各种基本技能,能够完成一款简单的基于java的连连看游戏的设计与实现。
●研究条件MyEclipse或者Eclipse和jdk 7的环境下编写整体的代码,用photoshop为游戏提供大量精致的图片素材。
●应用环境java当今最流行的语言,完全能够实现连连看游戏,硬件要求也不高,所以可行性是没有问题。
●工作目的连连看这款游戏的最基本架构,是如何实现消除相同的图片,并且如何有效的最短的消除路径。
主要内容和要求:(包括设计(研究)内容、主要指标与技术参数,并根据课题性质对学生提出具体要求):●研究内容1.用户登录注册系统(选做)2.游戏的基本逻辑实现(必做)3.游戏排行榜系统(必做)4.游戏的有难度梯度效果(必做)5.游戏的界面设计(必做)●主要技术指标与技术参数能够完整的完成游戏的体验成为可以娱乐的游戏。
具体要求独立完成本项目系统研制过程,系统能够顺利运行,并独立完成论文报告。
日程安排:1、1、毕业设计开题2016年3月30日前完成2、第一、二周需求分析3、第三、四周概要设计4、第五、六周详细设计5、第七、八、九周系统开发6、第十周系统测试7、第十一、十二周毕业设计论文整理8、提交毕业论文2016年5月8日前完成主要参考文献和书目:[1]Cay S. Horstmann, Gary Cornell .Java核心技术[M].北京:机械工业出版社,2014.[2]Bruce·编程思想(第4版)[M].北京:机械工业出版社,2007.[3]孙涌.现代软件工程[M].北京:北京希望电子出版社,2003.[4]赵满来.可视化Java GUI程序设计[M].北京:清华大学出版社,2010.[5]David Wallace 游戏高级编程[M].北京:清华大学出版社,2005.[6]王鹏.JavaSwing图形界面开发与案例详解[M].北京:清华大学出版社,2008.指导教师签字:年月日教研室主任签字:年月日江西理工大学本科毕业设计(论文)开题报告软件学院软件工程专业软题目:基于java的连连看游戏的设计与实现专题题目(若无专题则不填):本课题来源及研究现状:●课题来源:小游戏制作的目的是满足人们休闲的需要,在紧张工作之余休闲类的游戏可以给人带来最大程度的放松,也可以增进人们之间的交流。
Java程序课程设计任务书1、主要内容:本程序基本实现了小游戏连连看的功能,玩家找出游戏中2个相同图案的方块,如果它们之间的连接线不多于3根直线,则将其连接起来,就可以成功将图案相同的方块消除,否则不会消失,当游戏中已没有满足条件的图案时,点击重列,可重新排序,游戏结束会跳出所得分数,该游戏的特点是与自己竞争,超过自己之前所创纪录。
2、具体要求(包括技术要求等):a. 该游戏界面为方格类型,由纵6横7的直线平行垂直交叉组成,分别是6行5列方块拼接,共有30格小方块。
方块上随机分布一些数字,数字的要求是至少两两相同,位置随机打乱。
b.当将相同数字的方块连接,但要满足只能至少单边无阻碍呈直线趋势连接,否则无效,若连接一对成功就消失于界面,继续游戏,直到游戏结束,并能返回所得分数。
c. 重列按钮(帮助)的功能:游戏过程中,遇到困难难以寻找下一符合要求的一对数字,可按左下按钮重置重新排列方可继续游戏。
d. 退出按钮:击左下方的“退出游戏”按钮,即可结束游戏。
e.运用基于SWING的图形用户界面设计知识等。
3、学习并掌握以下技术:Java等4、熟练使用以下开发工具:Jcreate 等实现系统上述的功能。
三、计划进度12月28日-12月29 日:课程设计选题,查找参考资料12月30日-12月31日:完成需求分析、程序设计1月1日-1月3日:完成程序代码的编写1月4日-1月6日:系统测试与完善1月7日-1月8日:完成课程设计报告,准备答辩四、主要参考文献[1] (美)埃克尔著陈昊鹏,饶若楠等译. Java编程思想[J]. 机械工业出版社,2005[2](美)Gary J.Bronson著张珑刘雅文译. Java编程原理[J]. 清华大学出版社,2004[3](美)Michael Morrison著徐刚,于健,薛雷译. 游戏编程入门[J]. 人民邮电出版社,2005.9[4](美)Wendy Stahler著冯宝坤,曹英译. 游戏编程中的数理应用[J]. 红旗出版社,2005[5](美)克罗夫特(David Wallace Croft)著彭晖译. Java游戏高级编程[J]. 清华大学出版社,2005[6](美)David Brackeen著邱仲潘译. Java游戏编程[J]. 科学出版社,2004[7] 聂庆亮编著. Java应用开发指南[J]. 清华大学出版社,2010[8] 耿祥义,张跃平编著. Java面向对象程序设计[J]. 清华大学出版社,2010[9] 杨绍方编著. Java编程实用技术与案例[J]. 清华大学出版社,2000.11[10] 明日科技编著. Java编程全能词典[J]. 电子工业出版社,2010摘要随着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的《连连看》游戏一引言《连连看》游戏在网上种类非常多,比如《水果连连看》,《宠物连连看》等等,虽然版本各种各样,但是其基本玩法,或者说基本算法是相同的,就是显示一些图标,让用户依次去点击两个图标,如果这两个图标相同,并且这两个图标通过直线可以相连,或者通过直角相连,或者通过双折线相连就可以消掉,消掉所有图标即为胜利。
如图1所示:图1 正在进行中的连连看游戏通过该游戏的制作,我们可以对Java的基础语法、Java图形界面以及简单的算法设计有一个比较全面的了解。
二设计要求为了避免叙述的繁琐,我们只实现连连看游戏的基本功能,如下:●制作如图1所示的游戏界面,尽量做到美观大方,使用方便●当两个图标相同,且通过直线相连、直角相连、双折线相连时,能够消掉图标●能够让游戏随时暂停,然后继续当游戏进行到一定程度,无法消除剩余图标时,要能够提供重排功能对图标进行重排,从而让游戏继续进行三实现思路我们先讲一下程序中的几个难点,主要是说清楚具体的实现思路,具体的代码会在文后给出,大家可以参考。
1、界面设计需要实现如图2所示的界面:图 2 连连游戏界面整个界面分为三个区域:菜单区、功能区、游戏区。
首先在窗体上放置三个面板JPanel,分别存放三个区域,如图3所示:图3 界面的设计系统菜单区放置菜单即可,用户游戏区放置一个8*9的按钮数组来构成游戏界面,用户交互区放置开始,暂停等功能按钮以及提示信息。
2、生成游戏区运行程序后,游戏区并不显示按钮数组,当点击开始按钮后,再自动生成。
在生成按钮时要求按钮上的图案是随机的,且每个图案必须是偶数,否则会出现无法消除的按钮。
如何实现呢?我们可以这样考虑:假设有12个图片,把图片名字按照数字序号从0到11命名;假设游戏区共72个按钮,那么产生36个12以内的随机数字(每个随机数字代表一个图片),放入一个ArrayList中,最后使用ArrayList的addAll方法对已经产生的36个随机数字复制一份,这样就获得了72个随机数字,并且是成对的。
因为一个数字对应一个图片,所以72个按钮需要的图片就生成了。
代码如下:Random random = new Random();int imagenum = ROW * COL;for(int i=0; i<imagenum/2; i++){imageIndex.add(random.nextInt(12)+"");// 生成随机数索引放入集合}imageIndex.addAll(imageIndex);// 连接集合使每个索引都是成偶数的3、联通消除点击相连且图片相同的两个按钮可以把两个按钮消除掉。
相连有三种情况:直线相连,直角相连,双折线相连。
要消掉相同图标的按钮,首先要想办法判断两个按钮的图标是否相同,这里提示大家一个方法:按钮有个setActionCommand方法和getActionCommand,把图标名字设置为一个按钮的ActionCommand,然后通过对比两个按钮的ActionCommand就可以知道是否具有相同的图标。
消除按钮就要判断两个按钮是否连通,连通有三种情况,对应三种算法,下面详细说明。
算法判断两个点是否连通,那如何跟两个按钮建立联系呢?按钮的位置就可以视作一个点(java中用Point类表示一个点)。
这样用一个点代表按钮位置,用ActionCommand代表按钮上的图标。
就很容易操作了。
下面我们先说清楚实现原理,具体代码一会在给出。
(1)直线相连:只要两点之间横坐标或纵坐标相同,即表示两点在同行或同列;然后判断两点之间有没有障碍,无则联通。
(2)直角相连:两个点的坐标可以生成一个新的点,如果两点都可以与该新点联通,则说明联通。
注意:新点有两个,如图所示一个,另外喇叭图标处也可以生成一个,但是因为喇叭图标处不是空点,因此不用该点。
但在实际中,新点的两种可能都要考虑到,那个能用用那个。
(3)双折线相连:在单击的第一点处,向四个方向搜索有无空点,如果有则生成一个新点,如果该新点与另一个按钮联通(直角联通),则说明联通。
如果该新点不能与按钮连通,则继续向该新点的方向前进一个位置,再次判断该位置是否为空点,是否可以和另一个按钮连通,以此类推。
4、重排当游戏进行到一定程度,剩余的按钮无法消掉,这时就需要对按钮位置进行重新排列,从而让游戏继续进行。
解决这一问题的思路如下:首先对所有按钮进行搜索,把剩余按钮的ActionCommand(ActionCommand和该按钮显示的图片序号一致,如果按钮被消掉则ActionCommand为空)放入一个集合内;然后依次搜索剩余按钮,找到一个剩余按钮后,保持按钮的位置不动,从集合中随机取出一个ActionCommand赋给该按钮,这样就完成了对剩余按钮的重排。
四具体实现打开Eclipse,新建一个类LinkGame,该类继承自JFrame,并且需要实现ActionListener方法。
public class LinkGame extends JFrame implements ActionListener{}在该类中添加如下变量和方法,见表1和表2。
表1 LinkGame类中的成员变量变量类型变量名说明final static int ROW游戏区8行9列共72个按钮final static int COL表 2 LinkGame类中的方法上述方法的具体实现如下:1、构造方法// 构造方法建立游戏界面public LinkGame() {this.setSize(780, 500);this.setTitle("连连看游戏");this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);addmyMenu(); // 添加菜单addFunctionPanel(); // 添加功能区this.setVisible(true);}2、菜单菜单的功能均没有实现,读者可以自行添加。
// 添加菜单public void addmyMenu() {JMenuBar menuBar = new JMenuBar();this.setJMenuBar(menuBar);JMenu menuGame = new JMenu("游戏");JMenu menuSet = new JMenu("设置");JMenu menuHelp = new JMenu("帮助");menuBar.add(menuGame);menuBar.add(menuSet);menuBar.add(menuHelp);menuGame.add(new JMenuItem("打开"));menuGame.add(new JMenuItem("保存"));menuGame.add(new JMenuItem("退出"));menuSet.add(new JCheckBoxMenuItem("音乐开关"));JMenu choice = new JMenu("难度选择");menuSet.add(choice);menuSet.add(new JMenuItem("背景色"));menuSet.add(new JMenuItem("提示"));menuHelp.add(new JMenuItem("关于", new ImageIcon("image/2.gif")));menuHelp.addSeparator();menuHelp.add(new JMenuItem("帮助"));ButtonGroup group = new ButtonGroup();JRadioButtonMenuItem rbm1 = new JRadioButtonMenuItem("初级难度");JRadioButtonMenuItem rbm2 = new JRadioButtonMenuItem("中级难度");JRadioButtonMenuItem rbm3 = new JRadioButtonMenuItem("高级难度");group.add(rbm1);group.add(rbm2);group.add(rbm3);choice.add(rbm1);choice.add(rbm2);choice.add(rbm3);}3、功能区和游戏区的界面// 添加功能区public void addFunctionPanel() {start.setPreferredSize(new Dimension(150, 50));pause.setPreferredSize(new Dimension(150, 50));conti.setPreferredSize(new Dimension(150, 50));hint.setPreferredSize(new Dimension(150, 50));timecount.setPreferredSize(new Dimension(150, 50));timestr.setPreferredSize(new Dimension(150,50));timestr.setFont(new Font("隶书",Font.BOLD,28));timecount.setFont(new Font("隶书",Font.BOLD,28));timecount.setForeground(Color.yellow);timestr.setForeground(Color.yellow);start.addActionListener(this);pause.addActionListener(this);conti.addActionListener(this);hint.addActionListener(this);functionPanel.setPreferredSize(new Dimension(200, 500));functionPanel.setBackground(Color.BLUE);functionPanel.setLayout(new FlowLayout(FlowLayout.CENTER, 5, 20));functionPanel.add(timestr);functionPanel.add(timecount);functionPanel.add(start);functionPanel.add(pause);functionPanel.add(conti);functionPanel.add(hint);this.add(functionPanel, BorderLayout.EAST);}// 添加游戏区public void addGamePanel() {gamePanel.setPreferredSize(new Dimension(580, 500));gamePanel.setLayout(new GridLayout(ROW, COL));gamePanel.setBackground(Color.RED);Random random = new Random();int imagenum = ROW * COL;for(int i=0; i<imagenum/2; i++){imageIndex.add(random.nextInt(12)+"");// 生成随机数索引放入集合}imageIndex.addAll(imageIndex);// 连接集合使每个索引都是成偶数的int num=0; //记录从集合中取出的图标做引数for (int i = 0; i < ROW; i++) {for (int j = 0; j < COL; j++) {String newNumber = imageIndex.get(num++);dots[i][j] = new JButton("", new ImageIcon("image/" + newNumber+ ".png"));dots[i][j].addActionListener(new ButtonEvents()); // 事件监听注册dots[i][j].setActionCommand(newNumber); // 设置按钮的actioncommand名gamePanel.add(dots[i][j]);}}this.add(gamePanel, BorderLayout.WEST);}4、单击游戏区按钮激发的事件// 事件类,监听按钮单击事件private class ButtonEvents implements ActionListener {public void actionPerformed(ActionEvent e) {count++;for (int i = 0; i < ROW; i++) {for (int j = 0; j < COL; j++) {if (e.getSource() == dots[i][j]) {Point p = new Point(i, j); // 单击按钮则把按钮位置封入p中list.add(p); // 点p放入集合list中}}}if (count % 2 == 0) { // 如果是偶数次单击按钮p1 = list.getFirst(); // 从集合中取出代表两个按钮的点p2 = list.getLast();// 如果两次点击的是同一个按钮if(p1.x == p2.x && p1.y == p2.y){list.clear();return;}// 这两个点是否可以消掉if(lineCheck(p1, p2) || secendLine(p1, p2) || triLine(p1, p2)) {dots[p1.x][p1.y].setVisible(false);dots[p2.x][p2.y].setVisible(false);dots[p1.x][p1.y].setActionCommand("");dots[p2.x][p2.y].setActionCommand("");}list.clear(); // 清空集合count = 0;}}}5、判断两个按钮相连的三种算法// 是否直线联通public boolean lineCheck(Point p1, Point p2) {int absDistance = 0; // 两点之间的距离int spaceCount = 0; // 两点之间空按钮的数量// 如果两个按钮的图标不相同if (!dots[p1.x][p1.y].getActionCommand().equals(dots[p2.x][p2.y].getActionCommand())) {return false;}if (p1.x == p2.x || p1.y == p2.y) {if (p1.x == p2.x && p1.y != p2.y) {// 绝对距离(中间隔着的空格数)absDistance = Math.abs(p1.y - p2.y) - 1;// 正负值int zf = (p1.y - p2.y) > 0 ? -1 : 1;for (int i = 1; i <= absDistance; i++) {if (dots[p1.x][p1.y + i *zf].getActionCommand().equals("")) {// 空格数加1spaceCount += 1;} elsebreak;// 遇到阻碍就不用再探测了}} else if (p1.y == p2.y && p1.x != p2.x) {absDistance = Math.abs(p1.x - p2.x) - 1;int zf = (p1.x - p2.x) > 0 ? -1 : 1;for (int i = 1; i <= absDistance; i++) {if (dots[p1.x + i *zf][p1.y].getActionCommand().equals("")) {spaceCount += 1;} elsebreak;}}if (spaceCount == absDistance) {// 可联通return true;} else {return false;}} else {// 不是同行同列的情况所以直接返回false;return false;}}// 是否直角联通public boolean secendLine(Point p1, Point p2) {// 第一个直角检查点,如果这里为空则赋予相同值供检查Point checkP1 = new Point(p1.x, p2.y);// 第二个直角检查点,如果这里为空则赋予相同值供检查Point checkP2 = new Point(p2.x, p1.y);// 第一个直角点检测if (dots[checkP1.x][checkP1.y].getActionCommand().equals("")) { dots[checkP1.x][checkP1.y].setActionCommand(dots[p1.x][p1.y].getActionCommand());if (this.lineCheck(p1, checkP1) && this.lineCheck(checkP1, p2)) { dots[checkP1.x][checkP1.y].setActionCommand("");return true;dots[checkP1.x][checkP1.y].setActionCommand("");}}// 第二个直角点检测if (dots[checkP2.x][checkP2.y].getActionCommand().equals("")) { dots[checkP2.x][checkP2.y].setActionCommand(dots[p2.x][p2.y].getActionCommand());if (this.lineCheck(p1, checkP2) && this.lineCheck(checkP2, p2)) { dots[checkP2.x][checkP2.y].setActionCommand("");return true;} else {dots[checkP2.x][checkP2.y].setActionCommand("");}}return false;}// 是否双折线联通public boolean triLine(Point p1, Point p2) {int i;Point checkP = new Point(p1.x, p1.y);// 四向探测开始for (i = 4 - 1; i >= 0; i--) {checkP.x = p1.x;checkP.y = p1.y;// 向右if (i == 3) {while ((++checkP.x < dots.length)&&dots[checkP.x][checkP.y].getActionCommand().equals("")) {dots[checkP.x][checkP.y].setActionCommand(dots[p1.x][p1.y].getActionCommand());if (secendLine(checkP, p2)) {dots[checkP.x][checkP.y].setActionCommand("");return true;} else {dots[checkP.x][checkP.y].setActionCommand("");}}// 向下else if (i == 2) {while ((++checkP.y < dots[checkP.x].length)&&dots[checkP.x][checkP.y].getActionCommand().equals("")) {dots[checkP.x][checkP.y].setActionCommand(dots[p1.x][p1.y].getActionCommand());if (secendLine(checkP, p2)) {dots[checkP.x][checkP.y].setActionCommand("");return true;} else {dots[checkP.x][checkP.y].setActionCommand("");}}}// 向左else if (i == 1) {while ((--checkP.x >= 0)&&dots[checkP.x][checkP.y].getActionCommand().equals("")) {dots[checkP.x][checkP.y].setActionCommand(dots[p1.x][p1.y].getActionCommand());if (secendLine(checkP, p2)) {dots[checkP.x][checkP.y].setActionCommand("");return true;} else {dots[checkP.x][checkP.y].setActionCommand("");}}}// 向上else if (i == 0) {while ((--checkP.y >= 0)&&dots[checkP.x][checkP.y].getActionCommand().equals("")) {dots[checkP.x][checkP.y].setActionCommand(dots[p1.x][p1.y].getActionCommand());if (secendLine(checkP, p2)) {dots[checkP.x][checkP.y].setActionCommand("");return true;} else {dots[checkP.x][checkP.y].setActionCommand("");}}}}// 四个方向寻完都没找到可行的checkP点,所以只好返回falsereturn false;}6、重排功能// 当剩余按钮无法消除时进行重排public void reSet(){for(int i=0; i<ROW; i++){for(int j=0; j<COL; j++){if(!dots[i][j].getActionCommand().equals("")){linklist.add(dots[i][j].getActionCommand());}}}Random rd = new Random();for(int i=0; i<ROW; i++){for(int j=0; j<COL; j++){if(!dots[i][j].getActionCommand().equals("")){int c = rd.nextInt(linklist.size());dots[i][j].setIcon(newImageIcon("image/"+linklist.get(c)+".png"));dots[i][j].setActionCommand(linklist.get(c));linklist.remove(c);}}}}7、功能区按钮的实现// 功能区按钮被单击时public void actionPerformed(ActionEvent e) { if(e.getSource() == start){gamePanel.removeAll();addGamePanel(); // 添加游戏区reSet();timer.start();}else if(e.getSource() == pause){gamePanel.setVisible(false);timer.stop();}else if(e.getSource() == conti){gamePanel.setVisible(true);timer.start();}else if(e.getSource() == hint){reSet();}timecount.setText(time--+"秒");}最后,加上主方法即可,如下:public static void main(String[] args) {new LinkGame();// 匿名对象}此时,运行程序,就可以进行连连看游戏了。