Java连连看课程设计 .doc

上传人:文库蛋蛋多 文档编号:2387110 上传时间:2023-02-17 格式:DOC 页数:37 大小:367KB
返回 下载 相关 举报
Java连连看课程设计 .doc_第1页
第1页 / 共37页
Java连连看课程设计 .doc_第2页
第2页 / 共37页
Java连连看课程设计 .doc_第3页
第3页 / 共37页
Java连连看课程设计 .doc_第4页
第4页 / 共37页
Java连连看课程设计 .doc_第5页
第5页 / 共37页
点击查看更多>>
资源描述

《Java连连看课程设计 .doc》由会员分享,可在线阅读,更多相关《Java连连看课程设计 .doc(37页珍藏版)》请在三一办公上搜索。

1、 摘要关键字:发展,java,连连看,程序设计;现代科学技术的发展,改变了人类的生活,作为新世纪的大学生,应该站在时代发展的前沿,掌握现代科学技术知识,以适应社会的发展,能够独立完成面临的任务,作一名有创新意识的新型人才。Java语言的学习热潮并没有因为时间的推移而消退,相反,由于计算机技术的发展所带来的新应用的出现,Java越来越流行,这种情况是以往程序设计语言在其生存周期内所不多见的。Java语言之所以这样长盛不衰,一是因为其众多的技术特点与现今的应用十分合拍,可以覆盖大部分的需求;二是因为SUN公司不断推出新的版本,完善Java自身的功能。有了这两点,Java语言成为程序员首选的程序设计

2、开发工具就在情理之中了。连连看游戏是一种很流行的小游戏,记得在小时候去游戏厅玩的时候就有两台专门的连连看的机器(当然当时不叫这个名字),一个是连麻将牌、另一个是连水果图片。当时的麻将牌分好几层,相邻层的牌还可以连,看得人眼花缭乱。作为一个java初学者,我所编辑的“悠嘻猴连连看”小游戏,只有几个基本功能:“开始”“再来一局”炸弹“重新开始”“退出”。我所选中给出的游戏界面很漂亮,不过似乎图形只有一层,而且数量也不是很多,只有64张图,降低了不少难度。目 录摘要I第1章 需求分析11.1 功能分析11.2 流程图2第2章 详细设计32.1课程设计目的32.2 课程设计的实验环境32.3 课程设计

3、的预备知识32.4 课程设计要求32.5 连连看算法设计42.6类的实现方法42.6.1 成员变量42.6.2 方法设计5第3章 测试分析73.1程序运行情况73.2测试计划及分析93.2.1检验的先后顺序93.2.2程序异常处理9第4章 课程设计总结10附件A1参考资料26第1章 需求分析 1.1 功能分析每次用户选择两个图形,如果图形满足一定条件(两个图形一样,且这两个图形之间存在转弯少于3的路径),则两个图形都能消掉。给定任意具有相同图形的两个格子,我们需要寻找这两个格子之间在转弯最少的情况下,经过格子数目最少的路径。如果这个最优路径的转弯数目少于3 ,则这两个格子可以消去。将界面中相同

4、的猴子图片消去,游戏限时1000秒,如果在规定的时间内没有完成,就会跳出对话框“笨蛋!游戏时间到!GAME OVER !”的字样。如果玩家赢了这局,还没有过瘾的话,可以单击“再来一局”。判断游戏是否结束。如果所有图形全部消去,或者游戏玩家不可能再消去任意两个格子的时候,游戏应该结束。后一种情况,我们称之为“死锁”。在死锁的情况下,我们也可以暂时不终止游戏,而是随机打乱局面,使得打破“死锁”局面。不管怎样,我们需要判别游戏当前状态是否为“死锁”状态。我们首先思考问题:怎么判断两个图形能否相消?前面分析中,我们已经知道,两个图形能够相消,当且仅当这两个图形相同,且它们之间存在路径转弯数目小于3。因

5、此,我们主要需要解决的问题还是,怎样求出相同图形之间的最短路径?这个最短的路径,我们首先需要保证转弯数目最少。在转弯数目最少的情况下,经过的格子数目要尽可能地少。在经典的最短路问题中,我们需要求出经过格子数目最少的路径。而这里,要保证转弯数目最少,需要把最短路问题的目标函数修改为从一个点到另一个点的转弯次数。虽然,目标函数修改了,但算法的框架仍然可以保持不变。广度优先搜索是解决经典最短路问题的一个思路。我们看看在新的目标函数(转弯数目最少)下,如何用广度优先搜索来解决图形A(x1,y1)和图形B(x2,y2)之间的最短路问题。1.2 流程图 第2章 详细设计2.1课程设计目的JAVA程序设计是

6、计算机相关专业的必修专业基础课程,其实践性、应用性很强。实践教学环节是必不可少的一个重要环节。本课程的程序设计专题实际是计算机相关专业学生学习完JAVA程序设计课程后,进行的一次全面的综合训练,JAVA程序设计的设计目的是加深对理论教学内容的理解和掌握,使学生较系统地掌握程序设计及其在网络开发中的广泛应用,基本方法及技巧,为学生综合运用所学知识,利用软件工程为基础进行软件开发、并在实践应用方面打下一定基础。2.2 课程设计的实验环境硬件要求能运行Windows 9.X操作系统的微机系统。JAVA程序设计语言及相应的集成开发环境,UltraEdit-32开发工具。2.3 课程设计的预备知识熟悉J

7、AVA语言及UltraEdit-32开发工具。2.4 课程设计要求按课程设计指导书提供的课题,要求学生在自行完成各个操作环节,并能实现且达到举一反三的目的,完成一个项目解决一类问题。要求学生能够全面、深入理解和熟练掌握所学内容,并能够用其分析、设计和解答类似问题;对此能够较好地理解和掌握,能够进行简单分析和判断;能编写出具有良好风格的程序;掌握JAVA程序设计的基本技能和面向对象的概念和方法;了解多线程、安全和网络等编程技术。同时培养学生进行分析问题、解决问题的能力;培养学生进行设计分析、设计方法、设计操作与测试、设计过程的观察、理解和归纳能力的提高。2.5 连连看算法设计在检验两个方块能否消

8、掉的时候,我们要让两个方块同时满足两个条件才行,就是两者配对并且连线成功。* 分3种情况:(从下面的这三种情况,我们可以知道,需要三个检测,这三个检测分别检测一条直路经。这样就会有三条路经。若这三条路经上都是空按钮,那么就刚好是三种直线(两个转弯点)把两个按钮连接起来了) * 1.相邻 * 2. 若不相邻的先在第一个按钮的同行找一个空按钮。1).找到后看第二个按钮横向到这个空按钮所在的列是否有按钮。2).没有的话再看第一个按钮到与它同行的那个空按钮之间是否有按钮。3).没有的话,再从与第一个按钮同行的那个空按钮竖向到与第二个按钮的同行看是否有按钮。没有的话路经就通了,可以消了. * 3.若2失

9、败后,再在第一个按钮的同列找一个空按钮。1).找到后看第二个按钮竖向到这个空按钮所在的行是否有按钮 2).没有的话,再看第一个按钮到与它同列的那个空按钮之间是否有按钮。3).没有的话,再从与第一个按钮同列的那个空按钮横向到与第二个按钮同列看是否有按钮。没有的话路经就通了,可以消了。* 若以上三步都失败,说明这两个按钮不可以消去。2.6类的实现方法2.6.1 成员变量成员变量也叫类的属性,一般带有访问控制属性的,而全局变量虽然也有类的属性,但全局变量严重影响了封装和模块化,一般的全局变量前面要加上static和 fina属性其中,static使该变量任何类都可用(方法 ClassName.全局变

10、量名) ,而 fina则使得变量不可更改,基本上算是常量了,这也在一定程度上防止对变量的非法修改。表 2-6-1 成员变量 成员变量描述变量类型名称文件FileFile文件区JtextareaTextarea菜单项JmenuitemMenuitem_copy菜单UmenuitemUmenuitem标签JlabelLabel_seek文件名StringSeel2.6.2 方法设计方法名称为任何合乎语法的识别字,返回值类型是方法执行结果返回给调用者的数据类型,void表示没有返回值,参数行(parameterlist)是调用时给予的参数声明,两个以上的参数声明以逗号隔开,若没有参数则参数行为空白,

11、调用时每一个参数对应一个参数值(argument)大括号内为方法本体,也称为方法程序模块(block),包含声明(declarations)和语句(statements),声明也可以掺杂在语句之间。一个方法不能声明在另一个方法内。表 2-6-2 方法定义方法名功能备注MyTextEditor创建文本编辑器构造方法Dialog创建对话框addMenu添加菜单栏菜单项writeToFile向文本区写文件readFromFile读文件openDialog打开文件saveDialog保存对话框actionPerformed事件处理itemStateChangedItemListener事件处理方法mo

12、useClicked鼠标处理事件接口方法mouseEvent鼠标处理事件接口方法mouseReleased鼠标处理事件接口方法mouseEntered鼠标处理事件接口方法mouseExit鼠标处理事件接口方法mouseDragged鼠标处理事件接口方法Main程序开始运行 第3章 测试分析3.1程序运行情况连连看游戏规则很简单,就是点中两个互相匹配并且可以通过不多于两个折点的折线连在一起的方块后,这两个方块就可以消掉。图1初始界面菜单选项中,包括“开始游戏”、“重新开始”、“炸弹”、“退出”功能。当选择炸弹功能时:每次含有三个炸弹,所炸的位置也是随机的;图2 游戏界面粗略想来,由于用户每次只能

13、消除一对图形,即只会用到一个最短路径,但由于实现并不知道用户会选择哪一对图形,所以需要事先计算出所有可能的最短路径并保存起来。此外,采用这种方法的话似乎每次用户消去一对相同图像之后都需要重新计算出当前所有可能被连接的相同图形之间最短路径,这是因为当某些图像被消去之后可能会产生很多新路径,而我们又不能确定这些空出来的格子到底能够影响哪些路径,所以就只好都重新计算一遍。其缺点很明显就是每次消去图形动作之后重新计算所有可能的最短路径所需要消耗的时间;而该方法的优点则是可以很快地判断两个相同图形之间是否存在满足条件的最短路径。如果用户很厉害,每次都能选中可以消除的图形对,那么用这种方法浪费的时间就会相

14、当可观,毕竟用户未选中的其他可以连接的图形对之间的最短路径都被浪费掉了;而如果用户很差劲,每轮选择的次数都远远大于当前可能的连接数量时,该方法就会比书中正文提到的方法高效。但这种情况是比较少的,因为在整个游戏中用户主要是会用眼睛“找”而不是频繁的用鼠标去“试”。所以总的来看,维护所有最短路径的方法的效率相对比较低。游戏结束后,在页面出现对话框,询问玩家是否进行下一局。3.2测试计划及分析3.2.1检验的先后顺序在检验两个方块能否消掉的时候,我们要让两个方块同时满足两个条件才行,就是两者配对并且连线成功。所以,这里应该先检验配对,如果该条件不成立的话,就不要再进行连线检查了,这样可以避免很多不必

15、要的复杂运算。当然,如果你在做这个游戏的时候,配对规则不够如此简单的话,那么就看哪个算起来麻烦就把它放在后面。3.2.2程序异常处理本程序没有涉及到程序的异常处理,只有关于“死锁”问题,本质上还是判别两个格子是否可以消去的问题。最直接的方法就是,对于游戏中尚未消去的格子,两两都计算一下,它们是否可以消去。此外,从上面的广度优先搜索可以看出,我们每次都是扩展出起始格子A(x1,y1)能够到达的格子。也就是说,对于每一个格子,我们可以调用一次上面的扩展过程,得到所有可以到达的格子,如果这些格子中有任意一个跟起始格子的图形一致,则它们可以消去,目前游戏还不是“死锁”状态。 第4章 课程设计总结通过这

16、次课程设计还使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,可以说得是困难重重,并且还发现了自己的许多不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固。但通过这次课程设计之后,一定把以前所学过的知识重新温故。我完成了这次JAVA课程设计,不过这只是我学习路上的驿站。我相信我在未来的学习中会记住从本次课程设计中所学到的东西,并将它用到未来的学习中去。在这里谢谢老师的指导,我会更加努力的学习附件A* * 类名: MainFrame

17、* 作用: 自定义主类,对鼠标拖拽的初始界面进行声明* * 继承的父类: JFrame类 * * 实现的接口: Strings* * import java.awt.*;import javax.swing.*;import cn.elva.Settings;import cn.elva.model.Map;public class MainFrame extends JFrameprivate static final long serialVersionUID = 1L;/炸弹的次数private int bombCount = Settings.BOMBCOUNT;private JPa

18、nel jContentPane = null;private JMenuBar menuBar = null;private JMenu fileMenu = null;private JMenuItem reloadItem = null;private JMenuItem startItem = null; /炸弹private JMenuItem bombItem = null;private JMenuItem exitItem = null;private MapUI mapUI = null;/ 游戏开始时间private long startTime;/ 结束时间private

19、 long endTime;private Timer timer = null;/ private JMenuItem tiprivate JMenuBar initMenuBar()if (menuBar = null)menuBar = new JMenuBar();fileMenu = new JMenu(菜单);startItem = new JMenuItem(开始游戏);startItem.addActionListener(new ActionListener()public void actionPerformed(ActionEvent e)reload(););reloa

20、dItem = new JMenuItem(重新开始);reloadItem.addActionListener(new ActionListener()public void actionPerformed(ActionEvent e)reload(););bombItem = new JMenuItem(炸弹);bombItem.addActionListener(new ActionListener()public void actionPerformed( ActionEvent e )if( bombCount=0 )JOptionPane.showMessageDialog(Mai

21、nFrame.this,三枚炸弹已用完! );bombItem.setEnabled(false);return;mapUI.bomb();bombCount-;);exitItem = new JMenuItem(退出);exitItem.addActionListener(new ActionListener()public void actionPerformed(ActionEvent e)System.exit(0););fileMenu.add(startItem);fileMenu.add(reloadItem);fileMenu.add( bombItem );fileMenu

22、.add(exitItem);menuBar.add(fileMenu);return menuBar;public static void main(String args)/ 自动生成方法存根SwingUtilities.invokeLater(new Runnable()public void run()MainFrame thisClass = new MainFrame();thisClass.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);thisClass.setVisible(true););public MainFrame()su

23、per();initialize();private void initialize()this.setSize(650, 650);this.setTitle(llk);this.setJMenuBar(initMenuBar();this.setTitle(悠嘻猴连连看);private void reload()mapUI = new MapUI();startTime = System.currentTimeMillis() / 1000;endTime = startTime + Settings.PERTIME;jContentPane = new JPanel();jConten

24、tPane.setLayout(new BorderLayout();jContentPane.add(mapUI);this.setContentPane(jContentPane);this.validate();Map.LEFTCOUNT = Settings.ROWS * Settings.COLUMNS;initTimer();bombItem.setEnabled(true);bombCount=Settings.BOMBCOUNT;private void initTimer()ActionListener actionListener = new ActionListener(

25、)public void actionPerformed(ActionEvent e)startTime = System.currentTimeMillis() / 1000;if (startTime = endTime)JOptionPane.showMessageDialog(MainFrame.this, 笨蛋!时间到! GAME OVER!);int result = JOptionPane.showConfirmDialog(MainFrame.this,重玩一次?, Again, JOptionPane.YES_NO_CANCEL_OPTION);if (result = JO

26、ptionPane.YES_OPTION)reload();elsejContentPane.setVisible(false);validate();timer = new javax.swing.Timer(1000, actionListener);timer.start();* * 类名: MapUI* 作用: 定义按钮和炸弹功能* * 继承的父类: JPanel类 * * 实现的接口: Stings * * import java.awt.*;import javax.swing.*;import cn.elva.Settings;import cn.elva.model.Array

27、Point;import cn.elva.model.Map;public class MapUI extends JPanel implements ActionListenerprivate static final long serialVersionUID = 1L;/ 棋子数组,用按钮来表示private ChessButton chesses = null;/ 数据模型private Map map = new Map();/ 判断当前点击的棋子是否是第二次选中的private boolean two = false;/ 前面点的那个棋子private ArrayPoint pri

28、viousPoint;/ 第二次选中的棋子private ArrayPoint currPoint; / 构造函数public MapUI()super();initialize(); / 初始化函数private void initialize()initChesses();GridLayout gridLayout = new GridLayout(Settings.ROWS + 2,Settings.COLUMNS + 2);gridLayout.setHgap(2);gridLayout.setVgap(2);this.setLayout(gridLayout);this.setSiz

29、e(300, 200);/ 放置按钮,按行for (int row = 0; row Settings.ROWS + 2; row+)for (int col = 0; col Settings.COLUMNS + 2; col+)add(chessesrow * (Settings.COLUMNS + 2) + col);private void initChesses()int values = map.getMap();/ 初始化棋子,和数据模型里保持一样 this.chesses = new ChessButton(Settings.ROWS + 2)* (Settings.COLUM

30、NS + 2);for (int row = 0; row 10; row+)for (int col = 0; col 10; col+)/ 通过二维的数据模型坐标得到一维的棋子坐标 int index = row * (Settings.COLUMNS + 2) + col;/ 对棋子的数据模型,即ArrayPoint对象进行设置,指定此棋子具体的位置和值chessesindex = new ChessButton(row, col, valuesrowcol);/ 添加监听器chessesindex.addActionListener(this);/ 将外围的一圈设为不可见,行,列为0

31、和为最大值的情况if (row = 0 | row = (Settings.ROWS + 2 - 1) | col = 0| col = (Settings.COLUMNS + 2 - 1)chessesindex.setVisible(false);public void clearCheese(ArrayPoint priviousPoint, ArrayPoint currPoint) / 处理匹配,看两点是否联通 int values = map.getMap(); / 将模型中对应的棋子设为0 valuespriviousPoint.getI()priviousPoint.getJ(

32、) = 0; valuescurrPoint.getI()currPoint.getJ() = 0; / 使两个已经消除的按钮不可见int index1 = priviousPoint.getI() * (Settings.COLUMNS + 2)+ priviousPoint.getJ();int index2 = currPoint.getI() * (Settings.COLUMNS + 2)+ currPoint.getJ();chessesindex1.setVisible(false);chessesindex2.setVisible(false); / 如果棋子总数已为0,则程序

33、结束if (map.LEFTCOUNT = 0)JOptionPane.showMessageDialog(this, 恭喜您通过!);/* * 事件监听器处理函数,也是处理棋子消除的地方 */public void actionPerformed(ActionEvent e)/ 获得当前的柜子ChessButton button = (ChessButton) e.getSource();/ 获得当前棋子的数据结构ArrayPoint p = button.getPoint();/ 如果已有两个棋子选中, 则进行判断操作if (two)currPoint = p;if( map.match(

34、this.priviousPoint, this.currPoint)clearCheese(this.priviousPoint, this.currPoint);/ 设置为没有两个按钮的选中的状态two = false;else/ 将当前点击的棋子赋给变量priviousPointthis.priviousPoint = p;/ 标志位设为TRUE,用于点击下个棋子的时候使用two = true; /炸弹的功能public void bomb()int values = map.getMap();ArrayPoint p1 = null;ArrayPoint p2 = null;for (

35、int row = 1; row Settings.ROWS + 1; row+)for (int col = 1; col Settings.COLUMNS + 1; col+)if (valuesrowcol != 0)p1 = new ArrayPoint(row, col, valuesrowcol);for (int i = 1; i Settings.ROWS + 1; i+)for (int j = 1; j Settings.COLUMNS + 1; j+)if (valuesij != 0)p2 = new ArrayPoint(i, j, valuesij);elsecon

36、tinue;if (map.match(p1, p2)clearCheese(p1, p2);return;* * 类名: ChessButton* 作用: 初始化游戏中鼠标点击按钮* * 继承的父类: JButton类 * * 实现的接口: 没有 * * import .*;import javax.swing.*;import cn.elva.Settings;import cn.elva.model.ArrayPoint;public class ChessButton extends JButtonprotected ArrayPoint point = null;public Che

37、ssButton(int row, int col, int value)this(new ArrayPoint(row, col, value);public ChessButton(ArrayPoint point)this.point = point;String name =Resource/+point.getValue() + Settings.RELEX;URL url = ChessButton.class.getResource(name);ImageIcon icon = new ImageIcon( url );this.setIcon(icon);/构造函数,使用默认值

38、public ChessButton()this(new ArrayPoint(0, 0, 0);/返回当前按钮代表的位置和值public ArrayPoint getPoint()return point;public void setPoint(ArrayPoint point)this.point = point;* * 接口名:Settings* 作用: 声明各个变量大小* * package cn.elva;public interface Settings /行数 public static final int ROWS = 8; /列数public static final in

39、t COLUMNS=8;/图片后缀名public static final String RELEX=.gif;/每局所花时间(秒)public static final int PERTIME = 600;/判断的时间间隔public static final int PER = 1;/炸弹的使用次数public static final int BOMBCOUNT = 3;* * 类名: Map* 作用: 连入图片并声明游戏规则* * package cn.elva.model;import java.util.Random;import cn.elva.Settings;public c

40、lass Map public static int LEFTCOUNT = Settings.ROWS * Settings.COLUMNS;/ 让其最外层的数据不显示,可以解决边框消除不掉的情况private int map = new intSettings.ROWS + 2Settings.COLUMNS + 2;/ 出现的不同图片个数private int maxKinds = 4;public Map()init();public int getMap()return map;private void init()int tempArr = new intSettings.ROWS * Settings.COLUMNS;int len = tempArr.length;/ 根据图片的种类数来确定数组大小,如有64张图片,每四个为一样的,则需要图片数为64/4=16for (int i = 0; i len / maxKinds; i+)tempA

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 建筑/施工/环境 > 项目建议


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号