java游戏_计算机软件及应用_IT计算机_专业资料

上传人:微*** 文档编号:168532526 上传时间:2022-11-10 格式:DOCX 页数:17 大小:111.91KB
返回 下载 相关 举报
java游戏_计算机软件及应用_IT计算机_专业资料_第1页
第1页 / 共17页
java游戏_计算机软件及应用_IT计算机_专业资料_第2页
第2页 / 共17页
java游戏_计算机软件及应用_IT计算机_专业资料_第3页
第3页 / 共17页
点击查看更多>>
资源描述
JAVA程序设计课程设计报告题 目:连连看游戏的设计与实现姓 名:学 号:班 级:指导教师:完成时间2014年6月成 绩:数学与信息技术学院2014年6月目录1 弓丨日 11.1 游戏开发背景11. 2 游戏开发的目的和意义11. 3完成的主要工作22 I耐 /足 刀 万 不1,3 又 | 32. 1需求分析与设计思路32. 1. 1关键技术说明32. 1.2需求分析32. 1. 3游戏设计方案与思路32. 1.4游戏目录结构说明42.2 系统功能结构53详细设计63.1 总体模块实现63. 1. 1实现原理63. 1. 2总分层结构及调用63. 1. 3关键代码分析64系统运行结果155课程设计总结166 参考文献16连连看游戏的设计与实现摘要 随着社会节奏的加快,平常工作的竞争强度也加大,生活的压力也跟着加重。所以休息 时或下班后大家都需要个休闲的娱乐工具,来放松自己,缓解自己的压,消除紧张的疲劳状态。 连连看游戏是一种意趣休闲的小游戏,不仅能调节精神,还能在游戏中锻炼我们的眼力视野,注意 力的专心的程度,开发我们的思维能力,同时可以充实自己,向高等级挑战,培养我们面対困难时 自己所具有攻克困难的信心。1.1 游戏开发背景随着技术对游戏经验的促进,游戏市场持续增长。越来越多的人开始认为,经过了许多人共用 一台计算机的大型主机时代,一人一台计算机的个人PC时代之后,下个时代就是一人多台计算 设备的普及计算时代(UbiquitousComputing, IBM称之PervasiveComputing)。计算设备将从单 的PC扩展到各种各样的大小和功能,从家庭消费电子产品,到个人随身携带,穿着,车载的各种 移动信息处理设备,多样化是这个领域的最大特点。连连看小游戏,只要将相同的两图形用三根以 内的直线连在起就可以消除,规则简单容易上手。游戏速度节奏快,画面淸晰可爱,适合细心的 玩家。连连看游戏玩法简单,休闲,益智,趣味,广受欢迎1.2 游戏开发的目的和意义随着社会节奏的加快,平常工作的竞争强度也加大,生活的压力也跟着加重。所以休息时或下 班后大家都需要个休闲的娱乐工具,来放松自己,缓解自己的压,消除紧张的疲劳状态。连连看 游戏是种意趣休闲的小游戏,不仅能调节精神,还能在游戏中锻炼我们的眼力视野,注意力的专 心的程度,开发我们的思维能力,同时可以充实自己,向高等级挑战,培养我们面对困难时自己所 具有攻克困难的信心。学会JAVA程序开发的环境搭建与配置,并在实际运用中学习和掌握JAVA程序开发的全过程。 进一步熟悉掌握JAVA程序设计语音的基础内容,如用户图形界面设计、JAVA多线程编程、JAVA数 据库编程等。通过亲自动手写程序,拓展知识面,锻炼调试能力。13完成的主要工作设计用户游戏界面:10*10块的连连看界面,7种不同颜色蓝色,黄色,粉红色,红色,绿色, 白色,青绿色,10*10中不同颜色的排列顺序是随机生成的。用户游戏键面中,设计个菜单栏, 有重新开始和结束。如果你出现的10*10的连连看界面自己不排序不喜欢,可以点重新开始,如果 你玩到半不想玩,可以点结束。两个圆角矩形连通时连接线路的走向是要进行判断的完成游戏逻辑的设计:判断鼠标点击区域是否为游戏区,判断鼠标点击的是否是为消除的块, 点击块后判断是否能成功连通,能连通则判断是否能够按规则(转向次数不大于两次)连通。消除 是用户的游戏界面是否能够及时更新实现游戏算法:栈2需求分析和总体设计对选题系统进行需求分析和设计思路概述,并给出系统功能结构及数据库设计。2.1 需求分析与设计思路2.1.1 关键技术说明1 .游戏界面的绘制。drawRoundRect方法绘制圆角矩形,fillArc方法在圆角矩形中填充椭圆,drawLine方法绘制两个 连通后的矩形位置的线条2 .游戏算法的设计,判断两个块之间的连通型。先判断两个是否相同。相同的话在用checkPathR第 一次搜索的块与目标块的索引相同,代表连通,返回成功,否则分别从向上转向,向下转向,向左 转向,向右转向搜索,直到搜索结束,如果没有直到结束都没有搜到可以用三根以内的直线将相同 的两图形连在起,就是不可以消除,否则就可以消除2.1. 2需求分析随着信息化产业的不断发展,人们水平不断提高。游戏成为当今时代不可缺少的一部分,它既 能减轻人们的压力也能锻炼人们的判断能力和反应能力。而连连看适合于大众的集体休闲,趣味益 智和娱乐。它看似简单但却变化无穷。连连看作为一种益智类游戏,由于规则简単,容易学会,再 加上界面丰富在上班族的办公电脑上风靡多时,而它主要的功能是使得人们在工作紧张之余能够调 节人们的心情。连连看游戏有很多的好处,游戏不再是静态的,而是动态的了。而且在此基础上游 戏变得更加华丽。无形中增强而来游戏的可玩性。游戏开发成功后,最终用户为各个年龄阶段的人群,用户范围相当广泛。本游戏友好的用户界 面,简单易学的鼠标操作以及简单通俗的游戏规则,使广大的用户不需要专门进行培训,就可以立 即学会如何使用。2.1.3游戏设计方案与思路给游戏区内每个块分配个索引,再给每个块分配个类型,包括不是游戏区内的空白处。 在14*14个块的区域中,其中10*10是游戏区内需要消除的块,游戏区外的第一圈为空白块,类型 为0,此后游戏区内消除的块也会被标记为0,游戏区外第二圈为边界块,类型为1。当选中一个块时,先判断块类型是否0,是则在游戏区内的块,否则不再游戏区内。当在游戏 区内时,选中第一个块index。和目标块indexl时,会检测他们之间的连通性,若能够连通,判断转 向次数,若转向次数大于二次,则消除失败,否则成功。最后循环以上操作。2. L4游戏目录结构说明表2-1包名作用Java.awt.*所有组件容器的包java.awt.event.*所有事件类包Java.until.*包叫做实用包(Utilities),提供了各种不同实用功能的类表2-2Main文件作用(方法入口,连通性计算)void main搭建主框架,建立鼠标、窗的事件监听窗的事件监听中的方法作用windowActivated 方法将 Window设置为活动Window时调用windowClosed 方法因对窗口调用dispose而将其关闭时调用windowClosing 方法用户试图从窗口的系统菜单中关闭窗时调用windowDeactivated 方法当Window不再是活动 Window时调用windowDeiconified窗口从最小化状态变为正常状态时调用windowlconified 方法窗口从正常状态变为最小化状态时调用windowOpened 方法窗口首次变为可见时调用。建立鼠标事件监听的方法mouseClicked点击鼠标响应事件mouseEntered是鼠标刚进入组件的时候调用(只调用一次)mouseExited是鼠标在组件上移动的时候调用(只要鼠标没有离开组件,一直调用)mousePressed鼠标按下时响应事件Animation 文件作用void draw绘制矩形框然后在矩形框中填充椭圆两个连通矩形的位置画连接线void updata连通消除矩形后及时更新键面,2.2系统功能结构对系统实现功能进行说明,分析系统功能结构,画出系统功能结构图,如图2-1所示。游戏界面显示连连看框图游戏事件监听3详细设计给出系统的数据库设计,并对所完成的模块的具体实现进行说明,包括模块实现原理、实现效果、 关键代码说明,模块分层结构和调用关系等。3.1 总体模块实现3.1.1 实现原理通过递归方法,判断连通性,用栈方式存储连通路径。3.1.2 分层结构及调用关系说明1、判断用户鼠标是否点击入游戏区域:是,则继续判断;否,则返回失败(界面上显示 无效果)。2、判断用户鼠标是否点击在未消除的块上(首块):是,则白色框变红,然后继续判断;否,则返回失败(界面上显示无效果)。3、判断用户鼠标是否点击在为可消除的块上(目标块);是,则白色框变红,然后继续判 断;否,则返回失败(界面上显示无效果)。4、判断两个块之间的连通性(逐块搜索):4.1、 当前块能够连通(为空块),则继续搜索、先向上,向下,向左,向右转向: 转向小于两次,则返回成功;转向大于两次,则返回失败。4.2、 当前快不能够连通(为未消除的块),则返回失败。3.1.3关键代码分析连连看判断连通性;public class Main(static boolean isRunning = true;static int tiles = new int14 * 14;static Vector command_list = new Vector();/Vector是集合,集合是自动增加的数组用口来声明空间。而集合不需要声明空间static LinkedList animation_list = newLinkedList () ; /LinkedLis匸是通过点直接彼此连接来实现的。static int selected = -1;/定义selected赋初值 1static boolean checkPath(int indexO,int indexl,Stack path)对路径的搜索(第一个块,目标块,存放路径) if (tilesindexO != tilesindexl)return/如果这两个块的类型不是样的,返回失败.path .push (indexO) ; /成功的话,将第一个块的索I暂时保存在栈屮return /然后开始第一次遍历路在checkPathR(indexO - 14,indexl,0,O,path) | indexO这块的上一块开始搜索,调用checkPathRcheckPathR(indexO + 14,indexl,1,O,path) |/indexO这块的下块开始搜索checkPathR(indexO - 1,indexl,2,0,path) I|indexO这一块的左边块开始搜索 checkPathR(indexO + 1,indexl,3,O,path) /indexO这块的右边一块开始搜索;/如果其中一个方向开始的遍历路径成功连接到indexl的话返冋成功,则两块就成功连通 )static boolean checkPathR(int indexO,int indexl,int d,int t,Stack path)/ (第一次搜索的块,目标块,方向,转向次数,保存路径的栈(path.push (indexO) ; /将首块的索引先存入栈if (indexO = indexl)/第一次搜索的块与目标块的索引相同,代表连通,返回成功。 return true;if (tilesindexO != 0)/如果捜索到的块不空门块,意味着碰到了未消除的块,然后 将入栈的路径弹出,并返回失败。path.pop ;return false; switch (d) /选择转向的方向 case 0 : /向上if (checkPa thR (indexO - 14, indexl, 0, t, path) )/调用自身方法,如果 成功,继续搜索路径(下个空白块)。不成功,跳出if语句,开始转向。return true;+t;if (t 2) /如果失败,将存入路径弹出,返回失败 path.pop ;return false;if (checkPathR (indexO - 1, indexl, 2, t,path) )/向左转向,成功返冋 True,不成功执行下个ifreturn true;if (checkPa thR (indexO + 1, indexl, 3, t, path) )/向右转向,成功返冋 true,不成功,则代第一次向上的路径没有路可到达目标块index。失败!return true;break;case 1: /第一次向上搜索路径不成功,向下if (checkPathR(indexO + 14,indexl,1,t,path) return true;+t;if (t 2) path.popO ; return false;if (checkPathR(indexO - 1,indexl,2,t,path) return true;if (checkPathR(indexO + 1,indexl,3,t,path) return true;break;case 2: /第次向上、卜.搜索路径不成功,向if (checkPathR(indexO - !,indexl,2,t,path) return true;+t;if (t 2) path.pop (); return false;if (checkPathR(indexO - 14,indexl,0,t,path) return true;if (checkPathR(indexO + 14,indexl,1,t,path) return true;break;case 3: /第次向上、卜、左搜索路径不成功,向行if (checkPathR(indexO + 1,indexl,3,t,path) return true;+t; if (t 2) path.pop ();return false;if (checkPathR(indexO - 14,indexl,0,t,path) return true;if (checkPathR(indexO + 14,indexl,1,t,path) return true;break; path.pop ();return false; 主函数中的方法及框架设计public static void main(String args) init ();Frame frame = new Frame (“连连看”); frame.setsize(500,500);frame. setResizable (false) ; /使框架窗丨I、可改变大小frame. setVisible (true) ; /设置框架”J 见frame. setIgnoreRepaint (true);/设置窗体的最大化可以使用MenuBar j=new MenuBar();frame.setMenuBar(j);Menu game=new Menu (“菜单”);Menuitem newgame = new Menu tem (“亜新开始”);Menuitem exit = new Menutem (退出); game.add(newgame);game.add(exit); 退出 exit.addActionListener(new ActionListener() public void actionPerformed(ActionEvent e) System.exit(0););/新游戏newgame.addActionListener(new ActionListener() public void actionPerformed(ActionEvent e) init (););j . add(game);frame.addWindowListener/建。:窗口的事件监听 (new WindowListener()public void windowActivated (WindowEvent e) / 将 Window 设置为活动 Window时调用。 ()public void windowClosed (WindowEvent e) / Z 因对窗口调用 dispose 而 将其关闭时调用。(public void windowclosing (WindowEvent e)/用户试图从窗口的系统菜单中关闭窗口时调用。isRunning = false; public void windowDeactivated(WindowEvent e) / Window 、 再是活动Window时调用。public void windowDeiconified (WindowEvent e) /Z 窗从最小化状 态变为正常状态时调用。public void windowlconif ied (WindowEvent e) /窗口从正常状态变为 最小化状态时调用。public void windowOpened (WindowEvent e) /Z 窗口首次变为可见时调用。 );frame.addMouseListener/Z建.卜必标事件监听(new MouseListener public void mouseClicked (MouseEvent e) /点击鼠标响应事件public void mouseEntered(MouseEvent e) /是鼠标刚进入组件的时候调用 (只调用一次)public void mouseExited (MouseEvent e) /是鼠标在组件上移动的时候调 用(只要鼠标没有离开组件,一直调用)public void mousePressed (MouseEvent e) /鼠标按下时响应屮件 int x = e.getX ();int y = e.getY();if (x = 90 & x = 90 & y 410) x -= 58;y -= 58;Integer index = new Integer ( ( (y / 32) + 1) * 14 + (x / 32) + 1);synchronized (comnahdjist) /控制对类成员变量的访问:每个类 实例对应一把锁,if (tiles index ! = 0)command_list.add(index);public void mouseReleased(MouseEvent e) );frame. createBuff er Strategy (2) ; /设置缓冲区的个数2 个Buff er Strategy bs = f rame . getBuf ferStrategy () ;/类及小用来在招:定 Window 上组织复杂内存的机制。while (isRunning)/控制游戏循环long t = Svstem.aiiorime(); 返回最准确的可用系统计时器的当前值,以毫微秒 为单立 int commands;synchronized (command_list) 同步线程,保证点击的两个能够可以消掉 (commands = new intcommand_list.size ;int i = 0;for (Integer index : command_list) commandsi+ = index;command_list.clear(); for (int i = 0;i commands.length;+i) if (selected = -1)if (tilescommandsi != 0) selected = commandsi;continue; if (selected != commandsi & tilescommandsi != 0) Stack path = new Stack();if (checkPath(selected, commandsi, path) animation_list.add(new Animation(tilesselected,path);tilesselected = 0; tilescommandsi = 0;selected = -1; ) else selected = commandsi; do doGraphics2D g = (Graphics2D)bs.getDrawGraphics();g. set Render ingHi nt (Render ingHi nt s . KEY_ANT I ALIASING, RenderingHints VALUE_ANT IALIAS_ON) ; /反走样g.setColor(new Color(0.Ofz 0.Ofz 0.Of, 1.Of);g.fillRect (0,0,500,500); 背景 黑色 for (int y = 1;y 12;+y) for (int x = 1;x 12;+x)if (tilesy * 14 + x != 0) if (y 14 + x = selected)/如果点击的两个颜色可以连通, 则点击的两个椭圆外面的矩形框都是红色g , setColor(Color.RED); elseg.setColor (Color . WHITE) ;/如果点击的两个颜色不 可以连通,则第一个椭圆外面的矩形框变成白色g.drawRoundRect (58 + (x - 1) * 32 + 1, 58 + (y -1) * 32 + 1, 30, 30, 8,8);switch (tiles y * 14 + x )/随机产生的数字填充相应的 颜色(case 0: break; case 1:g setColor(Color.RED); break;case 2:g, setColor(Color.GREEN); break;case 3:gsetColor(Color.BLUE); break;case 4:g, setColor(Color.YELLOW); break;case 5:g.setColor(Color.MAGENTA); break;case 6:gsetColor(Color.white);break;case 7:g.setColor(Color.CYAN); break;g.fillArc(58 + (x - 1) * 32 + 1 + 4,58 + (y - 1)* 32 + 1 + 4,22, 22, 0, 360);/填充覆盖指定矩形的圆弧或椭圆弧 ListIterator it = animation_list.listIterator(); while (it.hasNext() Animation a = it.next ();a.updata(0.016f * 0.75f);if (a.time 1.Of) it.remove();else a.draw(g); g.dispose ();while (bs.contentsRestored(); bs.show(); while (bs.contentsLost(); t = 16666666L - (System.nanoTime( - t); if (t 0L) tryThread.sleep(t / 1000000L,(int)(t % 1000000L); catch (InterruptedException e) frame.setVisible(false);frame.dispose ();System.exit(0);)初始化static void init()/初始化 int map = new int 10 * 10;定义并实例化 for (int i = 0;i 100;i += 2)map i = map i + 1 = (int) (Math, random () * 7.0) + 1;/生成 和8之间 的随机整数for (int i = 0;i 100;+i) int j = (int) (Math. random() * 100.0) ;/随机输出 1 至U100之间的数 int temp = mapi;mapi = mapj; mapj = temp; int i = 0;for (int y = 0;y 14;+y)for (int x = 0; x 14; +x) if (x = 0 I I x = 13 I I y = 0 I I y = 13)tilesy * 14 + x = -1;else if (x = 1 | x = 12 | y = 1 | y = 12)tilesy * 14 + x = 0;elsetilesy * 14 + xmapi+;Ma i n中!ffl!连接线for (int i = 0;i n;+i)/按照两个连通矩形的位置两连接线indexO = path.get(i);indexl = path.get(i + 1);xO =(indexO % 14)-1;yO =(indexO / 14)-1;xl =(indexl % 14)-1;yi =(indexl / 14)-1;xO =58 + (xO * 32)+ 16;yO =58 + (yO * 32)+ 16;xl =58 + (xl * 32)+ 16;yi =58 + (yl * 32)+ 16;g.drawLine(x0,y0,xl,yl); indexO = path.get(n);indexl = path.get(n + 1);xO =(indexO % 14)-1;yO =(indexO / 14)-1;xl =(indexl % 14)-1;yi =(indexl / 14)-1;x0 =58 + (xO * 32)+ 16;y0 =58 + (yO * 32)+ 16;xl =58 + (xl * 32)+ 16;yi =58 + (yl 32)+ 16;xl =(int)(xO + (xl-xO) * k);yl =(int)(yO + (yl-yO) * k);g,drawLine(xO,yO,xl,yl);画圆角矩形g.setColor(new Color(1.Of * alpha,0.Of * alpha,0.Of * alpha,1.Of); switch (type) case 1:g.drawRoundRect(xO, yO, 30, 30, 8, 8);g.drawRoundRect(xl, yl, 30, 30, 8, 8);g.setColor(new Color(1.Of * alpha,0.Of * alpha,0.Of * alpha,1.Of) ) ;/颜色变淡g.fillArc(xO + 4,yO + 4,0,22,0,360);g.fillArc(xl + 4,yl + 4,22,22,0,360);break;case 2:g.drawRoundRect(xO,yO,30,30,8,8);g.drawRoundRect(xl,yl,30,30,8,8);g.setColor(new Color (0.Of * alpha,1.Of * alpha,0.Of * alpha,1.Of);g.fillArc(xO + 4,yO + 4,22,22,0,360);g.fillArc(xl + 4,yl + 4,22,22,0,360);break;4系统运行结果可以按照游戏规则实现成功消除,并用线看到连通路线。5课程设计总结这次是游戏设计,完成了用户游戏界面设计,包括10*10块的连连看可消除块,7种不同颜色。完 成游戏逻辑的设计,包括判断鼠标点击区域是否为游戏区,判断鼠标点击的是否是为消除的块,点 击块后判断是否能成功连通,能连通则判断是否能够按规则(转向次数不大于两次)连通。最后用 java语言实现设计。连通性算法常常出错,不能够按照规则实现,经多次调试以后,可以完成。在这次设计中,较好的实现了预想的算法,但在用户功能需求这一方面,略有欠缺,但能在今 后的设计和调试中逐解决。参考文献1美Y. Daniel Liang. Java语言程序设计M.北京:机械工业出版社,2006.2美Walter Savitch. Java程序设计与问题解决M .北京:清华大学出版社,2012.
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 商业管理 > 商业计划


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!