基于java的连连看游戏_第1页
基于java的连连看游戏_第2页
基于java的连连看游戏_第3页
基于java的连连看游戏_第4页
基于java的连连看游戏_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

基于基于 JAVAJAVA 的的 连连看连连看 游戏游戏 一一 引言引言 连连看 游戏在网上种类非常多 比如 水果连连看 宠物连连看 等等 虽然 版本各种各样 但是其基本玩法 或者说基本算法是相同的 就是显示一些图标 让用户 依次去点击两个图标 如果这两个图标相同 并且这两个图标通过直线可以相连 或者通 过直角相连 或者通过双折线相连就可以消掉 消掉所有图标即为胜利 如图 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 newnew Random intint imagenum ROW COL forfor intint 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 类中的成员变量 变量类型变量类型变量名说明 finalfinal staticstatic intintROW 游戏区8行9列共72个按钮 finalfinal staticstatic intintCOL JPanelfunctionPanel 功能区面板 JPanelgamePanel 游戏区面板 JButton dots 按钮数组 JLabeltimestr 内容是 剩余时间 JLabeltimecount 计时 Timertimer JButtonstart 开始按钮 JButtonpause 暂停 JButtonconti 继续 JButtonhint 重排 staticstatic intintcount 记录鼠标单击次数 staticstatic intinttime 记录游戏剩余时间 Pointp1 p2 保存两个被单击按钮的坐标 LinkedListlist 按钮坐标集合 ArrayListimageIndex 存放图像索引 LinkedListlinklist 重排时存放按钮 表 2 LinkGame 类中的方法 方法名方法名方法功能 publicpublic voidvoid addmyMenu 添加菜单 publicpublic voidvoid addFunctionPanel 添加功能区 publicpublic voidvoid addGamePanel 添加游戏区 privateprivate classclass ButtonEvents implementsimplements ActionListener 游戏区按钮被单击 publicpublic booleanboolean lineCheck Point p1 Point p2 是否直线联通 publicpublic booleanboolean secendLine Point p1 Point p2 是否直角联通 publicpublic booleanboolean triLine Point p1 Point p2 是否双折线联通 publicpublic voidvoid reSet 当剩余按钮无法消除 时进行重排 publicpublic voidvoid actionPerformed ActionEvent e 功能区按钮被单击时 上述方法的具体实现如下 1 构造方法构造方法 构造方法建立游戏界面 publicpublic LinkGame thisthis setSize 780 500 thisthis setTitle 连连看游戏 thisthis setDefaultCloseOperation JFrame EXIT ON CLOSE addmyMenu 添加菜单 addFunctionPanel 添加功能区 thisthis setVisible truetrue 2 菜单 菜单 菜单的功能均没有实现 读者可以自行添加 添加菜单 publicpublic voidvoid addmyMenu JMenuBar menuBar newnew JMenuBar thisthis setJMenuBar menuBar JMenu menuGame newnew JMenu 游戏 JMenu menuSet newnew JMenu 设置 JMenu menuHelp newnew JMenu 帮助 menuBar add menuGame menuBar add menuSet menuBar add menuHelp menuGame add newnew JMenuItem 打开 menuGame add newnew JMenuItem 保存 menuGame add newnew JMenuItem 退出 menuSet add newnew JCheckBoxMenuItem 音乐开关 JMenu choice newnew JMenu 难度选择 menuSet add choice menuSet add newnew JMenuItem 背景色 menuSet add newnew JMenuItem 提示 menuHelp add newnew JMenuItem 关于 newnew ImageIcon image 2 gif menuHelp addSeparator menuHelp add newnew JMenuItem 帮助 ButtonGroup group newnew ButtonGroup JRadioButtonMenuItem rbm1 newnew JRadioButtonMenuItem 初级难度 JRadioButtonMenuItem rbm2 newnew JRadioButtonMenuItem 中级难度 JRadioButtonMenuItem rbm3 newnew JRadioButtonMenuItem 高级难度 group add rbm1 group add rbm2 group add rbm3 choice add rbm1 choice add rbm2 choice add rbm3 3 功能区和游戏区的界面 功能区和游戏区的界面 添加功能区 publicpublic voidvoid addFunctionPanel start setPreferredSize newnew Dimension 150 50 pause setPreferredSize newnew Dimension 150 50 conti setPreferredSize newnew Dimension 150 50 hint setPreferredSize newnew Dimension 150 50 timecount setPreferredSize newnew Dimension 150 50 timestr setPreferredSize newnew Dimension 150 50 timestr setFont newnew Font 隶书 Font BOLD 28 timecount setFont newnew Font 隶书 Font BOLD 28 timecount setForeground Color yellow timestr setForeground Color yellow start addActionListener thisthis pause addActionListener thisthis conti addActionListener thisthis hint addActionListener thisthis functionPanel setPreferredSize newnew Dimension 200 500 functionPanel setBackground Color BLUE functionPanel setLayout newnew FlowLayout FlowLayout CENTER 5 20 functionPanel add timestr functionPanel add timecount functionPanel add start functionPanel add pause functionPanel add conti functionPanel add hint thisthis add functionPanel BorderLayout EAST 添加游戏区 publicpublic voidvoid addGamePanel gamePanel setPreferredSize newnew Dimension 580 500 gamePanel setLayout newnew GridLayout ROW COL gamePanel setBackground Color RED Random random newnew Random intint imagenum ROW COL forfor intint i 0 i imagenum 2 i imageIndex add random nextInt 12 生成随机数索引放入集合 imageIndex addAll imageIndex 连接集合使每个索引都是成偶数的 intint num 0 记录从集合中取出的图标做引数 forfor intint i 0 i ROW i forfor intint j 0 j COL j String newNumber imageIndex get num dots i j newnew JButton newnew ImageIcon image newNumber png dots i j addActionListener newnew ButtonEvents 事 件监听注册 dots i j setActionCommand newNumber 设置按钮的 actioncommand名 gamePanel add dots i j thisthis add gamePanel BorderLayout WEST 4 单击游戏区按钮激发的事件 单击游戏区按钮激发的事件 事件类 监听按钮单击事件 privateprivate classclass ButtonEvents implementsimplements ActionListener publicpublic voidvoid actionPerformed ActionEvent e count forfor intint i 0 i ROW i forfor intint j 0 j 0 1 1 forfor intint i 1 i 0 1 1 forfor intint i 1 i 0 i checkP x p1 x checkP y p1 y 向右 ifif i 3 whilewhile checkP x dots length ifif secendLine checkP p2 dots checkP x checkP y setActionCommand returnreturn truetrue elseelse dots checkP x checkP y setActionCommand 向下 elseelse ifif i 2 whilewhile checkP y 0 ifif secendLine checkP p2 dots checkP x checkP y setActionCommand returnreturn truetrue elseelse dots checkP x checkP y setActionCommand 向上 elseelse ifif i 0 whilewhile checkP y 0 ifif secendLine checkP p2 dots checkP x checkP y setActionCommand returnreturn truetrue elseelse dots checkP x checkP y setActionCommand 四个方向寻完都没找到可行的checkP点 所以只好返回false returnreturn falsefalse 6 重排功能 重排功能 当剩余按钮无法消除时进行重排 publicpublic voidvoid reSet forfor intint i 0 i ROW i forfor intint j 0 j COL j ifif dots i j getActionCom

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论