JAVA实现连连看课程设计.doc_第1页
JAVA实现连连看课程设计.doc_第2页
JAVA实现连连看课程设计.doc_第3页
JAVA实现连连看课程设计.doc_第4页
JAVA实现连连看课程设计.doc_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

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

文档简介

目录第一章 系统描述. . . (1)第二章 分析与设计. . . (2)一、 功能分析. . . (2)二、 流程图. . . (2)三、 设计要求. . . (3)1、 实验环境. . .(3)2、 实验预备知识. . .(3)3、 课程设计要求. . .(3)第三章 连连看系统设计. . .(4)一、 算法设计. . .(4)二、 类的实现. . .(5)三、 方法的实现. . .(5)第四章 测试分析. . .(5)一、 运行情况. . .(5)二、 测试计划及分析. . .(9)1、 检验的先后顺序. . .(9)2、 程序异常处理. . .(9)第五章 心得体会. . .(10)第六章 参考文献. . .(11)附件. . .(11)第一章 系统描述近年来,java作为一种新的编程语言,以其简单性、可移植性和平台无关性等优点,得到了广泛地应用,特别是java与万维网的完美结合,使其成为网络编程和嵌入式编程领域的首选编程语言。一个学期的时间来学习java这门课,感觉还不错,因为我们不但学习了书上理论的东西,还安排了上机操作课。学习一门计算机语言必定离不开实践,只有通过实践我们才能体会到书本上体会不到的东西。所以,我们不仅要认真学习课本理论知识,更重要的是要通过上机实践才能增强和巩固我的知识。课程设计是培养我们综合运用所学知识,发现、提出、分析和解决实际问题,锻炼实践能力的重要环节,是我们实践能力与创新精神的综合培养;在实践能力方面培养我们理论与实践相结合的作风,增强了我们将来在人才市场上的竞争力。所以,对于我们初学者,首先利用课程设计这样的较小项目锻炼自己的科学研究精神和提高创新能力,是很有必要的。课题设计的目的:1、进一步加深对java语言的理解和掌握;将所学的java知识运用于实践中。2、 课程设计将理论与实践相结合,提供了一个既动手又动脑,独立实践的机会,锻炼我们的分析解决实际问题的能力,提高学生适应实际,实践编程的能力; 3、熟练掌握java语言中图形用户界面程序的编写;4、大体了解怎样用java来编写小游戏的,增强我们实践能力和创新精神的综合培养。可行性论证:“连连看”游戏是一个经典的游戏,它因操作简单、娱乐性强而广受欢迎。我们通过所学的java,利用eclipse设计了一个操作简单、界面美观、功能较齐全的“连连看”游戏。通过本游戏的开发,达到学习java技术和熟悉软件开发流程的目的。这个游戏是用图形界面实现的,通过编译解释后,出现一个图开界面。界面上方有一行菜单栏,点击菜单栏上的游戏按钮,出现下拉菜单,选择开始,进入游戏界面,游戏界面是由若干个隐形小方格组成的,每一个小方格里有一个图标,如果在一个边上有相同的图标,连续点击它们,若符合算法要求就会消失,且游戏期间有一定的时间限制。游戏还设有提示、退出、帮助的功能,方便游戏操作。第二章 分析与设计一、功能分析每次用户选择两个图形,如果图形满足一定条件(两个图形一样,且这两个图形之间存在转弯少于3的路径),则两个图形都能消掉。给定任意具有相同图形的两个格子,我们需要寻找这两个格子之间在转弯最少的情况下,经过格子数目最少的路径。如果这个最优路径的转弯数目少于3 ,则这两个格子可以消去。将界面中相同的图片消去,游戏设有时限,如果在规定的时间内没有完成,就会跳出对话框“ ”的字样。如果玩家赢了这局,还没有过瘾的话,可以单击“再来一局”。判断游戏是否结束。如果所有图形全部消去,或者游戏玩家不可能再消去任意两个格子的时候,游戏应该结束。后一种情况,我们称之为“死锁”。在死锁的情况下,我们也可以暂时不终止游戏,而是随机打乱局面,使得打破“死锁”局面。不管怎样,我们需要判别游戏当前状态是否为“死锁”状态。我们首先思考问题:怎么判断两个图形能否相消?前面分析中,我们已经知道,两个图形能够相消,当且仅当这两个图形相同,且它们之间存在路径转弯数目小于3。因此,我们主要需要解决的问题还是,怎样求出相同图形之间的最短路径?这个最短的路径,我们首先需要保证转弯数目最少。在转弯数目最少的情况下,经过的格子数目要尽可能地少。在经典的最短路问题中,我们需要求出经过格子数目最少的路径。而这里,要保证转弯数目最少,需要把最短路问题的目标函数修改为从一个点到另一个点的转弯次数。虽然,目标函数修改了,但算法的框架仍然可以保持不变。广度优先搜索是解决经典最短路问题的一个思路。我们看看在新的目标函数(转弯数目最少)下,如何用广度优先搜索来解决图形a(x1,y1)和图形b(x2,y2)之间的最短路问题。二、流程图开始初始化设置开始界面画表格初始化数值游戏游戏是否结束显示游戏结束画面结束noyes三、设计要求 1、实验环境 在windows xp系统下,java程序设计语言及相应的集成开发环境,利用eclipse实现。2、实验预备知识熟悉java语言及eclipse的操作。3、课程设计要求按课程设计指导书提供的课题,要求学生组成小组完成各个操作环节,并能实现且达到举一反三的目的,完成一个项目解决一类问题。要求学生能够全面、深入理解和熟练掌握所学内容,并能够用其分析、设计和解答类似问题;对此能够较好地理解和掌握,能够进行简单分析和判断;能编写出具有良好风格的程序;掌握java程序设计的基本技能和面向对象的概念和方法;了解多线程、安全和网络等编程技术。同时培养学生进行分析问题、解决问题的能力;培养学生进行设计分析、设计方法、设计操作与测试、设计过程的观察、理解和归纳能力的提高。第三章 连连看系统设计一、 算法设计 在检验两个方块能否消掉的时候,我们要让两个方块同时满足两个条件才行,就是两者配对并且连线成功。分3种情况:(从下面的这三种情况,我们可以知道,需要三个检测,这三个检测分别检测一条直路经。这样就会有三条路经。若这三条路经上都是空按钮,那么就刚好是三种直线(两个转弯点)把两个按钮连接起来了) 1.相邻 2. 若不相邻的先在第一个按钮的同行找一个空按钮。1).找到后看第二个按钮横向到这个空按钮所在的列是否有按钮。2).没有的话再看第一个按钮到与它同行的那个空按钮之间是否有按钮。3).没有的话,再从与第一个按钮同行的那个空按钮竖向到与第二个按钮的同行看是否有按钮。没有的话路经就通了,可以消了. 3.若2失败后,再在第一个按钮的同列找一个空按钮。1).找到后看第二个按钮竖向到这个空按钮所在的行是否有按钮 2).没有的话,再看第一个按钮到与它同列的那个空按钮之间是否有按钮。3).没有的话,再从与第一个按钮同列的那个空按钮横向到与第二个按钮同列看是否有按钮。没有的话路经就通了,可以消了。 若以上三步都失败,说明这两个按钮不可以消去。二、类的实现 成员变量也叫类的属性,一般带有访问控制属性的,而全局变量虽然也有类的属性,但全局变量严重影响了封装和模块化,一般的全局变量前面要加上static和 fina属性其中,static使该变量任何类都可用(方法 classname.全局变量名) ,而 fina则使得变量不可更改,基本上算是常量了,这也在一定程度上防止对变量的非法修改。表1-1 成员变量 成员变量描述变量类型名称文件filefile文件名stringlikapp菜单栏类jmenubarappend菜单类jmenuclearcreateemptyborder菜单项jmenuitemcreatehorizontalstrutcreatelinebordercreateverticalstrutequals面板类jpanelget三、方法的实现方法名称为任何合乎语法的识别字,返回值类型是方法执行结果返回给调用者的数据类型,void表示没有返回值,参数行(parameterlist)是调用时给予的参数声明,两个以上的参数声明以逗号隔开,若没有参数则参数行为空白,调用时每一个参数对应一个参数值(argument)大括号内为方法本体,也称为方法程序模块(block),包含声明(declarations)和语句(statements),声明也可以掺杂在语句之间。一个方法不能声明在另一个方法内。第四章 测试分析 一、 运行情况 连连看游戏规则很简单,就是点中两个互相匹配并且可以通过不多于两个折点的折线连在一起的方块后,这两个方块就可以消掉。点击运行,进入初始界面。初始界面:点击菜单栏中的“游戏”,出现下拉菜单,选择“开始”按钮,进入游戏开始界面。 游戏开始界面:游戏者顺利在限定时间内,完成游戏后,系统会弹出消息框,显示“恭喜你过关!”成功过关界面:进入初始界面后,使用者若不懂游戏规则,可点击菜单栏中“帮助”按钮,在出现的下拉菜单中,点击“关于”,则出现如下消息框,显示游戏规则。帮助界面:当游戏者在进行游戏时,找不到相同的图标可以消去,则可以点击菜单栏中的“游戏”,在下拉菜单中点击“提示”,则提示两个可消去图标,且方格变为绿色。提示界面:在限制时间内,若游戏者没有完成游戏,则会弹出消息框,显示“抱歉,你没有通过!”的消息。失败界面:粗略想来,由于用户每次只能消除一对图形,即只会用到一个最短路径,但由于实现并不知道用户会选择哪一对图形,所以需要事先计算出所有可能的最短路径并保存起来。此外,采用这种方法的话似乎每次用户消去一对相同图像之后都需要重新计算出当前所有可能被连接的相同图形之间最短路径,这是因为当某些图像被消去之后可能会产生很多新路径,而我们又不能确定这些空出来的格子到底能够影响哪些路径,所以就只好都重新计算一遍。其缺点很明显就是每次消去图形动作之后重新计算所有可能的最短路径所需要消耗的时间;而该方法的优点则是可以很快地判断两个相同图形之间是否存在满足条件的最短路径。如果用户很厉害,每次都能选中可以消除的图形对,那么用这种方法浪费的时间就会相当可观,毕竟用户未选中的其他可以连接的图形对之间的最短路径都被浪费掉了;而如果用户很差劲,每轮选择的次数都远远大于当前可能的连接数量时,该方法就会比书中正文提到的方法高效。但这种情况是比较少的,因为在整个游戏中用户主要是会用眼睛“找”而不是频繁的用鼠标去“试”。所以总的来看,维护所有最短路径的方法的效率相对比较低。二、 测试计划及分析 1、检验的先后顺序在检验两个方块能否消掉的时候,我们要让两个方块同时满足两个条件才行,就是两者配对并且连线成功。所以,这里应该先检验配对,如果该条件不成立的话,就不要再进行连线检查了,这样可以避免很多不必要的复杂运算。当然,如果你在做这个游戏的时候,配对规则不够如此简单的话,那么就看哪个算起来麻烦就把它放在后面。 2、程序异常处理本程序没有涉及到程序的异常处理,只有关于“死锁”问题,本质上还是判别两个格子是否可以消去的问题。最直接的方法就是,对于游戏中尚未消去的格子,两两都计算一下,它们是否可以消去。此外,从上面的广度优先搜索可以看出,我们每次都是扩展出起始格子a(x1,y1)能够到达的格子。也就是说,对于每一个格子,我们可以调用一次上面的扩展过程,得到所有可以到达的格子,如果这些格子中有任意一个跟起始格子的图形一致,则它们可以消去,目前游戏还不是“死锁”状态。第五章 心得体会 这次的课程设计是新学期开始后的第一个任务,说真的,我本人有一些不太喜欢刚开学就进行课程设计,因为还没有怎么从寒假调节过来,有点懒散,因此在课程设计开始的第一天,只是突发奇想的想要做一个连连看的系统,因为上学期才学过java,我自认为不会太难,所以从网上下载了几个模版,参看java课程设计案例精编,下载了jbuilder9,最后才发觉根本不需要,只要用eclipse,一直以为会很简单,真正做的时候才发现,并不是。 而我们小组这次的课题是连连看游戏,这是一款时下较流行的小游戏,我们做的时候,并没有分模块,只是所有组员一起研究、讨论。我们的这款游戏用了我们上期学到的java中的swing组件,做该游戏系统时,因为对上期所学,有许多已快忘记,在做的时候要不断的查看书籍,要完成该系统,要实现上面的两个图片相同且两者相连时,连线的转折不会超过三,虽然在网上下载了一些模版,但此次我们小组的课程设计并不完善,比如说时间限制,在时间到了之后,虽会弹出警告窗口,却并不阻止游戏的继续,也没有音频设置,更甚至在游戏结束后,不会显示下一局,玩家如果要继续玩,则必须退出后,重新进入,没有一定的灵活性。 虽然这次的课程设计没有达到预期的效果,但我也从中学到了许多,也进一步了解了java这门程序设计语言,也熟练了eclipse的使用,培养了与同伴的合作能力,以前很好奇那些游戏的来由,现在终于明白了其中的缘由,让我对这方面产生了兴趣,相信对我正在寻找的目标也有一定的帮助!第六章 参考文献1、黄晓东 java课程设计案例精编(第二版) 中国水利水电出版社 2007 2、陈海宁 java语言案例教程 北京工业大学 20073、李尊朝、苏军 java语言程序设计 中国特到出版社 20074、m.kalin 面向对象程序设计:java语言描述 北京机械工业出版社 20025、汪志达 java程序设计实训教程 北京科学出版社 20036、朱福喜、唐晓军 java程序设计技巧与开发实例 北京人民邮电出版社 20047、张晨、付冰、赵军等 java2应用编程150例 电子工业出版社 20038、梁天雨 java编程思想(第4版) 机械工业出版社 20049、陈楚寒 java与模式 电子工业出版社 200210、林邦杰 java程序设计入门教程 北京中国青年出版社 2001附件:import java.awt.*;import java.awt.event.actionevent;import java.awt.event.actionlistener;import java.util.hashmap;import javax.swing.*;public class c extends jframe implements actionlistener static int gray = 14; static int i = 18; boolean mukt; jtogglebutton add; jtogglebutton addactionlistener; b z; jmenubar append; jmenu clear; jmenu createemptyborder; jmenuitem createhorizontalstrut; jmenuitem createlineborder; jmenuitem createverticalstrut; jmenuitem equals; timer exit; jprogressbar c; hashmap b; jpanel get; public c() mukt = false; add = new jtogglebuttongrayi; addactionlistener = null; append = new jmenubar(); b = new hashmap(); z = new b(); c = new jprogressbar(0, 600); c.setvalue(0); c.setstringpainted(true); exit = new timer(1000, new i(this); rectangle rectangle=graphicsenvironment.getlocalgraphicsenvironment().getmaximumwindowbounds(); setsize(800, 600); setlocation(rectangle.width / 2 - 400, rectangle.height / 2 - 300); setresizable(false); setdefaultcloseoperation(3); settitle(连连看 235荣誉出品 欢迎进入本游戏 ); z = new b(); clear = new jmenu(游戏); clear.setmnemonic(g); createemptyborder = new jmenu(帮助); createemptyborder.setmnemonic(h); createhorizontalstrut = new jmenuitem(开始); createhorizontalstrut.setaccelerator(keystroke.getkeystroke(113, 0); createhorizontalstrut.setmnemonic(s); createverticalstrut = new jmenuitem(提示); createverticalstrut.setaccelerator(keystroke.getkeystroke(116, 0); createverticalstrut.addactionlistener(this); createverticalstrut.setenabled(false); createverticalstrut.setmnemonic(m); createlineborder = new jmenuitem(退出); createlineborder.setmnemonic(x); equals = new jmenuitem(关于); equals.setmnemonic(a); append.add(clear); append.add(createemptyborder); clear.add(createhorizontalstrut); clear.add(createverticalstrut); clear.add(createlineborder); createemptyborder.add(equals); clear.setfont(new font(dialog, 0, 14); createemptyborder.setfont(new font(dialog, 0, 14); createhorizontalstrut.setfont(new font(dialog, 0, 14); createlineborder.setfont(new font(dialog, 0, 14); equals.setfont(new font(dialog, 0, 14); createverticalstrut.setfont(new font(dialog, 0, 14); setjmenubar(append); createhorizontalstrut.addactionlistener(this); createlineborder.addactionlistener(this); equals.addactionlistener(this); public final void actionperformed(actionevent actionevent) if(actionevent.getsource() instanceof jtogglebutton) jtogglebutton jtogglebutton = (jtogglebutton)actionevent.getsource(); if(mukt) if(addactionlistener.getactioncommand().equals(jtogglebutton.getactioncommand() & addactionlistener != jtogglebutton) point point = (point)b.get(addactionlistener); point point1 = (point)b.get(jtogglebutton); if(z.i(point.x, point.y, point1.x, point1.y) z.i(point.x, point.y, 0); z.i(point1.x, point1.y, 0); addactionlistener.seticon(null); addactionlistener.setenabled(false); jtogglebutton.seticon(null); jtogglebutton.setenabled(false); if(z.c() = null) z.b(); i(); if(z.z() joptionpane.showmessagedialog(null, 恭喜你过关!); exit.stop(); mukt = false; addactionlistener.setselected(false); jtogglebutton.setselected(false); else mukt = false; addactionlistener.setselected(false); jtogglebutton.setselected(false); else addactionlistener = jtogglebutton; mukt = true; jtogglebutton.setselected(true); else if(actionevent.getsource() instanceof jmenuitem) jmenuitem jmenuitem = (jmenuitem)actionevent.getsource(); if(jmenuitem = createhorizontalstrut) gray(); else if(jmenuitem = createverticalstrut) if(z.c() != null) (new z(this).start(); else joptionpane.showmessagedialog(null, no path!); else if(jmenuitem = createlineborder) system.exit(0); else if(jmenuitem = equals) joptionpane.showmessagedialog(null, 选择相同的两个图标,如果它们能在至多转三个弯的情况下相连,就可以消掉!); swingutilities.updatecomponenttreeui(this); public final void gray() getcontentpane().add(box.createhorizontalstrut(20), west); getcontentpane().add(box.createhorizontalstrut(20), east); getcontentpane().add(box.createverticalstrut(20), south); get = new jpanel(); get.setbackground(color.white); get.setborder(borderfactory.createlineborder(color.gray, 2); getcontentpane().add(get, center); get.setlayout(new gridlayout(14, 18, 5, 5); z.i(); for(int i = 0; i gray; i+) for(int j = 0; j i; j+) if(i = 0 | j = 0 | i = gray - 1 | j = i - 1) addij = new jtogglebutton(); addij.getmodel().setenabled(false); addij.setactioncommand(string.valueof(0); else int k = z.i(i, j); string s = /images/ + k + .gif; .url url = getclass().getresource(s); addij = new jtogglebutton(new imageicon(url); addij.setactioncommand(string.valueof(k); addij.setbackground(color.white); addij.setborder(borderfactory.createemptyborder(); addij.addactionlistener(this); get.add(addij); b.put(addij, new point(i, j); b.put(new point(i, j), addij); jpanel jpanel = new jpanel(); jpanel.setborder(borderfactory.createlineborder(jpanel.getbackground(), 5); jpanel.setlayout(new borderlayout(); jpanel.add(c, center); getcontentpane().add(jpanel, north); createverticalstrut.setenabled(true); exit.start(); createhorizontalstrut.setenabled(false); public final void i() b.clear(); for(int i = 0; i gray; i+) for(int j = 0; j i; j+) if(i = 0 | j = 0 | i = gray - 1 | j = i - 1) addij.seticon(null); addij.setenabled(false); addij.setactioncommand(string.valueof(0); else if(z.i(i, j) = 0) addij.seticon(null); addij.setenabled(false); addij.setactioncommand(string.valueof(0); else int k = z.i(i, j); string s = /images/ + k + .gif; .url url = getclass().getresource(s); addij.seticon(new imageicon(url); addij.setenabled(true); addij.setactioncommand(string.valueof(k); addij.setborder(borderfactory.createemptyborder(); b.put(addij, new point(i, j); b.put(new point(i, j), addij); import java.awt.point;import java.util.random;public class b static int mukt = 14; static int append = 18; int max; int min; int nextint; public b() max = new intmuktappend; min = new intmuktappend; nextint = new int40; for(int i = 0; i 40; i+) nextinti = 3; for(int j = 0; j mukt; j+) for(int k = 0; k append; k+) minjk = 0; public final void i(int i, int j, int k) maxij = k; public final int i(int i, int j) return maxij; public final boolean i(int i, int j, int k, int l) if(i = k & j = l) return false; if(i(i, j) != i(k, l) return false; int i1 = i(i, j); int j1 = i(k, l); i(i, j, 0); i(k, l, 0); for(int k1 = 0; k1 mukt; k1+) if(append(k1, j, l) & mukt(j, k1, i) & mukt(l, k1, k) i(i, j, i1); i(k, l, j1); return true; for(int l1 = 0; l1 append; l1+) if(mukt(l1, i, k) & append(i, l1, j) & append(k, l1, l) i(i, j, i1); i(k, l, j1); return true; i(i, j, i1); i(k, l, j1); return false; public final void i() random random = new random(); for(int i = 0; i mukt

温馨提示

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

评论

0/150

提交评论