连连看课程设计报告.doc_第1页
连连看课程设计报告.doc_第2页
连连看课程设计报告.doc_第3页
连连看课程设计报告.doc_第4页
连连看课程设计报告.doc_第5页
免费预览已结束,剩余18页可下载查看

下载本文档

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

文档简介

湖南涉外经济学院课程设计报告课程名称:程序设计实训(2)报告题目:连连看游戏的开发学生姓名:所在学院:专业班级:学生学号:指导教师:2013年6月20日课程设计任务书报告题目连连看游戏的开发完成时间学生姓名专业班级指导教师职称总体设计要求和技术要点设计一个连连看游戏程序,游戏程序的功能需求如下:两张花色相同的游戏牌的之间的路径如果满足以下条件,这两张游戏牌即可消去:路径连线由不多于3条的水平和垂直的线段构成,任何一条线段都不能穿越其他的游戏牌,但可以不在棋盘中,路径两端的游戏牌必须具有相同的花色。游戏只要用鼠标即可进行操作。最初棋盘里布满了游戏牌,游戏开始时进行计时。第一次使用鼠标点击棋盘中的游戏牌,该游戏牌此时为“被选中”,以特殊方式显示;再次以鼠标点击其他游戏牌,若该游戏牌与被选中的游戏牌两者花色相同,且把第一张游戏牌到第二张游戏牌连起来,中间的线段不超过3条,则消掉这一对游戏牌,否则第一张游戏牌恢复成未被选中状态,而第二张游戏牌变成被选中状态。每消去一对游戏牌,应检查棋盘内是否至少还存在一对能消去的游戏牌,如果不存在,则在原有位置对游戏牌进行重排,直到至少存在一对能够消去的游戏牌。如果在指定的时间内消去了所有的游戏牌,游戏胜利;如果时间耗尽还未能消除全部的游戏牌,游戏失败。工作内容及时间进度安排第11周第12周:对需要开发的软件进行需求分析和软件设计第13周:论证方案设计第14周第16周:程序设计第17周:测试、修改程序,撰写报告第18周:验收答辩课程设计成果1与设计内容对应的软件程序2课程设计总结报告摘 要 近年来,Java作为一种新的编程语言,以其简单性、可移植性和平台无关性等优点,得到了广泛地应用,特别是Java与万维网的完美结合,使其成为网络编程和嵌入式编程领域的首选编程语言,Java语言的学习热潮并没有因为时间的推移而消退,相反,由于计算机技术的发展所带来的新应用的出现,Java越来越流行,这种情况是以往程序设计语言在其生存周期内所不多见的。Java语言之所以这样长盛不衰,一是因为其众多的技术特点与现今的应用十分合拍,可以覆盖大部分的需求;二是因为SUN公司不断推出新的版本,完善Java自身的功能。有了这两点,Java语言成为程序员首选的程序设计开发工具就在情理之中了.连连看游戏,是指在一个区域内,分布着许多不同的图片,通过点击两张相同的图片并符合一定的规则消除它们的一个游戏。我们最常见的是在QQ游戏大厅里的QQ连连看,网络上也有许多各式各样的单机版连连看游戏。在游戏的过程中,可以考虑下如何使用自己掌握的程序去实现游戏的效果,并尝试去开发属于自己的连连看,这是一件十分惬意的事情。在本章中,我们将详细的教大家如何使用Java去开发一款属于自己的单机连连看。 本游戏采用JAVA语言开发,以MyEclipse为开发平台。游戏主界面是基于GUI(图形用户界面)的开发,使得游戏界面简单清晰。并调用了其中的一些函数,完成了事件的触发功能。希望通过这次开发设计出的连连看小游戏,给大家的生活带来一点乐趣。 游戏通过定义动态的二维数组,根据一定的算法实现规定的路径判断。关键词:连连看游戏;算法设计;数组;GDI;路径判断;Java湖南涉外经济学院信息科学与工程学院目 录课程设计任务书II摘 要III一、课程设计目的1二、课程设计题目任务描述和要求22.1 任务描述22.1.1 界面22.1.2 程序22.2 设计要求及目的3三、需求分析43.1 方案选择43.2功能描述43.3 功能需求53.4 功能模块及思路53.5 系统需求分析总结8四、设计方案94.1 总体设计94.2 详细设计104.2.1 游戏界面104.2.2 游戏各功能及代码12五、 心得体会18六、参考资料19一、课程设计目的 我们学习这门语言的目的,不是仅仅的理论研究,作为语言,它只是一种工具,因此学习它更重要的是运用它来做有用的程序,这也就是说学习它重在应用在实践的基础上对它能更好的掌握,而进行简单的设计就是一种很有效的学习实践方式,这也就是我们学习的主要目的:旨在培养学生的上机动手能力和在本课程内初步掌握解决实际应用问题时所应具备的查阅资料、综合运用所学知识的能力,为毕业设计急今后从事专业工作打下坚实的基础。课程设计是计算机科学与技术专业重要的实践性环节之一,是对本课程学习后进行的一次全面而综合的练习,也为后续各门计算机课程的学习和毕业设计打下基础。本次课程设计的目的主要有:1. 巩固和加深学生对算法语言的基本知识的理解与掌握;2. 培养学生独立工作和创新思维德能力3. 让学生掌握较为简单的算法分析能力;4. 提高与运用算法解决能实际问题的能力。5. 更深入地理解和掌握该课程中的有关基本概念,程序设计思想和方法。6. 对掌握知识的深度、运用理论去处理问题的能力、实验能力、课程设计能力进行考核。7. 培养综合运用所学知识独立完成课题的能力。提高和加强计算机应用与软件开发能力,掌握软件设计的流程与思想8. 培养学生独立分析问题、解决问题、查阅资料能力提高学生编程的综合素质及上机调试水平掌握程序设计说明文档的能力与技巧9. 进一步加深对Java语言的理解和掌握;将所学的JAVA知识运用于实践中。10. 课程设计将理论与实践相结合,提供了一个既动手又动脑,独立实践的机会,锻炼我们的分析解决;实际问题的能力,提高学生适应实际,实践编程的能力11. 熟练掌握JAVA语言中图形用户界面程序的编写;12. 大体了解怎样用JAVA来编写小游戏的,增强我们实践能力和创新精神的综合培养二、课程设计题目任务描述和要求2.1 任务描述2.1.1 界面 用javascript设计界面2.1.2 程序游戏过程,如果玩家在规定的时间内消完则提示玩家胜利,如果在一定时间内图片没有消完则提示玩家时间到,游戏失败。经过对游戏的初步分析,连连看游戏包含了如下规则: 1、条件:程序的关键在于判断用户连续点击的两个图案能否消除。两个图片可以消除的条件有两个: u 图片相同 u 图片间连线的转角数不得超过2 。 2、操作:第一次使用鼠标点击游戏界面中的牌,该牌此时为被选中,以特殊方式显示;再次以鼠标点击其他牌,若该牌与被选中的牌图案相同,且把第一个牌到第二个牌连起来,中间的直线不超过 3 根,则消掉这一对牌,否则第一个牌恢复成未被选中状态,而第二个牌变成被选中状态。在规定的时间内将游戏界面上的牌全部消除掉。则游戏胜利 ,在规定时间,界面上的牌仍未全部消掉。则游戏失败2.2 设计要求及目的 通过本次毕业设计,让我们掌握如何制作一个游戏软件,以及制作游戏软件的整个流程,制作游戏软件的步骤,让学生熟悉项目开发的完整过程,为即将到来的就业工作打下基础。另外也通过本次设计将三年来所学的专业知识和其他方面的知识融入到实际应用中,在实际运用中学习和掌握Java程序开发的全过程,进一步熟悉掌握Java程序设计语言的基础内容、基本技能和方法,同时培养学生进行分析问题、解决问题的能力;培养学生进行设计分析、设计方法、设计操作与测试、设计过程的观察、理解和归纳能力的提高。 1. 主要是能通过开发“连连看”这个小游戏,学会Java程序开发的环境搭建与配置,并提高自己Java程序设计编程的实际能力。通过这次。 2. 进一步熟悉掌握Java程序设计的基础内容,如用户图形界面设计(GUI)、Java多线程编程等。3. 3、大体了解怎样用Java来编写小游戏,增强我们实践能力和创新精神的综合培养。 4. 4、设计过程中,对整个游戏所实现的功能进行详细的设计以及对存在的问题及解决办法进行最终确定;而后完成游戏的程序编写,并优化;最后,写出设计本游戏的详细文档说明,并作课程设计汇报。三、需求分析3.1 方案选择在概要设计阶段,主要有两中方案可供选择: 一、所有的图片都是按约定好的种类数和在同一区域的重复次数随机出现,并且每张图片的的出现次数为偶数 ,时间会有限制,每一关的图片数量或时间是不同的,这样就增加了游戏的难度。二、在同一区域中,图片出现的种类数和重复次数是可以由玩家选择的,时间由游戏约定。不过玩家选择的种类数和重复次数必须是偶数才可以顺利完成游戏,否则游戏虽然可以正常运行,但无法完成游戏。 在第一种方案中,由于出现的图像按种类数和重复次数都由软件约定,这样就缺乏玩家自主选择的空间,只是在玩系统已经是设定好的游戏,不能改变什么,这样就在无意中降低了玩家在游戏的过程中乐趣,最后致使玩家放弃继续玩下去。我们参考了网络上的连连看游戏,考虑到游戏的娱乐性。所以我们放弃第一种方案的设计思想,参考网络上流行的连连看的游戏,设计出第二种方案。 3.2功能描述本设计采用单机模式,当在规定的时间内消完全部的图片则当前关卡通过,如果在规定的时间内没能消完所有的图片则游戏结束,重新开始新游戏。游戏规则是模仿普通的连连看游戏,主要是鼠标两次点击的图片能否消去的问题。当前,前提是点击两张相同的图片,若点击的是同一张图片或者两张不同的图片,则不予处理。在两张想同图片用三根以内的直线能连在一起,就可以消去;否则,不予处理。游戏过程,如果玩家在一定的时间内消完则提示玩家胜利;如果在一定时间内图片没有消完则提示玩家时间到。3.3 功能需求1、 设计游戏界面2、 游戏基本功能3、 在游戏无解决方案时重排3.4 功能模块及思路3.4.1 解决游戏区域问题 这个问题最简单,但是却是最花时间的。正所谓:万事开头难。刚开始想了好多控件来实现。比如Label,Panel等等,后来在参考文献中发现一个扫雷游戏可以通过image控件来画图。因此在几天之后才解决这个最早的最简单的也是最头疼的问题。 3.4.2 获取图片位置的思路 首先,最基本的就是关于程序图片的位置怎么获取,以及如何控制。这里采用最常用的方法数组。考虑到图片是多行多列的格式。所以采用二维数组(数组名为flag)的方式来控制比较直观,并且为了程序容易解读,统一在不同过程中用名为i和j的变量来分别表示行列。程序开始时给数组中的各个元素赋初值为0,即表示没有图片。 然后数组控制整个游戏区域,游戏区域最外围为空白区域,即相关元素的值为0。这样就可以保证游戏刚开始后,第二层显示的图片之间的相连路径处理时就没有阻碍了。 现在介绍flag数组具体控制图片的过程,首先,由于每张图片显示的宽度高度为3947,所以整个控件设置为468376(包括外围空白的两行两列)。而每张图片可以用flagi,j来表示,它在image内部的位置为x=i*39到(i+1)*39,y=j*47到(j+1)*47这样image控件内的一点M(x,y)所对应的图片就可以转化为数组flagi,j的值来判断。这个思路的具体算法可以后面的3.2.2的第二个步骤中得以体现。 3.4.3 分类判断法 这里实质上是一种递归的思想,要判断图片A与图片B能否通过一条有N个转角的路径相连,可以转化为判断能否找到图片C,C与A能直线相连,且C与B能用一条有N-1个转角的路径相连。若这样的图片C存在,那么A与B就可以通过一条有N个转角的路径相连。 根据转角数不得超过2个的规则,我们可以分为转角数分别为0个、1个、2个这三种情况分别讨论。 (1)0转角连通(直线连通):两个图片的纵坐标或横坐标相等,且两者连线间没有其他图案阻隔。 (2)一个转角连通:其实相当于两个图片划出一个矩形,这两个图片是一对角顶点,另外两个顶点如果可以同时和这两个棋子直连,那就说明可以一折连通。见下图两个红色棋子的连通情况,右上角打叉的位置就是折点。 (3)两个转角连通: 判断图片A与图片B能否经过有两个转角的路径连通实质上可以转化为判断能否找到一个点C,这个C点与A可以直线连通,且C与B可以通过有两个转角的路径连通。若能找到这样一个C点,那么A与B就可以经过有两个转角的路径连通 。 判断是否经两个转角连通的算法需要做两个方向上的扫描:水平扫描和垂直扫描。 水平扫描。为了判断A,B能否通过2个转角连通,则从A开始在水平方向上向左右扫描,并判断经过的点能否与B点经过1个转角连通。显然C点能与B点经1个转角连通,故A,B能经2个转角连通。垂直扫描。为了判断A,B能否通过2个转角连通,则从A开始在垂直方向上下扫描,并判断经过的点能否与B点经过1个转角连通。显然C点能与B点经1个转角连通,故A,B能经2个转角连通。3.5 系统需求分析总结通过对现行连连看系统的调查与分析,本系统的结构基本合理,系统功能基本能够达到Windows小游戏的要求。本系统的输入边界是用户进行鼠标事件操作,图片全部消除,游戏结束,并且游戏胜利。通过对连连看游戏规则以及相关算法的分析,本系统总的数据量较小,规模不大,适合于在普通微机或小型机上运行。四、设计方案4.1 总体设计4.1.1系统流程图如图4-1-1所示: 图4-1-1 系统流程图4.1.2 游戏详细过程流程图 如图4-1-2所示: 图4-1-2 游戏过程流程图4.2 详细设计4.2.1 游戏界面1、游戏初始界面 如下图4-2-1所示游戏界面设计比较简洁,一个PictureBox控件,以及一个Group控件。其中group控件中包含了时间显示,未消除的图片数量显示和一个progressBar控件。具体界面如图4-2-1所示:图4-2-1 基本界面图2、 游戏完成界面 如图4-2-2所示 图4-2-2 完成界面3、 游戏重列界面 如图4-2-3所示图4-2-3 重列4.2.2 游戏各功能及代码1、游戏界面初始化 public class LLKanTest implements ActionListener JFrame mainFrame; / 主面板 JButton firstButton, secondButton; / 第一二次选择button Container thisContainer; JPanel centerPanel, eastPanel, northPanel; /子面板 public static int ROW=8,COLUMN=8; JButton game_all = new JButtonROWCOLUMN; / 游戏实际按钮数组 JButton exitButton, resetButton, newlyButton; / 退出,重列,重新开始按钮 int game_grid = new int1010; static boolean flag = false; / 判断是否有按钮被选中 int row1 = 0, column1 = 0, row2 = 0, column2 = 0; int fristMsg =0, secondMsg = 0, validateLV; / 游戏按钮的位置坐标 int i, j, k, n; String str=src/images/,str1=.jpg; ImageIcon icon; public void init() Border border = BorderFactory.createBevelBorder(BevelBorder.LOWERED, Color.blue, Color.yellow,Color.blue,Color.yellow); mainFrame = new JFrame(无聊连连看); thisContainer = mainFrame.getContentPane(); /得到内存中窗体内容 thisContainer.setLayout(new BorderLayout(); /实现窗体 centerPanel = new JPanel(); eastPanel = new JPanel(); northPanel = new JPanel(); thisContainer.add(centerPanel,Center); eastPanel.setBorder(border); thisContainer.add(eastPanel,East); thisContainer.add(northPanel,North); centerPanel.setLayout(new GridLayout(ROW,ROW); /* * 画button */ for ( row1 = 0; row1 ROW; row1+) for ( column1 = 0; column1 15) game_gridrow1+1column1+1=0; game_allrow1column1= new JButton(); game_allrow1column1.setBorder(border); centerPanel.add(game_allrow1column1); game_allrow1column1.setVisible(false); else icon = new ImageIcon(str+game_gridrow1+1column1+1+str1); game_allrow1column1 = new JButton(null,icon); game_allrow1column1.setBorder(border); game_allrow1column1.addActionListener(this); /添加响应事件 centerPanel.add(game_allrow1column1); newlyButton = new JButton(重玩); newlyButton.addActionListener(this); resetButton = new JButton(重列); resetButton.addActionListener(this); exitButton = new JButton(退出); exitButton.addActionListener(this); eastPanel.add(exitButton); eastPanel.add(resetButton); eastPanel.add(newlyButton); mainFrame.setBounds(300, 100, 850, 500); mainFrame.setVisible(true); mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); /退出后关闭程序 2、游戏随机布局/* * 随机布局 */ public void randomBuild() int randoms, col01, row01; for (int ii = 1; ii = ROW*COLUMN/2; ii+)/一共ROW*COLUMN/2对button randoms = (int) (Math.random() * 25 +1);/button上的数字 for (int jj = 1; jj = 2; jj+) col01 = (int) (Math.random() * ROW + 1); row01 = (int) (Math.random() * ROW + 1); while (game_gridcol01row01 != 0) /等于0说明这个空格有了button col01 = (int) (Math.random() * ROW + 1); row01 = (int) (Math.random() * ROW + 1); this.game_gridcol01row01 = randoms; 3、 选择图片获取用户点击两张图片的位置,并传入xiaochu()函数进行判断public void estimateEven(int placerow2, int placecolumn2, JButton bz) if (flag = false) row2 = placerow2; column2 = placecolumn2; secondMsg = game_gridrow2column2; secondButton = bz; flag = true; else row1 = row2; column1 = column2; fristMsg = secondMsg; firstButton = secondButton; row2 = placerow2; column2 = placecolumn2; secondMsg = game_gridrow2column2; secondButton = bz; if (fristMsg = secondMsg &secondButton != firstButton) /button不同数字相同则消掉 xiaochu(); 4、判断消除图片1. 消除图片时要判断是否可达,即优化判断是否可以消除的算法是本程序的灵魂,连连看游戏分为三种消去方式,分别为“0折型”,“一折型”,“两折型”,由图4-5可以看出,如果两点间只需要一条直线能够连接起来,则A、B两点的横坐标或纵坐标必定相同,有了这个条件,我们判断 A、B两点是否只需要一条直接连接就简单了许多。其分析如下:1.“0折型”:水平消去或者垂直消去,如果两个点击的两个图片相同,并且它们在同一水平或垂直方向上,即返回H_LINE的画线类型,代码如下:if (row1 = row2 & (column1 = column2 + 1 | column1 =column2 - 1) | (row1 = row2 + 1 | row1 = row2 - 1) &(column1 = column2) / 判断是否相邻 remove();2.“一折型”,当点击的两个点相同,它们不在同一水平或垂直方向上,并且它们要用两条直线相连,就返回ONE_C_LINE,代码如:for (j = 0; j j) /第二个按钮在空按钮右边 for (i = column2 - 1; i = j; i-) /检测从第二个按钮横向左边到空格所在列为止是否全是空格 if (game_gridrow2i != 0) k = 0; break; else k = 1; if (k = 1) line_check();/进入第二次验证,也就是从第一个按钮到它同行的空格之间的空格判断 if (column2 j) / 第二个按钮在空按钮左边 for (i = column2 + 1; i = j; i+) /检测从第二个按钮横向右边到空格所在列为止是否全是空格 if (game_gridrow2i != 0) k = 0; break; else k = 1; if (k = 1) line_check(); if (column2 = j) /第二个按钮和空按钮同列 line_check(); 3.“两折型”,当点击的两个点相同,它们不在同一水平或垂直方向上,并且它们要用三条直线相连,就返回TWO_C_LINE,代码如下:if (k = 2) if (row1 = row2) /第一,二按钮在同行 remove(); if (row1 row2) /第二按钮在第一按钮下边 for (n = row1; n row2) /第一按钮在第二按钮上边 for (n = row1; n = row2 + 1; n-) if (game_gridnj != 0) k = 0; break; if (game_gridnj = 0 & n = row2 +1) remove(); 3、 消除图片代码public void remove() firstButton.setVisible(false); secondButton.setVisible(false); flag = false; k = 0; game_gridrow1column1 = 0; gam

温馨提示

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

评论

0/150

提交评论