Java-课程设计--贪吃蛇.doc
课 程 设 计 说 明 书课程名称: Java语言程序设计 设计题目: 学生成绩管理系统 院 系: 计算机科学与信息工程学院 学生姓名: 肖 文 学 号: 14031010141 专业班级: 计算机科学与技术(14嵌入)指导教师: 张阳 2015 年 12月 27 日课 程 设 计 任 务 书设计题目贪吃蛇小游戏程序学生姓名肖文所在院系计科专业、年级、班14计科嵌入设计要求:1. 贪吃蛇游戏是大家很常见的小游戏,在生活工作之余大家可以玩它,已达到放松各种压力的目的。2. 游戏可以进行升级,也就是增加吃食物的难度,以便使大家更有挑战性,不觉得太无趣。3. 游戏界面大小可以任意指定,数据从文件读入。4. 利用swing实现良好的GUI界面。学生应完成的工作:1. 贪食蛇的前移算法主要是蛇身结点前移,后面的覆盖前面的蛇身结点。依靠的调用编写的成员方法实现。2. 在贪吃蛇中蛇头来控制蛇的移动方向,依靠的调用编写的成员方法实现。3. 要求用户界面采用图形用户界面,影响方向键的控制。4. 重复的调用paint()函数来实现对界面的重绘和食物的重置。5. 源程序中要有充分的注释,报告中要有详细的流程图。6. 运行的结果以及图形用户界面要进行屏幕拷贝,插入报告中。幕拷贝,插入报告中。参考文献阅读: 1. Java语言程序设计 (美)Y·Daniel Liang 机械工业出版社 2. 赵毅主编.跨平台程序设计语言Java.西安:西安电子科技大学出版社,20063. 王路群.Java高级程序设计.北京:中国水利水电出版社,2006工作计划:1,12月21日,选择该课题,然后分析结构。2,12月21日至25日开始编写各个模块。3,12月28日至29日,对设计的系统进行测试以及进行修改。4,12月30日,贪吃蛇完成。任务下达日期: 2015 年 12月 10 日任务完成日期: 2015 年 12月 24 日指导教师(签名): 学生(签名):贪吃蛇小游戏摘 要:贪吃蛇是家喻户晓的益智类小游戏,选择这题目一是为了将自己所学的知识加以运用,二是一直以来贪吃蛇这个游戏深深的吸引着我,它的制作方法对于提前的我而言都是神秘的。我希望通过自己所学知识把它剖析开来,真真正正的了解它的本质和精髓。虽然我的编程能力不是很强,但是我有信心,在这次学习中我将从实践的项目中提高自己的编程能力,因此我选定了这个项目。关键词:贪吃蛇; java; 学习;放松 目 录1. 设计背景41.1问题描述41.2 问题分析42.设计方案42.1 算法分析5 2.2 类的设计53.用户界面设计64. 模块划分及调用关系85. 运行说明及系统运行测试96. 收获与致谢137. 参考文献148. 附件159. 附录源代码.161. 设计背景1.1问题描述 贪吃蛇是家喻户晓的益智类小游戏,选择这题目一是为了将自己所学的知识加以运用,二是一直以来贪吃蛇这个游戏深深的吸引着我,它的制作方法对于提前的我而言都是神秘的。我希望通过自己所学知识把它剖析开来,真真正正的了解它的本质和精髓。虽然我的编程能力不是很强,但是我有信心,在这次学习中我将从实践的项目中提高自己的编程能力,因此我选定了这个项目。1.2 问题分析这个程序是用一个小矩形表示蛇的一节身体,身体每长一节,增加一个矩形块。移动时必须从蛇头开始,也就是蛇尾不能改作蛇头。当游戏者按了方向键后,蛇头朝着指定的方向移动,一步移动一节身体。图形的实现是从蛇头的新位置开始画出蛇。用户可以用上下左右键控制蛇头的方向。非常简单。2. 设计方案2.1算法分析1. 贪吃蛇是很经典的格子游戏。所谓格子游戏就是在设计游戏时的主要思想是每个设对象都是由格子组成,游戏运行界面也是由格子组成。格子思想决定了此类游戏在设计时的算法思想。2. 方向键控制一个方块的移动的方法,一个方块的移动是靠移动其坐标位置来实现的。3. 方向键控制是上下左右对一个方块的控制,用四个判断语句实现。4. 蛇的移动算法思想可以看成是第一个方块移动,第二个方块移到第一个方块的位置, 第三个方块移动到第二个方块的位置第N个方块移动到第N-1个方块的位置。这样连续的移动就是蛇的移动了。方向控制键控制了第一个方块的移动后,后面方块跟着移动 ,这样也实现了方向键控制对长蛇的移动。5. 食物的随机产生的方法食物的随机产生需要一个随机种子函数然后利用系统时间做为随机种子。6. 蛇的身体变长的方法当然要当蛇吃到食物时才能使身体变长。因此有两个需要解决的问题:问题一:如何知道是否吃到食物?问题二:吃到食物后身体变长?解决问题一的方法是需要一个判断语句,当蛇头即构成蛇的第一个方块跟食物所在方块的坐标一样时判断吃到食物。解决问题二则要相对复杂一些,需要多个判断语句构成。7. 游戏结束的方法,当蛇碰到边框时或者吃到自己时游戏结束。根据这个思想可以用判断语句实现 。然后是游戏结束后的处理,比如显示继续玩游戏还是退出游戏,并显示所吃到的食物的个数和时间等。2.2类的设计1>.创建的类的描述。1. Login类,登陆界面要求输入登陆者输入用户名和密码,分别设Go和Cancel两个登陆选项。Login属性: 用户名 密码 Go(进入游戏) Cancel(取消)操作: Enter() Close()2. SnakeFrame类,创建游戏窗口主界面。采用图形界面设计,有窗体,菜单栏和游戏操作界面。3. SnakeModel类,此类为蛇的初始化状态及模型,所有的游戏的开始都通过此类初始化及对蛇的操作。SnakeModel属性: rows,cols,snakeHead,runingDiriction,locRO,snake,playBlocks snakeFood,gameScore,AddScore操作: LocationRO getSnakeHead(),LocationRO getSnakeTail(), Location getRuningDiriction(),LinkedList getSnake(), LinkedList getOthers(), getScore(),getAddScore(), setSnakeHead(Location snakeHead),LocationRO getSnakeFood(), setSnakeFood(),moveTo(Object a,LinkedList fromlist,LinkedList tolist), init(),SnakeModel(int rows1,int cols1),move(Location direction) 4. SnakePanel类,此类为游戏界面创建蛇的面板和蛇的移动控制实现。SnakePanel属性:gridsPanel, row; col; gridsPanel;direction;snake; snakeBody; otherBlocks;snakeHead; snakeFood; gameScore=0; speed; AddScore; t; isEnd; notExit;操作:SnakePanel(SnakeFrame parent,int row,int col),newGame(long speed)stopGame(),returnGame(),getGameScore(),updateTextFiled(String str)updateColors(),run(),keyPressed(KeyEvent event)keyReleased(KeyEvent event),keyTyped(KeyEvent event)change(SnakeFrame parent,int row2, int col2) 5. LocationRO类,随机生成的食物位置。用来随机生成食物。引导蛇的移动方向。 6. Location类,对蛇的位置的描述类。Location属性: x y操作:Location(int x,int y) ,getX(),getY(),setX(int x),setY(int y) ,equalOrRev(Location e),equals(Location e) ,reverse(Location e)2>.类之间的调用关系。Login登陆SnakeFrameLocationSnakeModelSnakePanelLocationRO3.用户界面1. 登陆界面 2. 游戏主界面【程序技巧】1. 为游戏设置权限,为游戏设置登陆界面。2. 游戏界面采用图形界面美观大方易操作。3. 功能齐全,可以选择开始,暂停,继续可以随时操控游戏状态,方便易操作,人性化设计。4. 设置菜单功能齐全,可以让界面显示网格和取消显示网格,还可以根据自己的实际能力情况选择游戏的等级。5. 窗口大小菜单可以根据自己的需要和爱好调整窗体的大小,可以选择大中小三种窗体。适合不同的需要。6. 本程序设置了作者信息菜单可以查询程序的制作人的信息等。7. 对于新手用户,我为他们设置了操作指南菜单,帮助他们方便快捷的学会游戏的操作步骤。 4.模块划分及调用关系主要模块开始登陆界面游戏界面取消登录退出程序结束【模块流程图】1. 游戏界面模块开始和登陆模块流程图。 登陆界面输入用户名和密码进入游戏取消登录设置作者信息结束游戏帮助窗口大小文件操作指南开始暂停继续等级显示网格视图软件信息中小大退出结束2. 游戏模块游戏开始创建贪吃蛇是否结束 暂停 否 是 是否开始随机显示食物蛇蛇运动 否是否碰到蛇身墙蛇身加长,分数增加是否吃到食物 是 否提示游戏结束 是结束 5.运行说明及系统运行测试1. 安装eclipse,在其上运行。 2. 如图在eclipse中创建java项目,在src下建立SnakeGameDemo包将所有的源程序放入包中,在项目中建立img图片文件夹,将文件中需要的图片放入其中以便调用。 3. 主函数在Login类中,只需运行Login.java程序进入登陆界面,输入用户名和密码进入游戏。4. 在文件菜单下开始,暂停,继续游戏。5. 对第一次进入的用户请先看操作说明。1、 程序上机调试报告【语法错误及其排除】1. 将所有外部类定义为公共类,可以直接拿来应用,必须引入一个包来定义一个类来进行使用。程序中的蛇是用网格布局中的小面板组成,蛇的身体由等大的小网格组成。2. 键盘事件未进行监听以致键盘操作无法进行,监听函数有错误。最后加入正确的监听函数。3. 在eclipse上运行,程序出现乱码,通过调试编辑器解决。【算法错误及其排除】1. 游戏开始出现的方块是随机给的,但每个游戏中只给一种形状的方块,最后将随机函数放在游戏开始中,程序方可执行;2. 贪吃蛇在吃掉一个食物后,不能实现分数累加,在游戏中改变成员方法public boolean getAddScore()return AddScore;3. 游戏在运行过程中不能暂停,在游戏中增加暂停控制public void stopGame()requestFocus();isEnd=true;2、 程序测试结果【测试数据】1. 游戏登陆测试,用户名:,密码:123456.2. 进入主界面。3. 测试文件菜单;游戏开始,贪吃蛇窗墙则游戏结束;退出提示。4. 测试设置菜单。5. 测试窗口大小菜单。6. 测试作者信息菜单。7. 测试帮助菜单。【输出结果】1. 登陆测试 2.进入主界面 3.测试文件菜单 文件主界面 1>.菜单/开始 2>.贪吃蛇窗墙则游戏结束 3>.退出提示。文件/退出。 4.测试设置菜单. 5.测试窗口大小菜单。 6. 测试作者信息菜单。 7. 测试帮助菜单。 6. 收获与致谢 在做Java设计之前也有做过c语言的课程设计,但规模很小。在管理系统、各种 应用软件和游戏中,我觉得对游戏的设计还有点热情。因为其各个模块间的联系十分紧密,代码重复执行率高,当经过无数次的调试、修改后,能最终看到成品,有无比自豪的心情。大学期间用c语言做过班级通讯录等简单的数据库管理系统的课程设计,思想大致相似,变化范围有限。综合运用以前所学习的知识,设计一个JAVA贪吃蛇游戏,并能实现以下的功能:游戏界面登录、游戏开始、游戏暂停、游戏重新开始、游戏的结束和很好的图形化界面操作。总之,通过本次的课程设计,使我平时学到的理论知识得到了很好地升华,理论与实际得到一次很好的结合,为我今后参加工作打下了坚实的基础,使我受益匪浅。7. 参考文献1. Java语言程序设计 (美)Y·Daniel Liang 机械工业出版社2. 赵毅主编.跨平台程序设计语言Java.西安:西安电子科技大学出版社,20063. 王路群.Java高级程序设计.北京:中国水利水电出版社,20068. 附件指导教师评语:1、课程设计报告:a、内容: 不完整 完整 详细 b、方案设计: 较差 合理 非常合理c、实现: 未实现 部分实现 全部实现 d、文檔格式: 不规范 基本规范 规范 2、出勤: 全勤 缺勤 次3、答辩: a、未能完全理解题目,答辩情况较差 b、部分理解题目,部分问题回答正确 c、理解题目较清楚,问题回答基本正确 d、理解题目透彻,问题回答流利 课程设计报告成绩: ,占总成绩比例: 50% 课程设计其它环节成绩:环节名称: 出勤 ,成绩: ,占总成绩比例: 20% 环节名称: 答辩 ,成绩: ,占总成绩比例: 30% 总 成 绩: 指导教师签字:年 月 日附录 源代码:package SnakeGameDemo;import java.awt.Color;import java.awt.Container;import java.awt.Graphics;import java.awt.GridLayout;import java.awt.Image;import java.awt.Label;import java.awt.Panel;import java.awt.TextField;import java.awt.Toolkit;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JOptionPane;import javax.swing.JPanel;/登陆界面public class Login extends JFrame private TextField f1;/创建文本框private TextField f2;private JButton b1;/创建按钮private JButton b2;public Login() /登陆界面Container cp=getContentPane();/获取容器cp.setLayout(new GridLayout(4,1);/设置布局管理为网格四行一列Label l1=new Label("用户名");/创建标签了l1,l2Label l2=new Label("密 码"); Panel p1=new Panel();/创建面板,p1,p2,p3,p4Panel p2=new Panel();Panel p3=new Panel();MyPanel1 p4=new MyPanel1();/创建插入图片平面p4f1=new TextField(10);f2=new TextField(10);f2.setEchoChar('*');/回显字符为* 用于输入密码,设置为不可见b1=new JButton("Go");/新建按钮b1,b2b2=new JButton("Cancel");p1.add(l1);/第一行添加label 1p1.add(f1);p2.add(l2);p2.add(f2);p3.add(b1);p3.add(b2);cp.add(p4);/面板p4,p1,p2,p3分别加入容器cpcp.add(p1);cp.add(p2);cp.add(p3);b1.addActionListener(new Enter();/添加按钮事件响应b2.addActionListener(new Close();class Enter implements ActionListener public void actionPerformed(ActionEvent e) JButton bt=(JButton)e.getSource(); if(f1.getText().equals("肖文")&&(f2.getText().equals("123456")&&bt=b1) JFrame.setDefaultLookAndFeelDecorated(true); SnakeFrame frame=new SnakeFrame();/创建游戏主界面 frame.setSize(frame.col*11+11,frame.row*11+100); frame.setResizable(false); frame.setLocation(500,200);/设置窗体位置 frame.setTitle("贪吃蛇大战"); frame.setVisible(true); else JOptionPane.showMessageDialog(null, "用户名或密码错误,请重新登录!");/错误用户提示class Close implements ActionListener /关闭登陆按钮响应public void actionPerformed(ActionEvent e) JButton bt=(JButton)e.getSource();if(bt=b2) System.exit(0);/退出/主函数 程序开始public static void main(String args) Login log=new Login(); log.setTitle("贪吃蛇游戏界面登陆"); log.setBounds(500, 200, 300, 300); log.setBackground(Color.blue); log.setVisible(true);class MyPanel1 extends JPanel /插入登陆界面图片Image img=Toolkit.getDefaultToolkit().getImage("imgs/201.jpg");/添加图片public void paint(Graphics g) g.drawImage(img,0,0,this);package SnakeGameDemo;import java.awt.Color;import java.awt.Container;import java.awt.FlowLayout;import java.awt.GridLayout;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.ButtonGroup;import javax.swing.JCheckBoxMenuItem;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JMenu;import javax.swing.JMenuBar;import javax.swing.JMenuItem;import javax.swing.JOptionPane;import javax.swing.JPanel;import javax.swing.JRadioButtonMenuItem;import javax.swing.JTextField;public class SnakeFrame extends JFrame implements ActionListenerint row=20;int col=30;SnakePanel p=new SnakePanel(this,row,col);JMenuBar menubar=new JMenuBar();/菜单条JMenu fileMenu=new JMenu("文件");/菜单JMenuItem newgameitem=new JMenuItem("开始");/菜单条目JMenuItem stopitem=new JMenuItem("暂停");JMenuItem runitem=new JMenuItem("继续");JMenuItem exititem=new JMenuItem("退出"); /"设置"菜单JMenu optionMenu=new JMenu("设置"); /* * 等级选项 * ButtonGroup 创建一组按钮选项 * JRadioButtonMenuItem 是属于一组菜单项中的一个菜单项,该组中只能选择一个项。 * 被选择的项显示其选择状态。选择此项的同时,其他任何以前被选择的项都切换到未选择状态。 * Panel 是最简单的容器类。应用程序可以将其他组件放在面板提供的空间内,这些组件包括其他面板。 */ JMenu degreeMenu=new JMenu("等级"); ButtonGroup groupDegree = new ButtonGroup(); JRadioButtonMenuItem oneItem= new JRadioButtonMenuItem("初级"); JRadioButtonMenuItem twoItem= new JRadioButtonMenuItem("中级"); JRadioButtonMenuItem threeItem= new JRadioButtonMenuItem("高级"); / 设置“窗口大小”菜单 JMenu windowsMenu = new JMenu("窗口大小"); JMenu windowsMenu1 = new JMenu("视图"); ButtonGroup groupDegree1 = new ButtonGroup(); JRadioButtonMenuItem minItem= new JRadioButtonMenuItem("小"); JRadioButtonMenuItem midItem= new JRadioButtonMenuItem("中"); JRadioButtonMenuItem maxItem= new JRadioButtonMenuItem("大"); / 设置“作者信息”菜单 JMenu XinXi=new JMenu("作者信息"); JMenuItem XinXiItem=new JMenuItem("软件信息"); /设置“帮助”菜单 JMenu helpMenu=new JMenu("帮助"); JMenuItem helpItem=new JMenuItem("操作指南"); /可以被选定或取消选定的菜单项. final JCheckBoxMenuItem showGridItem = new JCheckBoxMenuItem("显示网格"); JLabel scorelabel;/为分数创建标签 public JTextField scoreField;/显示分数的文本框 private long speedtime=200; private String helpstr = "游戏说明:n1 :方向键控制蛇移动的方向."+ "n2 :单击菜单'文件->开始'开始游戏."+ "n3 :单击菜单'文件->暂停'或者单击键盘空格键暂停游戏."+ "n4 :单击菜单'文件->继续'继续游戏."+ "n5 :单击菜单'设置->等级'可以设置难度等级."+ "n6 :单击菜单'设置->显示网格'可以设置是否显示网格."+ "n7 :红色为食物,吃一个得10分同时蛇身加长."+ "n8 :蛇不可以出界或自身相交,否则结束游戏." SnakeFrame() setJMenuBar(menubar); fileMenu.add(newgameitem); fileMenu.add(stopitem); fileMenu.add(runitem); fileMenu.add(exititem); menubar.add(fileMenu); oneItem.setSelected(true); /设置可选择 groupDegree.add(oneItem); groupDegree.add(twoItem); groupDegree.add(threeItem); degreeMenu.add(oneItem); degreeMenu.add(twoItem); degreeMenu.add(threeItem); optionMenu.add(degreeMenu); minItem.setSelected(true); groupDegree1.add(minItem); groupDegree1.add(midItem); groupDegree1.add(maxItem); windowsMenu1.add(minItem); windowsMenu1.add(midItem); windowsMenu1.add(maxItem); windowsMenu.add(windowsMenu1); / 风格选项 showGridItem.setSelected(true); optionMenu.add(showGridItem); menubar.add(optionMenu); helpMenu.add(helpItem); XinXi.add(XinXiItem); menubar.add(windowsMenu); menubar.add(XinXi); menubar.add(helpMenu);Container contentpane=getContentPane(); contentpane.setLayout(new FlowLayout();/设置布局管理contentpane.add(p);scorelabel=new JLabel("得 分: ");scoreField=new JTextField("0",15);scoreField.setEnabled(false);scoreField.setHorizontalAlignment(0);/设置图标和文本的水平对齐方式JPanel toolPanel=new JPanel();toolPanel.a