课设贪吃蛇游戏.docx
- 文档编号:9904370
- 上传时间:2023-02-07
- 格式:DOCX
- 页数:30
- 大小:146.42KB
课设贪吃蛇游戏.docx
《课设贪吃蛇游戏.docx》由会员分享,可在线阅读,更多相关《课设贪吃蛇游戏.docx(30页珍藏版)》请在冰豆网上搜索。
课设贪吃蛇游戏
*******************
实践教学
*******************
软件学院
2016年春季学期
软件技术综合训练课程设计说明书
题目:
贪吃蛇游戏设计
专业班级:
2015级软件技术2班
姓名:
万鑫
学号:
1517770113
指导教师:
周小健
成绩:
摘要
Java最初被命名为Oak,目标设定在家用电器等小型系统的编程语言,来解决诸如电视机、电话、闹钟、烤面包机等家用电器的控制和通讯问题。
由于这些智能化家电的市场需求没有预期的高,Sun放弃了该项计划。
就在Oak几近失败之时,随着互联网的发展,Sun看到了Oak在计算机网络上的广阔应用前景。
于是改造了Oak,以“Java”的名称正式发布。
Sun公司对Java编程语言的解释是:
Java编程语言是个简单、面向对象、分布式、解释性、健壮、安全与系统无关、可移植、高性能、多线程和动态的语言。
贪吃蛇游戏设计与实现,主要分为以下二个模块:
游戏主界面模块和游戏控制模块。
在此只实现游戏的游戏主界面模块、游戏控制模块。
并且只是实现移动速度、暂停、重新开始等功能。
关键词:
java、多线程、贪吃蛇。
1序言
1.1课题的目标和意义
在市场《JAVA程序设计》是计算机相关专业的必修专业基础课程,其实践性、应用性很强。
实践教学环节是必不可少的一个重要环节。
本课程的程序设计专题实际是计算机相关专业学生学习完《JAVA程序设计》课程后,进行的一次全面的综合训练,JAVA程序设计的设计目的是加深对理论教学内容的理解和掌握,使学生较系统地掌握程序设计及其在网络开发中的广泛应用,基本方法及技巧,为学生综合运用所学知识,利用软件工程为基础进行软件开发、并在实践应用方面打下一定基础。
2需求分析
2.1需求前提
经过两天在图书馆以及网络上查阅的资料,然后提出这次课程设计的目标《贪吃蛇游戏》的设计。
然后接下来就是查阅更多的资料,制定接下来的详细计划,最终计划用两周的时间完成此次课程设计提出的案例。
2.2开发环境
硬件环境:
CPU:
IntelPentium(R)4
主频:
2.40GHz
软件环境:
操作系统:
WindowsXP
编程环境:
JDK1.6
开发工具:
Eclipsejdk
2.3用例图
3总体设计
3.1程序概述
本程序是一个利用Java应用软件制作的贪食蛇小游戏。
在游戏过程中,用户通过点击小键盘区的方向键来控制蛇的运行方向;游戏运行过程中,如果想暂停,只需要按F3键即可。
重新开始游戏的按键为F2。
当蛇没有吃到食物且碰到墙壁或自己的身体时游戏结束。
本程序的另一个功能是在程序运行窗口的左上角显示,用户在游戏过程中的移动和长度。
3.2总设计模块的划分
根据游戏需求中游戏所要实现的功能,整个游戏分为二个模块进行具体的设计,如图2所示。
游戏控制模块的主要框架如图3所示。
游戏暂停控制:
点击“F3”按钮,游戏暂停;再单击,游戏继续。
游戏重新开始控制:
点击“F2”键后,点击确定,即游戏重新开始。
游戏退出控制:
点击“F4”键好,点击确定,退出游戏界面。
4详细设计
4.1设计思路
贪吃蛇游戏设计与实现,主要分为以下二个模块:
游戏主界面模块和游戏控制模块。
在此只实现游戏的游戏主界面模块、游戏控制模块。
并且只是实现移动速度、暂停、重新开始等功能。
游戏主界面模块:
游戏的主界面是进入游戏后,能够给玩家第一感官的部分,主要包括游戏图形区域界面、游戏的速度选择更新界面、新生方块的预览、暂停游戏按钮、重新开始游戏按钮。
从很大程度上决定了玩家对游戏的兴趣问题,因此,游戏的主界面应该力求美观,爽心悦目。
游戏控制模块:
这个模块是游戏的中心环节,主要完成控制游戏的开始、暂停、重新开始等功能。
为了能够给玩家一个很好的游戏环境,这部分应该做到易懂、易操作。
本设计所开发的是基于Java的一个贪吃蛇游戏软件,主要实现游戏的速度控制、游戏的暂停、游戏的退出等功能,分为:
游戏主界面模块、游戏控制模块以二个模块。
4.2程序流程图
本次游戏设计的处理流程如图1所示。
4.3类、方法、属性说明
(1)成员变量
表1主要成员变量(属性)
成员变量描述
变量类型
名称
文件菜单中子菜单“新建”
JMenuItem
mFile_New
编辑菜单中子菜单“撤消”
JMenuItem
mEdit_Undo
格式菜单中子菜单“颜色”
JMenu
formatMenu_Color
帮助菜单中子菜单“帮助主题”
MenuItem
mHelp_HelpTopics
(2)方法
表2主要方法
方法名
功能
备注
Notepad4()
描述记事本
无
Text.setBackground(Color.black)
设置编辑区默认背景色
无
Text.setForeground(Color.black)
设置编辑区默认前景色
无
图8进销存管理系统E-R图
5程序调试与测试
本程序在运行后,能够正常的相应按键事件。
由于程序的主要部分已经集成为一个对象SnakeModel,所以利用键盘就可以实现操作。
蛇前行的过程中,可以任意向其左或右方向改变方向。
点击F3键后游戏就暂停了。
点击F2键游戏重新开始。
点击F4游戏退出。
运行结果如下图4所示:
图4程序运行图
当蛇没有吃到食物且碰到边界或碰撞到自己的身体时,游戏结束。
如果想重新开始即点击“确定”后按F2键,运行结果如下图5所示:
图5重新开始图
5.1程序异常处理
在蛇的运行线程过程中,当蛇撞到墙或自己的身体时,将抛出一个Exception类的异常对象,然后使用try-catch去捕捉这个异常,
异常的处理如下:
try{
Thread.sleep(timeInterval);}
catch(Exceptione)
{
break;
}
6数据结构算法设计:
6.1图型结构基本算法实现
importjava.util.LinkedList;//链式栈
importjava.util.Queue;//队列
//图的遍历(邻接矩阵)
publicclassGraph//曲线图,图表--邻接矩阵存储图
{
privateintnumber=9;//顶点数
privateboolean[]flag;//(布尔值,一种数据类型)---顶点
privateint[][]edges1={{0,1,0,0,0,1,1,0,0},{1,0,1,0,0,0,1,0,1},
{0,1,0,1,0,0,0,0,1},{0,0,1,0,1,0,1,1,1},{0,0,0,1,0,1,0,1,0},
{1,0,0,0,1,0,1,0,0},{0,1,0,1,0,1,0,1,0},{0,0,0,1,1,0,1,0,0},
{0,1,1,1,0,0,0,0,0}//记录顶点数是否被访问
};
privateString[]vertexs={"A","B","C","D","E","F","G","H","I"};//顶点
privateint[][]edges={
{0,1,0,0,0,1,1,0,0},
{1,0,1,0,0,0,1,0,1},
{0,1,0,1,0,0,0,0,1},
{0,0,1,0,1,0,1,1,1},
{0,0,0,1,0,1,0,1,0},
{1,0,0,0,1,0,1,0,0},
{0,1,0,1,0,1,0,1,0},
{0,0,0,1,1,0,1,0,0},
{0,1,1,1,0,0,0,0,0}
};
voidDFSTraverse()//图的深度遍历操作(递归)
{
flag=newboolean[number];
for(inti=0;i { if(flag[i]==false)//当前顶点没有被访问 { DFS(i); } } } privatevoidDFS(inti)//图的深度优先递归算法 { flag[i]=true;//第i个顶点被访问 System.out.print(vertexs[i]+""); for(intj=0;j { if(flag[j]==false&&edges1[i][j]==1) { DFS(j); } } } voidBFSTraverse()//图的遍历操作 { flag=newboolean[number]; Queue for(inti=0;i if(flag[i]==false) { flag[i]=true; System.out.print(vertexs[i]+""); queue.add(i); while(! queue.isEmpty()) { intj=queue.poll(); for(intk=0;k if(edges1[j][k]==1&&flag[k]==false){ flag[k]=true; System.out.print(vertexs[k]+""); queue.add(k); } } } } } } publicstaticvoidmain(String[]args)//测试 { Graphgraph=newGraph(); System.out.println("图的深度遍历(递归): "); graph.DFSTraverse(); System.out.println("\n---------"); System.out.println("图的广度遍历操作: "); graph.BFSTraverse(); } } 算法分析: 广度优先搜索A,B,F,G,C,I,E,D,H. 深度优先搜索A,B,C,D,E,F,G,H,I. 从上述算法可以看出,首先用哈夫曼编码构造一颗哈夫曼树,对哈夫曼树表示的图进行的深度优先搜索遍历时,需要扫描树中的每个元素,每一个顶点最多调用一次,一个顶点一旦被访问,就不在从该定点发出搜索,图遍历的过中实际就是查找每一个顶点的邻接点的过程,所以其时间复杂度为O(n^2);空间复杂度为O(n).进行广度优先搜索,每一个顶点最多入队,出队一次,广度优先搜索遍历的过程就是寻找队列中顶点的邻接点过程,所以其时间复杂度为O(n^2);空间复杂度为O(n). 7设计体会与总结 通过一个学期的学习已经结束,我从一个连JAVA软件都不会用的愣头青到现在已能完成课程设计。 这次课程设计,我深深地认识到自己知识的单薄,多谢老师和同学的帮助,让我能顺利完成课程设计。 虽然还有很多不足,但也学到了很多。 尤其对软件开发过程有了更清晰地了解,首先是问题的定义,需求分析,然后是概要设计,详细设计等,并对软件测试的方法,手段有了较深的理解,同时对企业的流程有了一个系统的认识。 我也认真学习了与系统相关的的知识,极大地拓宽了我的知识面,真心感到收获不小。 在短短的时间里,我还学到了更多的理论知识,扩展了知识面,提高了自己的实际操作能力;而且学会了如何去学习新的知识,学会了面对困难和挑战,学会了团结合作,互助互利。 为了使游戏能够实现自己预先的构想,我通过上网和去图书馆找程序,比较好的流程图及功能模块,不断阅读修改代码使程序达到预期所要实现的目标,完成课程设计后,可以感觉到自己对Java程序的又有了新的认识。 总之,通过本次的课程设计,使我平时学到的理论知识得到了很好地升华,理论与实际得到一次很好的结合,为我今后参加工作打下了坚实的基础,使我受益匪浅。 8参考文献 [1]孙卫琴.精通Struts: 基于MVC的JavaWeb的设计与开发[M].北京: 电子工业出版社,2004 [2]杨章伟.精通SQL语言与数据库管理[M].人民邮电出版社,2008 [3]范晓平.UML建模实例详解[M].北京: 清华大学出版社,2005 [4]林智扬,范明翔.深入浅出JavaSwing程序设计[M].中国铁道出版社社,2005年3月 [5]王珊,萨师煊.数据库系统概论(第四版)[M].高等教育出版社,2007 [6]杨章伟.精通SQL语言与数据库管理[M].人民邮电出版社,2008 [7]李海凤,李宏力,孙华峰.电子商务网站实训教程[M].中国铁道出版社,2006 [8]周警伟.MVC在Web系统中的模式与应用[J/OL].http: // [9]阎宏.Java与模式.[M].北京: 机械出版社,2005 [10]BruceEckel,《ThinkinJava2ndEdition》[M].PrenticeHall [11]黄平主编.数据库技术.北京: 机械工业出版社,2002 [12]袁枚等编著.网络数据库应用教程.北京: 人民邮电出版社,2001.1 [13]张孝祥.javascript网页开发.北京: 清华大学出版社,2004.11 [14]薛华成.管理信息系统.北京: 清华大学出版社,2004.9 9程序代码 importjava.awt.*; importjavax.swing.*; importjava.util.*; importjava.awt.event.*; publicclassSheextendsJFrameimplementsActionListener,WindowListener{ /** * */ privatestaticfinallongserialVersionUID=1L; JLabelbt1; JLabelbt2; MyPaintmp; JMenuItemkaishi; JMenuItemzanting; JMenuItemtuichu; JRadioButtonchu; JRadioButtonzhong; JRadioButtongao; JRadioButtonchao; JMenuItemguanyu; Fontf; publicShe(){ f=newFont("宋体",Font.PLAIN,12); mp=newMyPaint(); mp.setShe(this); JMenuBarcaidan=newJMenuBar(); JMenushezhi=newJMenu("设置"); shezhi.setFont(f); JMenunandu=newJMenu("难度"); nandu.setFont(f); JMenubangzhu=newJMenu("帮助"); bangzhu.setFont(f); caidan.add(shezhi); caidan.add(nandu); caidan.add(bangzhu); kaishi=newJMenuItem("开始游戏F2"); kaishi.setFont(f); kaishi.addActionListener(this); zanting=newJMenuItem("暂停/继续F3"); zanting.setFont(f); zanting.addActionListener(this); tuichu=newJMenuItem("退出F4"); tuichu.setFont(f); tuichu.addActionListener(this); chu=newJRadioButton("初级,最快速度195",true); chu.setFont(f); chu.addActionListener(this); zhong=newJRadioButton("中级,最快速度225"); zhong.setFont(f); zhong.addActionListener(this); gao=newJRadioButton("高级,最快速度255"); gao.setFont(f); gao.addActionListener(this); chao=newJRadioButton("超级,最快速度275"); chao.setFont(f); chao.addActionListener(this); ButtonGroupbg=newButtonGroup(); bg.add(chu); bg.add(zhong); bg.add(gao); bg.add(chao); nandu.add(chu); nandu.add(zhong); nandu.add(gao); nandu.add(chao); guanyu=newJMenuItem("关于"); guanyu.setFont(f); guanyu.addActionListener(this); shezhi.add(kaishi); shezhi.add(zanting); shezhi.add(tuichu); bangzhu.add(guanyu); bt1=newJLabel(" 长度: 0"); bt1.setFont(f); bt2=newJLabel("移动: 5"); bt2.setFont(f); JPanelp=newJPanel(); p.setLayout(newGridLayout(1,2)); p.add(bt1); p.add(bt2); this.addWindowListener(this);//添加窗体监听器 this.setJMenuBar(caidan); this.add(p,BorderLayout.NORTH); this.add(mp); this.add(newJLabel(" "),BorderLayout.WEST); this.setSize(335,385); this.setResizable(false); this.setLocation(300,150); this.setTitle("MyPaint"); this.setVisible(true); } publicvoidsetDS(inta,intb){ bt1.setText(" 长度: "+a); bt2.setText("移动: "+b); } publicvoidsetChu(){ chu.setSelected(true); mp.setSD(300,110); this.setDS(0,305-300); chu.setEnabled(true); zhong.setEnabled(true); gao.setEnabled(true); chao.setEnabled(true); } publicvoidsetNanDu(){ chu.setEnabled(false); zhong.setEnabled(false); gao.setEnabled(false); chao.setEnabled(false); } publicvoidactionPerformed(ActionEvente){ if(e.getSource()==zanting){ mp.setZanTing(); } elseif(e.getSource()==kaishi){ mp.setKaiShi(); } elseif(e.getSource()==tuichu){ mp.setTuiChu(); } elseif(e.getSource()==guanyu){ JLabelgy=newJLabel("小游戏贪吃蛇V1.0"); gy.setFont(f); JOptionPane.showMessageDialog(this,gy); } elseif(e.getSource()==chu){ mp.setSD(300,110); this.setDS(0,305-300); } elseif(e.getSource()==zhong){ mp.setSD(250,80); this.setDS(0,305-250); } elseif(e.getSource()==gao){ mp.setSD(200,50); this.setDS(0,305-200); } elseif(e.getSource()==chao){ mp.setSD(150,30); this.setDS(0,305-150); } } publicstaticvoidmain(String[]args){ newShe(); } /** *MethodwindowOpened * * *@parame * */ publicvoidwindowOpened(WindowEvente){ //TODO: Addyourcodehere } publicvoidwindowClosing(WindowEvente){ System.exit(0); } publicvoidwindowClosed(WindowEvente){ //TODO: Addyourcodehere } publicvoidwindowIconified(WindowEvente){ //TODO: Addyourcodehere } publicvoidwindowDeiconified(WindowEvente){ //TODO: Addyourcodehere } publicvoidwindowActivated(WindowEvente){ //TODO: Addyourcodehere } publicvoidwindowDeactivated(
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 贪吃 游戏