




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、精品基于JAVA的连连看游戏引言连连看游戏在网上种类非常多,比如水果连连看,宠物连连看等等,虽然版本各种各样,但是其基本玩法,或者说基本算法是相同的,就是显示一些图标,让用户依次去点击两个图标,如果这两个图标相同, 并且这两个图标通过直线可以相连,或者通过直角相连,或者通过双折线相连就可以消掉,消掉所有图标即为胜利。如图i所示:图i正在进行中的连连看游戏通过该游戏的制作,我们可以对Java的基础语法、Java图形界面以及简单的算法设计有一个比较全面的了解。设计要求为了避免叙述的繁琐,我们只实现连连看游戏的基本功能,如下:制作如图1所示的游戏界面,尽量做到美观大方,使用方便当两个图标相同,且通过
2、直线相连、直角相连、双折线相连时,能够消掉图标能够让游戏随时暂停,然后继续当游戏进行到一定程度,无法消除剩余图标时,要能够提供重排功能对图标进行重 排,从而让游戏继续进行三实现思路我们先讲一下程序中的几个难点,主要是说清楚具体的实现思路, 具体的代码会在文后给出,大家可以参考。1、界面设计需要实现如图2所示的界面:图2连连游戏界面整个界面分为三个区域:菜单区、功能区、游戏区。首先在窗体上放置三个面板JPanel ,分别存放三个区域,如图3所示:系统菜单区(North)用户浙戏区(Center)用户交返区图3界面的设计系统菜单区放置菜单即可,用户游戏区放置一个8*9的按钮数组来构成游戏界面,用户
3、交互区放置开始,暂停等功能按钮以及提示信息。2、生成游戏区运行程序后,游戏区并不显示按钮数组,当点击开始按钮后,再自动生成。在生成按钮时要求按钮上的图案是随机的,且每个图案必须是偶数,否则会出现无法消除的按钮。如何实 现呢?我们可以这样考虑:假设有 12个图片,把图片名字按照数字序号从0到11命名;假设游戏区共72个按钮,那么产生36个12以内的随机数字(每个随机数字代表一个图片):放入一个ArrayList中,最后使用ArrayList的addAll方法对已经产生的 36个随机数字复制一份,这样就获得了72个随机数字,并且是成对的。因为一个数字对应一个图片,所以72个按钮需要的图片就生成了。
4、代码如下:Ran dom ran dom =new Random();int image num =ROW * COL;for (int i=0; ivimagenum/2; i+));/生成随机数索引放入集合image In dex .add(ra ndom. nextl nt(12)+imageI ndex .addAII( image In dex );/连接集合使每个索引都是成偶数的3、联通消除相连有三种情况:直线相连,直角点击相连且图片相同的两个按钮可以把两个按钮消除掉。相连,双折线相连。要消掉相同图标的按钮, 首先要想办法判断两个按钮的图标是否相同,这里提示大家一个方法:按钮有个s
5、etActionCommand 方法和getActionCommand ,把图标名字设置为一个 按钮的ActionCommand ,然后通过对比两个按钮的 ActionCommand 就可以知道是否具 有相同的图标。消除按钮就要判断两个按钮是否连通,连通有三种情况,对应三种算法,下面详细说明。算法判断两个点是否连通,那如何跟两个按钮建立联系呢?按钮的位置就可以视作一个点(java中用Point类表示一个点)。这样用一个点代表按钮位置,用ActionCommand代表按钮上的图标。就很容易操作了。下面我们先说清楚实现原理,具体代码一会在给出。(1 )直线相连:只要两点之间横坐标或纵坐标相同,即表
6、示两点在同行或同列;然后判断两点之间有没有障碍,无则联通。(2 )直角相连:两个点的坐标可以生成一个新的点,如果两点都可以与该新点联通,则说 明联通。注意:新点有两个,如图所示一个,另外喇叭图标处也可以生成一个,但是因为喇 叭图标处不是空点, 因此不用该点。但在实际中,新点的两种可能都要考虑到,那个能用用 那个。(3)双折线相连:在单击的第一点处,向四个方向搜索有无空点, 如果有则生成一个新点,如果该新点与另一个按钮联通(直角联通),则说明联通。如果该新点不能与按钮连通,则继续向该新点的方向前进一个位置,再次判断该位置是否为空点,是否可以和另一个按钮连 通,以此类推。4、重排当游戏进行到一定程
7、度,剩余的按钮无法消掉,这时就需要对按钮位置进行重新排列,从而让游戏继续进行。解决这一问题的思路如下:首先对所有按钮进行搜索,把剩余按钮的Actio nComma nd( Actio nComma nd和该按钮显示的图片序号一致,如果按钮被消掉则Acti on Comma nd为空)放入一个集合内;然后依次搜索剩余按钮,找到一个剩余按钮后,保持按钮的位置不动,从集合中随机取出一个Actio nComma nd赋给该按钮,这样就完成了对剩余按钮的重排。四具体实现打开Eclipse,新建一个类 LinkGame ,该类继承自JFrame,并且需要实现 ActionListener 方法。publi
8、c class Lin kGame exte nds JFrame impleme nts Actio nListe ner在该类中添加如下变量和方法,见表1和表2。表1 Li nkGame 类中的成员变量变量类型变量名说明final static intROW游戏区8行9列共72个按钮final static intCOLJPa nelfun cti onPanel功能区面板JPa nelgamePa nel游戏区面板JButto ndots按钮数组JLabeltimestr内容是“剩余时间”JLabeltimeco unt计时TimertimerJButtonstart开始按钮JButto
9、npause暂停JButtonconti继续JButtonhi nt重排static intcou nt记录鼠标单击次数static inttime记录游戏剩余时间Poi ntp1 , P2保存两个被单击按钮的坐标Li nkedListvPoi nt>list按钮坐标集合ArrayListvStri ng>image In dex存放图像索引Lin kedListvStri ng>lin klist重排时存放按钮表2 LinkGame 类中的方法方法名方法功能public void addmyMenu()添加菜单public void addFunctionPanel()添加
10、功能区public void addGamePanel()添加游戏区privateclassButto nEve ntsimpleme ntsAction Liste ner游戏区按钮被单击public boolea n lin eCheck(Poi nt p1, Poi nt p2)是否直线联通public boolea nsece ndLin e(Po int p1, Point p2)是否直角联通public boolea n triL in e(Po int p1, Point p2)是否双折线联通public void reSet()当剩余按钮无法消除时进行重排public void
11、 action Performed(Acti on Eve nt e)功能区按钮被单击时上述方法的具体实现如下:1、构造方法/构造方法建立游戏界面public Lin kGame() this .setSize(780, 500);this .setTitle("连连看游戏");this .setDefaultCloseOperationJFrame.EXIT_ON_CLOSE); addmyMenu(); / 添加菜单 addFunctionPanel(); / 添加功能区 this .setVisible( true );2、菜单菜单的功能均没有实现,读者可以自行添加。
12、/ 添加菜单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
13、.add(newJMenuItem("打开");menuGame.add(newJMenuItem("保存");menuGame.add(newJMenuItem("退出");- 可编辑 -精品menuSet.add( new JCheckBoxMenuItem( " 音乐开关 ");JMenu choice = new JMenu( " 难度选择 ");menuSet.add(choice);menuSet.add( new JMenuItem( " 背景色 ");menu
14、Set.add( new JMenuItem( " 提示 ");menuHelp.add( new JMenuItem( "关于 ", newImageIcon( "image/2.gif" );menuHelp.addSeparator();menuHelp.add( new JMenuItem( "帮助 ");ButtonGroup group = new ButtonGroup();- 可编辑 -"初级难度JRadioButtonMenuItem rbm1 =new JRadioButtonMenu
15、Item();"中级难度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 .setPrefer
16、redSize( 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
17、Font( "隶书 ",Font. BOLD,28); timecount .setFont( new Font( "隶书 " ,Font. BOLD,28); timecount .setForeground(Color. yellow );timestr .setForeground(Color. yellow );this );this );this );start .addActionListener( pause .addActionListener( conti .addActionListener(hint .addActionListen
18、er(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 );functionPa
19、nel.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 imagen
20、um = ROW * COL;for (int i=0; i<imagenum/2; i+)imageIndex .add(random.nextInt(12)+ "" );/ 生成随机数索引放入集合image In dex .addAII( image In dex );/连接集合使每个索引都是成偶数的 int num=O; /记录从集合中取出的图标做引数 for (int i = 0; i < ROW; i+) for (int j = 0; j < COL; j+) Stri ng n ewNumber =image In dex .get (nu
21、m+);dots ij = new JButton( "", new ImageIcon( "image/" +n ewNumber+ ".png");dots ij.addActionListener(new ButtonEvents();/ 事件监听注册dots ij.setActionCommand(newNumber);/ 设置按钮的action comma nd名gamePanel .add( dots ij); this .add( gamePanel , BorderLayout. WEST);4、单击游戏区按钮激发的事
22、件/ 事件类,监听按钮单击事件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 ij) Point p = new Point(i, j); / 单击按钮则把按钮位置封入 p 中list .add(p); / 点 p放入集合 list 中if (count % 2
23、 = 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.setVisi
24、ble( 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.
25、 xp1. y.getActionCommand().equals(return false ;dots p2. x p2. y .getActionCommand() - 可编辑 -精品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 &
26、lt;= absDistance; i+) if (dots p1. xp1. 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 <= a
27、bsDistance; i+) if (dots p1. x + i * zfp1. 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) / 第一个直角检查点,
28、如果这里为空则赋予相同值供检查Point checkP1 = new Point(p1. x, p2. y);/ 第二个直角检查点,如果这里为空则赋予相同值供检查- 可编辑 -精品Point checkP2 = new Point(p2. x, p1. y);/ 第一个直角点检测if (dots checkP1. xcheckP1. y.getActionCommand().equals( "") dots checkP1. x checkP1. y.setActionCommand(dots p1. x p1. y.getActionCommand();if (this
29、.lineCheck(p1, checkP1) && this .lineCheck(checkP1, p2) dots checkP1. xcheckP1. y.setActionCommand( "" ); return true ; else dots checkP1. xcheckP1. y.setActionCommand( "" );/ 第二个直角点检测if (dots checkP2. xcheckP2. y.getActionCommand().equals( "") dots checkP2. x c
30、heckP2. y.setActionCommand(dots p2. x p2. y.getActionCommand();if (this .lineCheck(p1, checkP2) && this .lineCheck(checkP2, p2) dots checkP2. xcheckP2. y.setActionCommand( "" ); return true ; else dots checkP2. xcheckP2. y.setActionCommand( "" );- 可编辑 -精品return false ;/ 是
31、否双折线联通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. xcheckP. y.getActionCommand().equals("") .getA
32、ctionCommand();dots checkP. xcheckP. y.setActionCommand( dots p1. xp1. y- 可编辑 -精品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 .
33、 length )&&dots checkP. xcheckP. y.getActionCommand().equals("") dots checkP. xcheckP. y.setActionCommand( dots p1. xp1. y.getActionCommand();if (secendLine(checkP, p2) dots checkP. x checkP. y.setActionCommand("");return true else dots checkP. x checkP. y.setActionComman
34、d( "");/ 向左else if (i = 1) while (-checkP. x >= 0)&&dots checkP. xcheckP. y.getActionCommand().equals("") dots checkP. xcheckP. y.setActionCommand( dots p1. xp1. y.getActionCommand();if (secendLine(checkP, p2) dots checkP. x checkP. y.setActionCommand("");ret
35、urn true ; else dots checkP. x checkP. y.setActionCommand( "");/ 向上 else if (i = 0) - 可编辑 -精品while (-checkP. y >= 0)&&dots checkP. xcheckP. y.getActionCommand().equals("") dots checkP. xcheckP. y.setActionCommand( dots p1. xp1. y.getActionCommand();if (secendLine(checkP, p2) dots checkP. x checkP. y.setActionComm
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年组织部招聘笔试模拟题及答案解析
- 2025年配电运维工招聘考试模拟题及答案详解
- 2025年村级安全员应急题集
- 2025年国画培训师中级面试模拟题及答案
- 2025年小学国家安全知识答案
- 2025年农村供水岗位招聘模拟题集
- 2025年村级碳汇管理中药招聘模拟卷
- 2025年供销总社招考笔试备考资料
- 护理概念图教学课件
- 2025年应急管理部面试常见问题及答案
- 2025广西公需科目考试题库和答案(覆盖99%考题)广西一区两地一园一通道+人工智能时代的机遇
- 2025年全国中小学校党组织书记网络培训示范班在线考试题库及答案
- 【暑假提前学】2025年秋初中语文八年级上册教学课件 第1单元 2《中国人首次进入自己的空间站》
- 通信工程用电登高等高风险作业施工安全操作
- 紧急宫颈环扎术的手术指征及术后管理
- 冻结法原理岳丰田
- Unit 2 Lets celebrate Developing ideas-Writing a letter to express 课件【知识精讲+拓展训练】高中英语外研版(2019)必修第二册
- 新教材高中历史必修中外历史纲要上全册教学课件
- 图标设计与制作PPT完整全套教学课件
- 感染性休克教学查房演示文稿
- 碎石组织供应及运输售后服务保障方案
评论
0/150
提交评论