资源描述
课 程 设 计 说 明 书
课程名称: 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.西安:西安电子科技大学出版社,2006
3. 王路群.Java高级程序设计.北京:中国水利水电出版社,2006
工作计划:
1,12月21日,选择该课题,然后分析结构。
2,12月21日至25日开始编写各个模块。
3,12月28日至29日,对设计的系统进行测试以及进行修改。
4,12月30日,贪吃蛇完成。
任务下达日期: 2015 年 12月 10 日
任务完成日期: 2015 年 12月 24 日
指导教师(签名): 学生(签名):
贪吃蛇小游戏
摘 要:贪吃蛇是家喻户晓的益智类小游戏,选择这题目一是为了将自己所学的知识加以运用,二是一直以来贪吃蛇这个游戏深深的吸引着我,它的制作方法对于提前的我而言都是神秘的。我希望通过自己所学知识把它剖析开来,真真正正的了解它的本质和精髓。虽然我的编程能力不是很强,但是我有信心,在这次学习中我将从实践的项目中提高自己的编程能力,因此我选定了这个项目。
关键词:
贪吃蛇; java; 学习;放松
目 录
1. 设计背景 4
1.1问题描述 4
1.2 问题分析 4
2.设计方案 4
2.1 算法分析 5
2.2 类的设计 5
3.用户界面设计 6
4. 模块划分及调用关系 8
5. 运行说明及系统运行测试 9
6. 收获与致谢 13
7. 参考文献 14
8. 附件 15
9. 附录源代码………………………………………………………………....16
1. 设计背景
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登陆
SnakeFrame
Location
SnakeModel
SnakePanel
LocationRO
3.用户界面
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.西安:西安电子科技大学出版社,2006
3. 王路群.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,l2
Label l2=new Label("密 码");
Panel p1=new Panel();//创建面板,p1,p2,p3,p4
Panel p2=new Panel();
Panel p3=new Panel();
MyPanel1 p4=new MyPanel1();//创建插入图片平面p4
f1=new TextField(10);
f2=new TextField(10);
f2.setEchoChar('*');//回显字符为* 用于输入密码,设置为不可见
b1=new JButton("Go");//新建按钮b1,b2
b2=new JButton("Cancel");
p1.add(l1);//第一行添加label 1
p1.add(f1);
p2.add(l2);
p2.add(f2);
p3.add(b1);
p3.add(b2);
cp.add(p4);//面板p4,p1,p2,p3分别加入容器cp
cp.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 ActionListener{
int 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
展开阅读全文