基于java的连连看游戏.doc
- 文档编号:236014
- 上传时间:2022-10-07
- 格式:DOC
- 页数:15
- 大小:581KB
基于java的连连看游戏.doc
《基于java的连连看游戏.doc》由会员分享,可在线阅读,更多相关《基于java的连连看游戏.doc(15页珍藏版)》请在冰豆网上搜索。
基于JAVA的《连连看》游戏
一引言
《连连看》游戏在网上种类非常多,比如《水果连连看》,《宠物连连看》等等,虽然版本各种各样,但是其基本玩法,或者说基本算法是相同的,就是显示一些图标,让用户依次去点击两个图标,如果这两个图标相同,并且这两个图标通过直线可以相连,或者通过直角相连,或者通过双折线相连就可以消掉,消掉所有图标即为胜利。
如图1所示:
图1正在进行中的连连看游戏
通过该游戏的制作,我们可以对Java的基础语法、Java图形界面以及简单的算法设计有一个比较全面的了解。
二设计要求
为了避免叙述的繁琐,我们只实现连连看游戏的基本功能,如下:
l制作如图1所示的游戏界面,尽量做到美观大方,使用方便
l当两个图标相同,且通过直线相连、直角相连、双折线相连时,能够消掉图标
l能够让游戏随时暂停,然后继续
l当游戏进行到一定程度,无法消除剩余图标时,要能够提供重排功能对图标进行重排,从而让游戏继续进行
三实现思路
我们先讲一下程序中的几个难点,主要是说清楚具体的实现思路,具体的代码会在文后给出,大家可以参考。
1、界面设计
需要实现如图2所示的界面:
图2连连游戏界面
整个界面分为三个区域:
菜单区、功能区、游戏区。
首先在窗体上放置三个面板JPanel,分别存放三个区域,如图3所示:
图3界面的设计
系统菜单区放置菜单即可,用户游戏区放置一个8*9的按钮数组来构成游戏界面,用户交互区放置开始,暂停等功能按钮以及提示信息。
2、生成游戏区
运行程序后,游戏区并不显示按钮数组,当点击开始按钮后,再自动生成。
在生成按钮时要求按钮上的图案是随机的,且每个图案必须是偶数,否则会出现无法消除的按钮。
如何实现呢?
我们可以这样考虑:
假设有12个图片,把图片名字按照数字序号从0到11命名;假设游戏区共72个按钮,那么产生36个12以内的随机数字(每个随机数字代表一个图片),放入一个ArrayList中,最后使用ArrayList的addAll方法对已经产生的36个随机数字复制一份,这样就获得了72个随机数字,并且是成对的。
因为一个数字对应一个图片,所以72个按钮需要的图片就生成了。
代码如下:
Randomrandom=newRandom();
intimagenum=ROW*COL;
for(inti=0;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方法。 publicclassLinkGameextendsJFrameimplementsActionListener{ } 在该类中添加如下变量和方法,见表1和表2。 表1LinkGame类中的成员变量 变量类型 变量名 说明 finalstaticint ROW 游戏区8行9列共72个按钮 finalstaticint COL JPanel functionPanel 功能区面板 JPanel gamePanel 游戏区面板 JButton[][] dots 按钮数组 JLabel timestr 内容是“剩余时间” JLabel timecount 计时 Timer timer JButton start 开始按钮 JButton pause 暂停 JButton conti 继续 JButton hint 重排 staticint count 记录鼠标单击次数 staticint time 记录游戏剩余时间 Point p1,p2 保存两个被单击按钮的坐标 LinkedList list 按钮坐标集合 ArrayList imageIndex 存放图像索引 LinkedList linklist 重排时存放按钮 表2LinkGame类中的方法 方法名 方法功能 publicvoidaddmyMenu() 添加菜单 publicvoidaddFunctionPanel() 添加功能区 publicvoidaddGamePanel() 添加游戏区 privateclassButtonEventsimplementsActionListener 游戏区按钮被单击 publicbooleanlineCheck(Pointp1,Pointp2) 是否直线联通 publicbooleansecendLine(Pointp1,Pointp2) 是否直角联通 publicbooleantriLine(Pointp1,Pointp2) 是否双折线联通 publicvoidreSet() 当剩余按钮无法消除时进行重排 publicvoidactionPerformed(ActionEvente) 功能区按钮被单击时 上述方法的具体实现如下: 1、构造方法 //构造方法建立游戏界面 publicLinkGame(){ this.setSize(780,500); this.setTitle("连连看游戏"); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); addmyMenu();//添加菜单 addFunctionPanel();//添加功能区 this.setVisible(true); } 2、菜单 菜单的功能均没有实现,读者可以自行添加。 //添加菜单 publicvoidaddmyMenu(){ JMenuBarmenuBar=newJMenuBar(); this.setJMenuBar(menuBar); JMenumenuGame=newJMenu("游戏"); JMenumenuSet=newJMenu("设置"); JMenumenuHelp=newJMenu("帮助"); menuBar.add(menuGame); menuBar.add(menuSet); menuBar.add(menuHelp); menuGame.add(newJMenuItem("打开")); menuGame.add(newJMenuItem("保存")); menuGame.add(newJMenuItem("退出")); menuSet.add(newJCheckBoxMenuItem("音乐开关")); JMenuchoice=newJMenu("难度选择"); menuSet.add(choice); menuSet.add(newJMenuItem("背景色")); menuSet.add(newJMenuItem("提示")); menuHelp.add(newJMenuItem("关于",newImageIcon("image/2.gif"))); menuHelp.addSeparator(); menuHelp.add(newJMenuItem("帮助")); ButtonGroupgroup=newButtonGroup(); JRadioButtonMenuItemrbm1=newJRadioButtonMenuItem("初级难度"); JRadioButtonMenuItemrbm2=newJRadioButtonMenuItem("中级难度"); JRadioButtonMenuItemrbm3=newJRadioButtonMenuItem("高级难度"); group.add(rbm1); group.add(rbm2); group.add(rbm3); choice.add(rbm1); choice.add(rbm2); choice.add(rbm3); } 3、功能区和游戏区的界面 //添加功能区 publicvoidaddFunctionPanel(){ start.setPreferredSize(newDimension(150,50)); pause.setPreferredSize(newDimension(150,50)); conti.setPreferredSize(newDimension(150,50)); hint.setPreferredSize(newDimension(150,50)); timecount.setPreferredSize(newDimension(150,50)); timestr.setPreferredSize(newDimension(150,50)); timestr.setFon
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 java 连连 游戏