中南林业科技大学
《小组软件过程实验》
实验报告
题目: 2D 游戏贪食蛇软件开发 专业班级: 11级软件工程2班 组长: xxx 成员:指导教师: xxxxx 完成日期: 2014/4/15
目 录
1 软件项目开发计划………………………………………………(页码) 2 软件需求规格说明书……………………………………………(页码) 3 软件配置管理计划……………………………………………(页码) 4 软件设计规格说明………………………………………………(页码) 5 软件测试计划……………………………………………………(页码) 6 软件测试分析报告………………………………………………(页码) 7 软件项目开发总结报告…………………………………………(页码) 附件A :
小组制定的软件过程规范 ……………………………………(页码) 附件B :
其他软件开发过程记录信息……………………………………(页码)
小组成员角色与分工情况表
一、软件项目开发计划
完成人: xxxx
1引言
1.1编写目的
本文档的目的是明确基于JAVA 的贪吃蛇项目的基本需求分析,明确项目中各个任务系统的不同分工,分析项目的核心功能和项目所需要达到的预期目标。期望读者包括:项目发起人、项目执行团队、指导老师。
1.2 背景
近年来,Java 作为一种新的编程语言,以其简单性、可移植性和平台无关性等优点,得到了广泛地应用,特别是Java 与万维网的完美结合,使其成为网络编程和嵌入式编程领域的首选编程语言。贪吃蛇游戏的设计比较复杂,它涉及面广、牵涉方面多,如果不好好考虑和设计,将难以成功开发出这个游戏。在这个游戏的设计中,牵涉到图形界面的显示与更新、数据的收集与更新,并且在这个游戏的开发中,还要应用类的继承机制以及一些设计模式。因此,如何设计和开发好这个贪吃蛇游戏,对于提高Java 开发水平和系统的设计能力有极大的帮助。在设计开发过程中,需要处理好各个类之间的继承关系,还要处理各个类相应的封装,并且还要协调好各个模块之间的逻辑依赖关系和数据通信关系。
“贪吃蛇”游戏是一个经典的游戏,它因操作简单、娱乐性强而广受欢迎。本文基于Java 技术,开发了一个操作简单、界面美观、功能较齐全的“贪吃蛇”游戏。整个游戏程序分为二个功能模块,四个类模块,实现了游戏的开始、暂停、结束。通过本游戏的开发,达到学习Java 技术和熟悉软件开发流程的目的。
1.3定义
JA V A :Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由Sun Microsystems公司于1995年5月推出的Java 程序设计语言和java 平台的总称。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于个人PC 、数据中心、游戏控制台、科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。在全球云计算和移动互联网的产业环境下,Java 更具备了显著优势和广阔前景。
运行环境:意指一种把半编译的执行码在目标机器上运行的环境。
算法:算法可以理解为有基本运算及规定的运算顺序所构成的完整的解题步骤。或者看成按照要求设计好的有限的确切的计算序列,并且这样的步骤和序列可以解决一类问题。
编译处理:利用编译程序从源语言编写的源程序产生目标程序的过程;用编译程序产生目标程序的动作。 编译就是把高级语言变成计算机可以识别的2进制语言,计算机只认识1和0,编译程序把人们熟悉的语言换成2进制的。 编译程序把一个源程序翻译成目标程序的工作过程分为五个阶段:词法分析;语法分析;语义检查和中间代码生成;代码优化;目标代码生成。主要是进行词法分析和语法分析,又称为源程序分析,分析过程中发现有语法错误,给出提示信息。
调试运行:检查和修改程序中的错误,保证它能正确无误地运行是程序设计工作中的重要一环。
1.4参考资料
1.Java 从入门到精通 魔乐科技(MLDN )软件实训中心 编著/2010-04-01/人民邮电出版社
2.Java 编程思想(第4版) 2007-06-01/机械工业出版社
3. 轻量级Java EE企业应用实战(第3版)李刚 编著/2012-04-01/电子工业出版社
4. 疯狂Java 讲义(第2版) 李刚 编著/2012-01-01/电子工业出版社
5.Java 语言程序设计:基础篇(第8版) (美)梁勇 著,李娜 译/2011-06-01/机械工业出版社
6.Effective Java中文版(第2版) (美)布洛克 著,杨春花,俞黎敏 机械工业出版社
2项目概述
2.1工作内容
本项目需开发出一个可以在windos 操作系统上运行的贪吃蛇游戏,要用到J2EE 开发环境和eclipse 开发工具,使用的JDK 版本为6.0。所需文档包括可行性分析(研究)报告(FAR )和软件需求规格说明书(SRS )。在系统生命周期中处于软件开发时期。选用四人小组开发计划,由四人配合一起完成软件的开发。
2.2主要参加人员
xx 组长
xxx 组员
xx 组员
xx 组员
2.3产品
2.3.1程序
1. 对功能的规定
本设计所开发的是基于Java 的一个贪吃蛇游戏软件,主要实现游戏的开始、暂停、退出等功能,分为:游戏主界面模块、游戏控制模块两个模块。
游戏主界面模块:
主要包括游戏图形区域界面、游戏开始、暂停、退出、加速、减速。 游戏控制模块:
主要完成游戏的开始、暂停、退出、加速、减速等功能。
2. 对性能的规定
本游戏在设计方面本着方便、实用及娱乐性高的宗旨,在对界面进行设计的过程中,始终坚持清晰明了,在性能方面能够实现效率高,不易出错等优点。
游戏主界面应该力求美观,赏心悦目。游戏控制模块应做到易懂、易操作,而且准确率高,不易出错。
3. 输入输出要求
输入:玩家可以通过快捷键控制游戏,比如快捷键“ENTER ”开始游戏,“空格”暂停游戏,“pageUp ”贪食蛇加速,“pageDown ”贪食蛇减速。键盘上的方向键控制蛇的移动方向。
输出:玩家所得的分数,玩家所用的时间。当玩家所控制的蛇死亡后,要输出一个提示消息“OH, 你死啦,需要重新开始么?”表示蛇的死亡,然后点击确定重新开始游戏。
4. 业务流程图
5. 数据流图
6. 功能分析图
2.3.3服务
1. 设备
WindowsXP
2. 支持软件
Eclipse
3. 接口
KeyListener :监听按键,控制蛇的行动或游戏的运行;
2.3.4非移交的产品
测试版本:SG1.0
2.4验收标准
可运行的完整游戏程序。
2.5完成项目的最迟期限
2014.4.16
2.6本计划的批准者和批准日期
3实施计划
3.1工作任务的分解与人员分工
xxxx 任务分配,程序调试,代码编写,软件开发项目总结
xxx 程序调试,代码编写,计划与需求文档
xx 程序调试, 代码编写,设计规格说明书与软件配置管理计划
xx 程序调试, 代码编写,软件测试计划与软件测试分析报告
3.2进度
对于需求分析、设计、编码实现、测试、移交、培训和安装等工作,给出每项工作任务的预定开始日期、完成日期及所需资源,规定各项工作任务完成的先后顺序以及表征每项工作任务完成的标志性事件(即所谓“里程碑)。
3.3关键问题
逐项列出能够影响整个项目成败的关键问题、技术难点和风险,指出这些问题对项目的影响。
4支持条件
四台能正常运行eclips 的计算机.
二、需求规格说明书
完成人:1.概述(Summary )
1.1项目的目的与目标(Purpose and Aim of Project)
本系统主要是完成贪吃蛇游戏的基本操作。用户可以自己练习和娱乐。本系统需要满足以下几点要求:
(1) 利用方向键来改变蛇的运行方向。
(2) 空格键暂停或继续游戏,并在随机的地方产生食物。
(3) 吃到食物就变成新的蛇体,碰到壁或自身则游戏结束,否则正常运行。
2.目标系统功能需求(Function of Target System)
本设计所开发的是基于Java 的一个贪吃蛇游戏软件,主要实现游戏的开始、暂停、退出等功能,分为:游戏主界面模块、游戏控制模块两个模块。 游戏主界面模块:
主要包括游戏图形区域界面、游戏开始、暂停、退出、减速、加速。 游戏控制模块:
主要完成游戏的开始、暂停、退出等功能。
3.目标系统性能需求(Performance of Target System)
本游戏在设计方面本着方便、实用及娱乐性高的宗旨,在对界面进行设计的过程中,始终坚持清晰明了,在性能方面能够实现效率高,不易出错等优点。
。
4.目标系统界面与接口需求(Interface of Target System)
4.1 界面需求(Interphase Requirement)
游戏主界面应该力求美观,赏心悦目。游戏控制模块应做到易懂、易操作,而且准确率高,不易出错(。
4.2 接口需求(Interface Requirement)
无
5.目标系统假设与约束条件(Suppose and Restriction of Target System)
5.1. 设备
WindowsXP
5.2. 支持软件
Eclipse
5.3. 接口
SnakeListener :
Void SankeMoved(Snake );
三、软件配置管理计划
完成人: xx 1. 引言
软件配置管理计划对于软件开发管理是非常重要的,其主要思想在于版本控制。版本控制是软件配置管理计划的核心思想之一,是指对软件开发过程中各种程序代码、配置文件及说明文档等文件变更的管理。版本控制最主要的功能就是追踪文件的变更。它将什么时候、什么人更改了文件的什么内容等信息忠实地记录下来。每一次文件的改变,文件的版本号都将增加。除了记录版本变更外,版本控制的另一个重要功能是并行开发
1. 目的 2D 游戏贪食蛇软件正常运行,记录游戏运行时的各种状态,如:加速、减速、重新开始以及暂停
1.2 定义和缩写词
本计划中用到的一些术语的定义按GB/T 11457 和GB/T 12504
1.3 参考资料
GB/T 11457 软件工程术语
GB 8566 计算机软件开发规范
GB 8567 计算机软件产品开发文件编制指南
2 管理
2.1 机构
在本游戏软件整个开发期间,必须成立软件配置管理小组负责配置管理工作。软件配置管理人员应该根据对该游戏的具体要求,制订必要的规程和规定,以确保完全遵守本计划规定的所有要求
2.2 任务
A .负责审定软件基线的建立和配置的标识
B .实施项目的配置好管理
C .组长审核配置管理活动
2.3 职责
A .对有关软件配置管理的各项工作全面负责,特别要对更改建议的审批和评审负责;
B .负责监督在软件配置管理工作中认真执行软件工程规范;
C .负责检查配置更改时的质量保证措施;
D .负责实施各自的配置管理工作,并参与游戏的功能配置检查和物理配置检查; E . 用户代表负责反映用户对配置管理的要求,并协助检查各类人员对软件配置管理计划的执行情况;
F .负责审查所采用的配置管理工具、技术和方法,并负责汇总、维护和保存有关软件配置管理活动的各项记录
2.4 接口控制
KeyListener :按键控制
Runnable :多线程
Observer :观察者模式
2.5 实现
建立软件配置管理小组:在批准软件配置管理计划之后,立即成立软件配置管理小组。
建立各阶段的配置基线:随着贪食蛇软件任务书的评审和批准,建立起功能基线;随着《贪食蛇游戏软件需求规格说明书》的批准,建立起指派基线;随着游戏软件的集成与系统测试的完成,建立起产品基线。
建立软件库:在本项目所属的各个子系统的研制工作的开始,就建立起各个子系统的软件开发库,并在本项目配置管理小组的计算机上建立起有关该系统及其子系统的软件受控库。以后在每个开发阶段的结束,建立各个子系统的新的开发库,同时把这个阶段的阶段产品送入总的软件受控库,并在各个子系统的计算机上建立软件受控库的副本。软件受控库必须以主软件受控库为准。当全部开发工作结束,在配置管理小组的计算机上建立起软件产品库,并在各子系统的计算机上建立软件产品库的副本
3 软件配置管理活动
3.1 配置标识
标题:贪食蛇(Snake Game)
版本号:SG1.0
3.1.1 基线
版本:“SG1.0”
3.1.2 代码, 文档
GreedSnake :添加一个观察者,开始游戏,多线程
SnakeControl :监听处理,对按键进行监听并产生行为
SnakeModel :游戏模板,包括初始化蛇,对食物的初始化,分数规则等 SnakeView :游戏视图,游戏的界面处理
四、设计规格说明书
完成人: xx
1.引言(Introduction )
本章对该文档的目的、功能范围、术语、相关文档、参考资料等进行说明
1.1 目的(Purpose )
目的旨在推动软件工程的规范化,使设计人员遵循统一的概要设计书写规范,节省制作文档的时间,降低系统实现的风险,做到系统设计的规范性与全面性,以利于系统的实现、测试、维护、升级等
1.2 命名规则(Naming Rule)
变量对象命名规则:申明全局变量、局部变量对象的命名规则。
数据库对象命名规则:申明数据库表名、字段名、索引名、视图名等对象的命名规则。
1.3 参考资料(References )
1.Java 从入门到精通 魔乐科技(MLDN )软件实训中心 编著/2010-04-01/人民邮电出版社
2.Java 编程思想(第4版) 2007-06-01/机械工业出版社
3. 轻量级Java EE企业应用实战(第3版)李刚 编著/2012-04-01/电子工业出版社
4. 疯狂Java 讲义(第2版) 李刚 编著/2012-01-01/电子工业出版社
5.Java 语言程序设计:基础篇(第8版) (美)梁勇 著,李娜 译/2011-06-01/机械工业出版社
6.Effective Java中文版(第2版) (美)布洛克 著,杨春花,俞黎敏 机械工业出版社
1.4 相关文档(Related Documents)
源程序
GreedSnake :主体类
public class GreedSnake {
public static void main(String[] args) {
SnakeModel model = new SnakeModel(20,30);
SnakeControl control = new SnakeControl(model); SnakeView view = new SnakeView(model,control); //添加一个观察者,让view 成为model 的观察者
model.addObserver(view);
(new Thread(model)).start();
}
}
SnakeControl :控制类
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
public class SnakeControl implements KeyListener {
SnakeModel model ;
public SnakeControl(SnakeModel model) {
this . model = model;
}
public void keyPressed(KeyEvent e) {
int keyCode = e.getKeyCode();
if (model . running ) { // 运行状态下,处理的按键
switch (keyCode) {
case KeyEvent.VK_UP:
model .changeDirection(SnakeModel.UP );
break ;
case KeyEvent.VK_DOWN:
model .changeDirection(SnakeModel.DOWN );
break ;
case KeyEvent.VK_LEFT:
model .changeDirection(SnakeModel.LEFT );
break ;
case KeyEvent.VK_RIGHT:
model .changeDirection(SnakeModel.RIGHT );
break ;
}
} } case KeyEvent.VK_ADD: case KeyEvent.VK_PAGE_UP: model .speedUp(); break ; case KeyEvent.VK_SUBTRACT: case KeyEvent.VK_PAGE_DOWN: model .speedDown(); break ; case KeyEvent.VK_SPACE: case KeyEvent.VK_P: model .changePauseState(); break ; default : } // 任何情况下处理的按键,按键导致重新启动游戏 if (keyCode == KeyEvent.VK_ENTER) { model .reset(); } public void keyReleased(KeyEvent e) { } public void keyTyped(KeyEvent e) { }
SnakeModel:模板类
import javax.swing.*;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.Observable;
import java.util.Random;
public class SnakeModel extends Observable implements Runnable{
boolean [][] matrix; // 指示位置上有没蛇
体或食物
new // 蛇体 Node food;
int maxX;
int
int direction = 2; // 蛇运行的方向 boolean running = false ; // 运行状态
int timeInterval = 200; // 时间间隔,毫秒 double speedChangeRate = 0.75; // 每次得速度变化率
boolean paused = false ; // 暂停标志
int score = 0; // 得分
int countMove = 0; // 吃到食物前移动的次数
// UP and DOWN should be even
// RIGHT and LEFT should be odd
public static final int UP = 2;
public static final int DOWN = 4;
public static final int LEFT = 1;
public static final int RIGHT = 3;
public SnakeModel( int maxX, int maxY) {
this .maxX = maxX;
this .maxY = maxY;
reset();
}
public void reset(){
direction = SnakeModel.UP; // 蛇运行的方向 timeInterval = 200; // 时间间隔,毫秒 paused = false ; // 暂停标志 score = 0; // 得分 countMove = 0; // 吃到食物前移动
的次数
全部清0 matrix = new boolean [maxX][]; for (int i = 0; i
// 初始化蛇体,如果横向位置超过20个,长度为10,否则为横向位置的一半
int initArrayLength = maxX > 20 ? 10 : maxX / 2; nodeArray.clear();
for (int i = 0; i
int x = maxX / 2 + i;//maxX被初始化为20
int y = maxY / 2; //maxY被初始化为30
//nodeArray[x,y]: [10,15]-[11,15]-[12,15]~~[20,15] //默认的运行方向向上,所以游戏一开始nodeArray 就变为: // [10,14]-[10,15]-[11,15]-[12,15]~~[19,15]
matrix[x][y] = true ;
}
// 创建食物 food = createFood(); matrix[food.x][food.y] = true ; } public void changeDirection(int newDirection) { // 改变的方向不能与原来方向同向或反向 if (direction % 2 != newDirection % 2) { direction = newDirection; } }
/**
* 运行一次 * @return */
public boolean moveOn() {
Node n = (Node) nodeArray.getFirst(); int x = n.x; int y = n.y;
// 根据方向增减坐标值 switch (direction) { case UP: y--; break ; case DOWN: y++; break ; case LEFT: x--; break ; case RIGHT: x++; break ; }
// 如果新坐标落在有效范围内,则进行处理
if ((0
if (matrix[x][y]) { // 如果新坐标的点上有东西(蛇体或者食物)
if (x == food.x && y == food.y) { // 吃到食物,成功
// 从蛇头赠长
// 分数规则,与移动改变方向的次数和速度两个元素有关
int scoreGet = (10000 - 200 * countMove) / timeInterval;
score += scoreGet > 0 ? scoreGet : 10; countMove = 0;
food = createFood(); // 创建新的食物
matrix[food.x][food.y] = true ; // 设置食物所在位置
return true ;
} else // 吃到蛇体自身,失败
return false ;
} else { // 如果新坐标的点上没有东西(蛇体),移动蛇体
matrix[x][y] = true ;
n = (Node) nodeArray.removeLast(); matrix[n.x][n.y] = false ; countMove++; return true ; } }
return false ; // 触到边线,失败 }
public void run() { running = true ; while (running) { try {
Thread.sleep(timeInterval); } catch (Exception e) { break ; }
if (!paused) {
if (moveOn()) {
setChanged(); // Model通知View 数据已经更新
notifyObservers(); } else { i nt result=JOptionPane.showConfirmDialog(null , "OH, 你死啦, 需要重新開始么?" , "Game Over", JOptionPane.OK_CANCEL_OPTION); i f (result==0){ reset(); } e lse { break ; } } } }
running = false ; }
private Node createFood() { int x = 0; int y = 0; // 随机获取一个有效区域内的与蛇体和食物不重叠的位置 do {
Random r = new Random(); x = r.nextInt(maxX); y = r.nextInt(maxY); } while (matrix[x][y]); return new Node(x, y); }
public void speedUp() {
timeInterval *= speedChangeRate; }
public void speedDown() {
timeInterval /= speedChangeRate; }
public void changePauseState() { paused = !paused; }
public String toString() { String result = "" ;
for (int i = 0; i
result += "[" + n.x + "," + n.y + "]"; }
return result; } }
class Node { int x; int y;
Node(int x, int y) { this .x = x; this .y = y; }
}
SnakeView:视图类
import javax.swing.*; import java.awt.*;
import java.util.Iterator; import java.util.LinkedList;
import java.util.Observable; import public class SnakeView implements Observer { SnakeControl control = null ; SnakeModel model = null ;
JFrame mainFrame ; Canvas paintCanvas ; JLabel labelScore ;
public static final int canvasWidth = 200; public static final int canvasHeight = 300;
public static final int nodeWidth = 10; public static final int nodeHeight = 10;
public SnakeView(SnakeModel model, SnakeControl control) { this . model = model;
this . control = control;
mainFrame = new JFrame("GreedSnake" ); mainFrame .setLocation(600, 200);
Container cp = mainFrame .getContentPane();
// 创建顶部的分数显示
labelScore = new JLabel(" 得分:");
cp.add(labelScore , BorderLayout.NORTH );
// 创建中间的游戏显示区域
paintCanvas = new Canvas();
paintCanvas .setSize(canvasWidth + 1, canvasHeight + 1); paintCanvas .addKeyListener(control);
cp.add(paintCanvas , BorderLayout.CENTER ); // 创建底下的帮助栏
JPanel panelButtom = new JPanel();
panelButtom.setLayout(new BorderLayout()); JLabel labelHelp;
labelHelp = new JLabel("PageUp :加速, PageDown:减速" , JLabel. LEFT );
panelButtom.add(labelHelp, BorderLayout.NORTH ); labelHelp = new JLabel("ENTER :重新开始" , JLabel.LEFT );
panelButtom.add(labelHelp, BorderLayout.CENTER );
labelHelp = new JLabel("SPACE :暂停" , JLabel.LEFT ); panelButtom.add(labelHelp, BorderLayout.SOUTH ); cp.add(panelButtom, BorderLayout.SOUTH );
mainFrame .addKeyListener(control); mainFrame .pack();
mainFrame .setResizable(false );
mainFrame .setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); mainFrame .setVisible(true ); }
void repaint() {
Graphics g = paintCanvas .getGraphics();
//draw background
g.setColor(Color.WHITE );
g.fillRect(0, 0, canvasWidth , canvasHeight );
// draw the snake
g.setColor(Color.BLACK );
model . nodeArray ; while (it.hasNext()) {
Node n = (Node) it.next(); drawNode(g, n); }
// draw the food
g.setColor(Color.RED );
}
Node n = model . food ; drawNode(g, n); updateScore(); }
private void drawNode(Graphics g, Node n) { g.fillRect(n.x * nodeWidth , n.y * nodeHeight , nodeWidth - 1, nodeHeight - 1); }
public void updateScore() {
String s = " 得分: " + model . score ; labelScore .setText(s); }
public void update(Observable o, Object arg) { repaint(); }
2.系统设计(Design of Collective)
2.1 体系结构设计(Design of Architecture)
采用包图画出体统的体系结构模型,然后进行扩展,画出个子系统内构成及模块之间的关系。
2.2 模块设计(Module Design)
对象类用类图说明各个类属性和方法以及类之间的关系,对于复杂对象要画出状态图。
2.3 功能模块清单(Module List)
模块(类)清单
表3-3 模块清单
五、软件测试计划
完成人:
1引言 1.1编写目的
本测试计划文档作为指导此测试项目循序渐进的基础,帮助我们安排合适的资源和进度,避免可能的风险。本文档有助于实现以下目标:
1) 确定现有项目的信息和应测试的软件结构。 2) 列出推荐的测试需求
3) 推荐可采用的测试策略,并对这些策略加以详细说明 4) 确定所需的资源,并对测试的工作量进行估计。
5) 列出测试项目的可交付元素,包括用例以及测试报告等。 1.2背景
软件系统名称:贪吃蛇游戏
该开发项目的历史:蛇引诱夏娃吃了苹果之后,就被贬为毒虫,阴险的象征。
而蛇吃东西是整只动物吞进去的,大概在文艺复兴的时候就有人发明的一种游戏,是现在贪吃蛇的前身。
该软件由测试小组的人员根据该文档执行此项目的测试任务。在开始执行本测试计划之前应实现游戏的基本功能,有完整的需求分析说明书,概要设计说明书,和详细设计说明书。 1.3定义
节:
一条蛇可以看成由许多正方形的“小格子”拼凑成,称作节。节是蛇
身上最小的单位。
链表:
用来保存每一段的状态,链表的元素单位是节。且链表的第一个元素
表示蛇的头部。
坐标系:
以左上角那点为(0,0),向右则x 递增,向下则y 递增。
1.4参考资料
张海藩:《软件工程导论》第五版 清华大学出版社 肖刚等:《实用软件文档写作》 清华大学出版社 2计划
2.1说明
2.2测试内容
名称标识符:功能测试
进度安排:开始时间:2014-4-13 8:00 结束时间:2014-4-1312:00
内容:对游戏的开始新游戏、暂停、继续、退出、查看历史成绩、计时、
统计分数的7种功能进行测试,并测试程序的鼠标点击事件及按键响应事件。 2.3测试1(标识符)
2.3.2条件
本项测试工作对资源的要求:
设备:硬件最低要求:CPU PII以上PC 服务器。支持Windows98以上的操作系统。
软件:JVM ,Eclipse
2.3.3测试资料
● 贪吃蛇游戏的源代码
● 所在的媒体:Eclipse 工具
● 测试的输入输出举例:输入即按钮的选择或者快捷键、方
向键;输出即蛇的移动、游戏时间、分数等信息。
● 测试方法:白盒测试,黑盒测试 ● 测试过程:
2.3.4测试培训
培训内容:贪吃蛇游戏软件的使用
受训人员:参加测试的用户及开发任务组的人员
从事培训的工作人员:研发小组的人员 3测试设计说明书
3.1测试1(标识符)
控制
● 输入:人工输入
● 操作的顺序:第一次操作必须从NewGame 开始,游戏尚
未结束不能Exit ,也不能NewGanme ,选择Pause 后可以Resume ,可以Exit ,如果Pause 后Exit ,下次再运行程序时可以从Resume 开始。
● 记录结果方法:记录用户输入的控制命令,蛇、食物、
石头的状态、时间、分数。
4评价准则
1.范围
本系统测试的主要内容为功能测试,界面测试 2.数据整理
由于系统规模较小,所以,我们采用手工方式将测试数据加工成便于评价的适当的形式。 3. 尺度
能正确完成功能要求。 测试用例正确执行,由于系统的输出除时间和分数外没有什么精确的数字,所以要求输出与预期的输出结果完全一致。
六、软件测试分析报告
完成人:1引言
1.1编写目的
本测试分析报告是项目测试组成员按照测试计划测试贪吃蛇游戏的运行性能,对所测试的结果和数据进行汇总,反映测试情况的报告。 1.2背景
说明:
a. 软件系统名称: 贪食蛇游戏 b. 任务提出者: 软件2班
c. 开发者: 软件2班317寝室团队 d. 使用者: 广大的游戏玩家
1.3定义
Configuration :
中文意思是配置。它定义了硬件所必须具备的能力。
CLDC :
全称是Connected Limited Devices Configuration ,中文意思是有限制连接设备配置。它是在Configuration 基础上定义的Java 的核心类库和虚拟机。
Profile :
中文意思是简表,它是在Configuration 之上的规范。简表针对不同器的特性定义了高级的API(应用程序接口) 。
MIDP :
全称是Mobile Information Device Profile 。它是针对移动设备定义的 Profile 。
MIDlet :
MIDlet 是在MIDP 中定义的一种应用程序框架,它是被应用管理软件(AMS)管理
的。MIDlet 是在支持MIDP 规范的移动信息设备上运行的应用程序,MIDlet 不是一个单独的文件,而是一个文件的集合,它除了必须包含一个继承自javax.microedition.midlet.MIDlet 的类之外,还包括此类执行时间所需的其他类和资源文件(只要是非class 文件都成为资源文件) 。 1.4参考资料
本模块功能测试请参考《软件测试计划》,《用户操作手册》和本章。并参考《软件工程》一书,运用白盒法与黑盒法相结合进行测试。
2测试概要
3测试结果及发现
3.1测试1(标识符)
经测试,所以按键都能正常被监听,并完成他的功能
4分析摘要
5.1能力
该游戏能正常运行,可以在业余时间娱乐,放松心情 5.2缺陷和限制
该游戏是简单的贪食蛇游戏,缺陷在于还不够人性化,没有关卡模式,没有计时等多项功能。 5.3评价
总上,通过测试,软件已经达到我们的预期目标,可以交付使用,请广大玩家尽情去玩。
6测试资源消耗
七、软件项目开发总结报告
完成人:1引言
1.1编写目的
为了总结报告在工作工程中产生的问题、行到经验,并且总结报告设计和制作者过程中的逻辑和想法。 1.2背景
项目名称:贪食蛇游戏
开发背景:通过开发此软件的过程,提高用软件员工程序分析问题、解决问题的能力,增强对Java 和数据的使用能力,同时了解各种文档的标准编写方式。 1.3定义
NewGame :开始游戏 SnakeControl :监听控制
SnakeModel :游戏内的数据对象初始化 1.4参考资料
1.Java 从入门到精通 魔乐科技(MLDN )软件实训中心 编著/2010-04-01/人民邮电出版社
2.Java 编程思想(第4版) 2007-06-01/机械工业出版社
3. 轻量级Java EE企业应用实战(第3版)李刚 编著/2012-04-01/电子工业出版社 4. 疯狂Java 讲义(第2版) 李刚 编著/2012-01-01/电子工业出版社 5.Java 语言程序设计:基础篇(第8版) (美)梁勇 著,李娜 译/2011-06-01/机械工业出版社
6.Effective Java中文版(第2版) (美)布洛克 著,杨春花,俞黎敏 机械工业出版社
2实际开发结果
2.1产品
产品名称:贪食蛇游戏
产品功能:能正常运行贪食蛇游戏,能对蛇的速度进行加速和减速 2.2主要功能和性能
详细参加《需求规格说明书》 2.3基本流程
用图给出本程序系统的实际的基本的处理流程。 2.4进度
按照原定计划进行 2.5费用
无费用
3开发工作评价
3.1对生产效率的评价
实际生产时间:1周
平均每使用小时数:3小时 3.2对产品质量的评价
产品质量较好,在测试过程中相对来说稳定,但是由于功能还不够完善,不适合大规模推广普及。 3.3对技术方法的评价
在开发过程中,组员们严格按照开发阶段行事,掌握了整个开发流程,但是由于部分组员有技术问题,还需要更加的磨合,增强相关技术知识。 3.4出错原因的分析
1、对于程序员设计不够科学,对于设计师语言的掌握不够了解。 2、由于没有大量的时间来制作,功能还不够完善。
3、小组人员沟通不足,协调出现了些问题,但都能很好的按时解决
4经验与教训
经过这段时间开发过程,组员们了解了软件工程序的具体涵义,熟悉了开发流程,也 撑握了软件文档的编写标准,学到了很多以前没有了解到的知识,但是由于时间不够充裕,功能没能够完善,组员之间的交流不够,个人技术问题不足,还希望之后能增强个人技术知识。总体来说,学到的知识都是很值得珍惜的。
41
中南林业科技大学
《小组软件过程实验》
实验报告
题目: 2D 游戏贪食蛇软件开发 专业班级: 11级软件工程2班 组长: xxx 成员:指导教师: xxxxx 完成日期: 2014/4/15
目 录
1 软件项目开发计划………………………………………………(页码) 2 软件需求规格说明书……………………………………………(页码) 3 软件配置管理计划……………………………………………(页码) 4 软件设计规格说明………………………………………………(页码) 5 软件测试计划……………………………………………………(页码) 6 软件测试分析报告………………………………………………(页码) 7 软件项目开发总结报告…………………………………………(页码) 附件A :
小组制定的软件过程规范 ……………………………………(页码) 附件B :
其他软件开发过程记录信息……………………………………(页码)
小组成员角色与分工情况表
一、软件项目开发计划
完成人: xxxx
1引言
1.1编写目的
本文档的目的是明确基于JAVA 的贪吃蛇项目的基本需求分析,明确项目中各个任务系统的不同分工,分析项目的核心功能和项目所需要达到的预期目标。期望读者包括:项目发起人、项目执行团队、指导老师。
1.2 背景
近年来,Java 作为一种新的编程语言,以其简单性、可移植性和平台无关性等优点,得到了广泛地应用,特别是Java 与万维网的完美结合,使其成为网络编程和嵌入式编程领域的首选编程语言。贪吃蛇游戏的设计比较复杂,它涉及面广、牵涉方面多,如果不好好考虑和设计,将难以成功开发出这个游戏。在这个游戏的设计中,牵涉到图形界面的显示与更新、数据的收集与更新,并且在这个游戏的开发中,还要应用类的继承机制以及一些设计模式。因此,如何设计和开发好这个贪吃蛇游戏,对于提高Java 开发水平和系统的设计能力有极大的帮助。在设计开发过程中,需要处理好各个类之间的继承关系,还要处理各个类相应的封装,并且还要协调好各个模块之间的逻辑依赖关系和数据通信关系。
“贪吃蛇”游戏是一个经典的游戏,它因操作简单、娱乐性强而广受欢迎。本文基于Java 技术,开发了一个操作简单、界面美观、功能较齐全的“贪吃蛇”游戏。整个游戏程序分为二个功能模块,四个类模块,实现了游戏的开始、暂停、结束。通过本游戏的开发,达到学习Java 技术和熟悉软件开发流程的目的。
1.3定义
JA V A :Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由Sun Microsystems公司于1995年5月推出的Java 程序设计语言和java 平台的总称。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于个人PC 、数据中心、游戏控制台、科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。在全球云计算和移动互联网的产业环境下,Java 更具备了显著优势和广阔前景。
运行环境:意指一种把半编译的执行码在目标机器上运行的环境。
算法:算法可以理解为有基本运算及规定的运算顺序所构成的完整的解题步骤。或者看成按照要求设计好的有限的确切的计算序列,并且这样的步骤和序列可以解决一类问题。
编译处理:利用编译程序从源语言编写的源程序产生目标程序的过程;用编译程序产生目标程序的动作。 编译就是把高级语言变成计算机可以识别的2进制语言,计算机只认识1和0,编译程序把人们熟悉的语言换成2进制的。 编译程序把一个源程序翻译成目标程序的工作过程分为五个阶段:词法分析;语法分析;语义检查和中间代码生成;代码优化;目标代码生成。主要是进行词法分析和语法分析,又称为源程序分析,分析过程中发现有语法错误,给出提示信息。
调试运行:检查和修改程序中的错误,保证它能正确无误地运行是程序设计工作中的重要一环。
1.4参考资料
1.Java 从入门到精通 魔乐科技(MLDN )软件实训中心 编著/2010-04-01/人民邮电出版社
2.Java 编程思想(第4版) 2007-06-01/机械工业出版社
3. 轻量级Java EE企业应用实战(第3版)李刚 编著/2012-04-01/电子工业出版社
4. 疯狂Java 讲义(第2版) 李刚 编著/2012-01-01/电子工业出版社
5.Java 语言程序设计:基础篇(第8版) (美)梁勇 著,李娜 译/2011-06-01/机械工业出版社
6.Effective Java中文版(第2版) (美)布洛克 著,杨春花,俞黎敏 机械工业出版社
2项目概述
2.1工作内容
本项目需开发出一个可以在windos 操作系统上运行的贪吃蛇游戏,要用到J2EE 开发环境和eclipse 开发工具,使用的JDK 版本为6.0。所需文档包括可行性分析(研究)报告(FAR )和软件需求规格说明书(SRS )。在系统生命周期中处于软件开发时期。选用四人小组开发计划,由四人配合一起完成软件的开发。
2.2主要参加人员
xx 组长
xxx 组员
xx 组员
xx 组员
2.3产品
2.3.1程序
1. 对功能的规定
本设计所开发的是基于Java 的一个贪吃蛇游戏软件,主要实现游戏的开始、暂停、退出等功能,分为:游戏主界面模块、游戏控制模块两个模块。
游戏主界面模块:
主要包括游戏图形区域界面、游戏开始、暂停、退出、加速、减速。 游戏控制模块:
主要完成游戏的开始、暂停、退出、加速、减速等功能。
2. 对性能的规定
本游戏在设计方面本着方便、实用及娱乐性高的宗旨,在对界面进行设计的过程中,始终坚持清晰明了,在性能方面能够实现效率高,不易出错等优点。
游戏主界面应该力求美观,赏心悦目。游戏控制模块应做到易懂、易操作,而且准确率高,不易出错。
3. 输入输出要求
输入:玩家可以通过快捷键控制游戏,比如快捷键“ENTER ”开始游戏,“空格”暂停游戏,“pageUp ”贪食蛇加速,“pageDown ”贪食蛇减速。键盘上的方向键控制蛇的移动方向。
输出:玩家所得的分数,玩家所用的时间。当玩家所控制的蛇死亡后,要输出一个提示消息“OH, 你死啦,需要重新开始么?”表示蛇的死亡,然后点击确定重新开始游戏。
4. 业务流程图
5. 数据流图
6. 功能分析图
2.3.3服务
1. 设备
WindowsXP
2. 支持软件
Eclipse
3. 接口
KeyListener :监听按键,控制蛇的行动或游戏的运行;
2.3.4非移交的产品
测试版本:SG1.0
2.4验收标准
可运行的完整游戏程序。
2.5完成项目的最迟期限
2014.4.16
2.6本计划的批准者和批准日期
3实施计划
3.1工作任务的分解与人员分工
xxxx 任务分配,程序调试,代码编写,软件开发项目总结
xxx 程序调试,代码编写,计划与需求文档
xx 程序调试, 代码编写,设计规格说明书与软件配置管理计划
xx 程序调试, 代码编写,软件测试计划与软件测试分析报告
3.2进度
对于需求分析、设计、编码实现、测试、移交、培训和安装等工作,给出每项工作任务的预定开始日期、完成日期及所需资源,规定各项工作任务完成的先后顺序以及表征每项工作任务完成的标志性事件(即所谓“里程碑)。
3.3关键问题
逐项列出能够影响整个项目成败的关键问题、技术难点和风险,指出这些问题对项目的影响。
4支持条件
四台能正常运行eclips 的计算机.
二、需求规格说明书
完成人:1.概述(Summary )
1.1项目的目的与目标(Purpose and Aim of Project)
本系统主要是完成贪吃蛇游戏的基本操作。用户可以自己练习和娱乐。本系统需要满足以下几点要求:
(1) 利用方向键来改变蛇的运行方向。
(2) 空格键暂停或继续游戏,并在随机的地方产生食物。
(3) 吃到食物就变成新的蛇体,碰到壁或自身则游戏结束,否则正常运行。
2.目标系统功能需求(Function of Target System)
本设计所开发的是基于Java 的一个贪吃蛇游戏软件,主要实现游戏的开始、暂停、退出等功能,分为:游戏主界面模块、游戏控制模块两个模块。 游戏主界面模块:
主要包括游戏图形区域界面、游戏开始、暂停、退出、减速、加速。 游戏控制模块:
主要完成游戏的开始、暂停、退出等功能。
3.目标系统性能需求(Performance of Target System)
本游戏在设计方面本着方便、实用及娱乐性高的宗旨,在对界面进行设计的过程中,始终坚持清晰明了,在性能方面能够实现效率高,不易出错等优点。
。
4.目标系统界面与接口需求(Interface of Target System)
4.1 界面需求(Interphase Requirement)
游戏主界面应该力求美观,赏心悦目。游戏控制模块应做到易懂、易操作,而且准确率高,不易出错(。
4.2 接口需求(Interface Requirement)
无
5.目标系统假设与约束条件(Suppose and Restriction of Target System)
5.1. 设备
WindowsXP
5.2. 支持软件
Eclipse
5.3. 接口
SnakeListener :
Void SankeMoved(Snake );
三、软件配置管理计划
完成人: xx 1. 引言
软件配置管理计划对于软件开发管理是非常重要的,其主要思想在于版本控制。版本控制是软件配置管理计划的核心思想之一,是指对软件开发过程中各种程序代码、配置文件及说明文档等文件变更的管理。版本控制最主要的功能就是追踪文件的变更。它将什么时候、什么人更改了文件的什么内容等信息忠实地记录下来。每一次文件的改变,文件的版本号都将增加。除了记录版本变更外,版本控制的另一个重要功能是并行开发
1. 目的 2D 游戏贪食蛇软件正常运行,记录游戏运行时的各种状态,如:加速、减速、重新开始以及暂停
1.2 定义和缩写词
本计划中用到的一些术语的定义按GB/T 11457 和GB/T 12504
1.3 参考资料
GB/T 11457 软件工程术语
GB 8566 计算机软件开发规范
GB 8567 计算机软件产品开发文件编制指南
2 管理
2.1 机构
在本游戏软件整个开发期间,必须成立软件配置管理小组负责配置管理工作。软件配置管理人员应该根据对该游戏的具体要求,制订必要的规程和规定,以确保完全遵守本计划规定的所有要求
2.2 任务
A .负责审定软件基线的建立和配置的标识
B .实施项目的配置好管理
C .组长审核配置管理活动
2.3 职责
A .对有关软件配置管理的各项工作全面负责,特别要对更改建议的审批和评审负责;
B .负责监督在软件配置管理工作中认真执行软件工程规范;
C .负责检查配置更改时的质量保证措施;
D .负责实施各自的配置管理工作,并参与游戏的功能配置检查和物理配置检查; E . 用户代表负责反映用户对配置管理的要求,并协助检查各类人员对软件配置管理计划的执行情况;
F .负责审查所采用的配置管理工具、技术和方法,并负责汇总、维护和保存有关软件配置管理活动的各项记录
2.4 接口控制
KeyListener :按键控制
Runnable :多线程
Observer :观察者模式
2.5 实现
建立软件配置管理小组:在批准软件配置管理计划之后,立即成立软件配置管理小组。
建立各阶段的配置基线:随着贪食蛇软件任务书的评审和批准,建立起功能基线;随着《贪食蛇游戏软件需求规格说明书》的批准,建立起指派基线;随着游戏软件的集成与系统测试的完成,建立起产品基线。
建立软件库:在本项目所属的各个子系统的研制工作的开始,就建立起各个子系统的软件开发库,并在本项目配置管理小组的计算机上建立起有关该系统及其子系统的软件受控库。以后在每个开发阶段的结束,建立各个子系统的新的开发库,同时把这个阶段的阶段产品送入总的软件受控库,并在各个子系统的计算机上建立软件受控库的副本。软件受控库必须以主软件受控库为准。当全部开发工作结束,在配置管理小组的计算机上建立起软件产品库,并在各子系统的计算机上建立软件产品库的副本
3 软件配置管理活动
3.1 配置标识
标题:贪食蛇(Snake Game)
版本号:SG1.0
3.1.1 基线
版本:“SG1.0”
3.1.2 代码, 文档
GreedSnake :添加一个观察者,开始游戏,多线程
SnakeControl :监听处理,对按键进行监听并产生行为
SnakeModel :游戏模板,包括初始化蛇,对食物的初始化,分数规则等 SnakeView :游戏视图,游戏的界面处理
四、设计规格说明书
完成人: xx
1.引言(Introduction )
本章对该文档的目的、功能范围、术语、相关文档、参考资料等进行说明
1.1 目的(Purpose )
目的旨在推动软件工程的规范化,使设计人员遵循统一的概要设计书写规范,节省制作文档的时间,降低系统实现的风险,做到系统设计的规范性与全面性,以利于系统的实现、测试、维护、升级等
1.2 命名规则(Naming Rule)
变量对象命名规则:申明全局变量、局部变量对象的命名规则。
数据库对象命名规则:申明数据库表名、字段名、索引名、视图名等对象的命名规则。
1.3 参考资料(References )
1.Java 从入门到精通 魔乐科技(MLDN )软件实训中心 编著/2010-04-01/人民邮电出版社
2.Java 编程思想(第4版) 2007-06-01/机械工业出版社
3. 轻量级Java EE企业应用实战(第3版)李刚 编著/2012-04-01/电子工业出版社
4. 疯狂Java 讲义(第2版) 李刚 编著/2012-01-01/电子工业出版社
5.Java 语言程序设计:基础篇(第8版) (美)梁勇 著,李娜 译/2011-06-01/机械工业出版社
6.Effective Java中文版(第2版) (美)布洛克 著,杨春花,俞黎敏 机械工业出版社
1.4 相关文档(Related Documents)
源程序
GreedSnake :主体类
public class GreedSnake {
public static void main(String[] args) {
SnakeModel model = new SnakeModel(20,30);
SnakeControl control = new SnakeControl(model); SnakeView view = new SnakeView(model,control); //添加一个观察者,让view 成为model 的观察者
model.addObserver(view);
(new Thread(model)).start();
}
}
SnakeControl :控制类
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
public class SnakeControl implements KeyListener {
SnakeModel model ;
public SnakeControl(SnakeModel model) {
this . model = model;
}
public void keyPressed(KeyEvent e) {
int keyCode = e.getKeyCode();
if (model . running ) { // 运行状态下,处理的按键
switch (keyCode) {
case KeyEvent.VK_UP:
model .changeDirection(SnakeModel.UP );
break ;
case KeyEvent.VK_DOWN:
model .changeDirection(SnakeModel.DOWN );
break ;
case KeyEvent.VK_LEFT:
model .changeDirection(SnakeModel.LEFT );
break ;
case KeyEvent.VK_RIGHT:
model .changeDirection(SnakeModel.RIGHT );
break ;
}
} } case KeyEvent.VK_ADD: case KeyEvent.VK_PAGE_UP: model .speedUp(); break ; case KeyEvent.VK_SUBTRACT: case KeyEvent.VK_PAGE_DOWN: model .speedDown(); break ; case KeyEvent.VK_SPACE: case KeyEvent.VK_P: model .changePauseState(); break ; default : } // 任何情况下处理的按键,按键导致重新启动游戏 if (keyCode == KeyEvent.VK_ENTER) { model .reset(); } public void keyReleased(KeyEvent e) { } public void keyTyped(KeyEvent e) { }
SnakeModel:模板类
import javax.swing.*;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.Observable;
import java.util.Random;
public class SnakeModel extends Observable implements Runnable{
boolean [][] matrix; // 指示位置上有没蛇
体或食物
new // 蛇体 Node food;
int maxX;
int
int direction = 2; // 蛇运行的方向 boolean running = false ; // 运行状态
int timeInterval = 200; // 时间间隔,毫秒 double speedChangeRate = 0.75; // 每次得速度变化率
boolean paused = false ; // 暂停标志
int score = 0; // 得分
int countMove = 0; // 吃到食物前移动的次数
// UP and DOWN should be even
// RIGHT and LEFT should be odd
public static final int UP = 2;
public static final int DOWN = 4;
public static final int LEFT = 1;
public static final int RIGHT = 3;
public SnakeModel( int maxX, int maxY) {
this .maxX = maxX;
this .maxY = maxY;
reset();
}
public void reset(){
direction = SnakeModel.UP; // 蛇运行的方向 timeInterval = 200; // 时间间隔,毫秒 paused = false ; // 暂停标志 score = 0; // 得分 countMove = 0; // 吃到食物前移动
的次数
全部清0 matrix = new boolean [maxX][]; for (int i = 0; i
// 初始化蛇体,如果横向位置超过20个,长度为10,否则为横向位置的一半
int initArrayLength = maxX > 20 ? 10 : maxX / 2; nodeArray.clear();
for (int i = 0; i
int x = maxX / 2 + i;//maxX被初始化为20
int y = maxY / 2; //maxY被初始化为30
//nodeArray[x,y]: [10,15]-[11,15]-[12,15]~~[20,15] //默认的运行方向向上,所以游戏一开始nodeArray 就变为: // [10,14]-[10,15]-[11,15]-[12,15]~~[19,15]
matrix[x][y] = true ;
}
// 创建食物 food = createFood(); matrix[food.x][food.y] = true ; } public void changeDirection(int newDirection) { // 改变的方向不能与原来方向同向或反向 if (direction % 2 != newDirection % 2) { direction = newDirection; } }
/**
* 运行一次 * @return */
public boolean moveOn() {
Node n = (Node) nodeArray.getFirst(); int x = n.x; int y = n.y;
// 根据方向增减坐标值 switch (direction) { case UP: y--; break ; case DOWN: y++; break ; case LEFT: x--; break ; case RIGHT: x++; break ; }
// 如果新坐标落在有效范围内,则进行处理
if ((0
if (matrix[x][y]) { // 如果新坐标的点上有东西(蛇体或者食物)
if (x == food.x && y == food.y) { // 吃到食物,成功
// 从蛇头赠长
// 分数规则,与移动改变方向的次数和速度两个元素有关
int scoreGet = (10000 - 200 * countMove) / timeInterval;
score += scoreGet > 0 ? scoreGet : 10; countMove = 0;
food = createFood(); // 创建新的食物
matrix[food.x][food.y] = true ; // 设置食物所在位置
return true ;
} else // 吃到蛇体自身,失败
return false ;
} else { // 如果新坐标的点上没有东西(蛇体),移动蛇体
matrix[x][y] = true ;
n = (Node) nodeArray.removeLast(); matrix[n.x][n.y] = false ; countMove++; return true ; } }
return false ; // 触到边线,失败 }
public void run() { running = true ; while (running) { try {
Thread.sleep(timeInterval); } catch (Exception e) { break ; }
if (!paused) {
if (moveOn()) {
setChanged(); // Model通知View 数据已经更新
notifyObservers(); } else { i nt result=JOptionPane.showConfirmDialog(null , "OH, 你死啦, 需要重新開始么?" , "Game Over", JOptionPane.OK_CANCEL_OPTION); i f (result==0){ reset(); } e lse { break ; } } } }
running = false ; }
private Node createFood() { int x = 0; int y = 0; // 随机获取一个有效区域内的与蛇体和食物不重叠的位置 do {
Random r = new Random(); x = r.nextInt(maxX); y = r.nextInt(maxY); } while (matrix[x][y]); return new Node(x, y); }
public void speedUp() {
timeInterval *= speedChangeRate; }
public void speedDown() {
timeInterval /= speedChangeRate; }
public void changePauseState() { paused = !paused; }
public String toString() { String result = "" ;
for (int i = 0; i
result += "[" + n.x + "," + n.y + "]"; }
return result; } }
class Node { int x; int y;
Node(int x, int y) { this .x = x; this .y = y; }
}
SnakeView:视图类
import javax.swing.*; import java.awt.*;
import java.util.Iterator; import java.util.LinkedList;
import java.util.Observable; import public class SnakeView implements Observer { SnakeControl control = null ; SnakeModel model = null ;
JFrame mainFrame ; Canvas paintCanvas ; JLabel labelScore ;
public static final int canvasWidth = 200; public static final int canvasHeight = 300;
public static final int nodeWidth = 10; public static final int nodeHeight = 10;
public SnakeView(SnakeModel model, SnakeControl control) { this . model = model;
this . control = control;
mainFrame = new JFrame("GreedSnake" ); mainFrame .setLocation(600, 200);
Container cp = mainFrame .getContentPane();
// 创建顶部的分数显示
labelScore = new JLabel(" 得分:");
cp.add(labelScore , BorderLayout.NORTH );
// 创建中间的游戏显示区域
paintCanvas = new Canvas();
paintCanvas .setSize(canvasWidth + 1, canvasHeight + 1); paintCanvas .addKeyListener(control);
cp.add(paintCanvas , BorderLayout.CENTER ); // 创建底下的帮助栏
JPanel panelButtom = new JPanel();
panelButtom.setLayout(new BorderLayout()); JLabel labelHelp;
labelHelp = new JLabel("PageUp :加速, PageDown:减速" , JLabel. LEFT );
panelButtom.add(labelHelp, BorderLayout.NORTH ); labelHelp = new JLabel("ENTER :重新开始" , JLabel.LEFT );
panelButtom.add(labelHelp, BorderLayout.CENTER );
labelHelp = new JLabel("SPACE :暂停" , JLabel.LEFT ); panelButtom.add(labelHelp, BorderLayout.SOUTH ); cp.add(panelButtom, BorderLayout.SOUTH );
mainFrame .addKeyListener(control); mainFrame .pack();
mainFrame .setResizable(false );
mainFrame .setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); mainFrame .setVisible(true ); }
void repaint() {
Graphics g = paintCanvas .getGraphics();
//draw background
g.setColor(Color.WHITE );
g.fillRect(0, 0, canvasWidth , canvasHeight );
// draw the snake
g.setColor(Color.BLACK );
model . nodeArray ; while (it.hasNext()) {
Node n = (Node) it.next(); drawNode(g, n); }
// draw the food
g.setColor(Color.RED );
}
Node n = model . food ; drawNode(g, n); updateScore(); }
private void drawNode(Graphics g, Node n) { g.fillRect(n.x * nodeWidth , n.y * nodeHeight , nodeWidth - 1, nodeHeight - 1); }
public void updateScore() {
String s = " 得分: " + model . score ; labelScore .setText(s); }
public void update(Observable o, Object arg) { repaint(); }
2.系统设计(Design of Collective)
2.1 体系结构设计(Design of Architecture)
采用包图画出体统的体系结构模型,然后进行扩展,画出个子系统内构成及模块之间的关系。
2.2 模块设计(Module Design)
对象类用类图说明各个类属性和方法以及类之间的关系,对于复杂对象要画出状态图。
2.3 功能模块清单(Module List)
模块(类)清单
表3-3 模块清单
五、软件测试计划
完成人:
1引言 1.1编写目的
本测试计划文档作为指导此测试项目循序渐进的基础,帮助我们安排合适的资源和进度,避免可能的风险。本文档有助于实现以下目标:
1) 确定现有项目的信息和应测试的软件结构。 2) 列出推荐的测试需求
3) 推荐可采用的测试策略,并对这些策略加以详细说明 4) 确定所需的资源,并对测试的工作量进行估计。
5) 列出测试项目的可交付元素,包括用例以及测试报告等。 1.2背景
软件系统名称:贪吃蛇游戏
该开发项目的历史:蛇引诱夏娃吃了苹果之后,就被贬为毒虫,阴险的象征。
而蛇吃东西是整只动物吞进去的,大概在文艺复兴的时候就有人发明的一种游戏,是现在贪吃蛇的前身。
该软件由测试小组的人员根据该文档执行此项目的测试任务。在开始执行本测试计划之前应实现游戏的基本功能,有完整的需求分析说明书,概要设计说明书,和详细设计说明书。 1.3定义
节:
一条蛇可以看成由许多正方形的“小格子”拼凑成,称作节。节是蛇
身上最小的单位。
链表:
用来保存每一段的状态,链表的元素单位是节。且链表的第一个元素
表示蛇的头部。
坐标系:
以左上角那点为(0,0),向右则x 递增,向下则y 递增。
1.4参考资料
张海藩:《软件工程导论》第五版 清华大学出版社 肖刚等:《实用软件文档写作》 清华大学出版社 2计划
2.1说明
2.2测试内容
名称标识符:功能测试
进度安排:开始时间:2014-4-13 8:00 结束时间:2014-4-1312:00
内容:对游戏的开始新游戏、暂停、继续、退出、查看历史成绩、计时、
统计分数的7种功能进行测试,并测试程序的鼠标点击事件及按键响应事件。 2.3测试1(标识符)
2.3.2条件
本项测试工作对资源的要求:
设备:硬件最低要求:CPU PII以上PC 服务器。支持Windows98以上的操作系统。
软件:JVM ,Eclipse
2.3.3测试资料
● 贪吃蛇游戏的源代码
● 所在的媒体:Eclipse 工具
● 测试的输入输出举例:输入即按钮的选择或者快捷键、方
向键;输出即蛇的移动、游戏时间、分数等信息。
● 测试方法:白盒测试,黑盒测试 ● 测试过程:
2.3.4测试培训
培训内容:贪吃蛇游戏软件的使用
受训人员:参加测试的用户及开发任务组的人员
从事培训的工作人员:研发小组的人员 3测试设计说明书
3.1测试1(标识符)
控制
● 输入:人工输入
● 操作的顺序:第一次操作必须从NewGame 开始,游戏尚
未结束不能Exit ,也不能NewGanme ,选择Pause 后可以Resume ,可以Exit ,如果Pause 后Exit ,下次再运行程序时可以从Resume 开始。
● 记录结果方法:记录用户输入的控制命令,蛇、食物、
石头的状态、时间、分数。
4评价准则
1.范围
本系统测试的主要内容为功能测试,界面测试 2.数据整理
由于系统规模较小,所以,我们采用手工方式将测试数据加工成便于评价的适当的形式。 3. 尺度
能正确完成功能要求。 测试用例正确执行,由于系统的输出除时间和分数外没有什么精确的数字,所以要求输出与预期的输出结果完全一致。
六、软件测试分析报告
完成人:1引言
1.1编写目的
本测试分析报告是项目测试组成员按照测试计划测试贪吃蛇游戏的运行性能,对所测试的结果和数据进行汇总,反映测试情况的报告。 1.2背景
说明:
a. 软件系统名称: 贪食蛇游戏 b. 任务提出者: 软件2班
c. 开发者: 软件2班317寝室团队 d. 使用者: 广大的游戏玩家
1.3定义
Configuration :
中文意思是配置。它定义了硬件所必须具备的能力。
CLDC :
全称是Connected Limited Devices Configuration ,中文意思是有限制连接设备配置。它是在Configuration 基础上定义的Java 的核心类库和虚拟机。
Profile :
中文意思是简表,它是在Configuration 之上的规范。简表针对不同器的特性定义了高级的API(应用程序接口) 。
MIDP :
全称是Mobile Information Device Profile 。它是针对移动设备定义的 Profile 。
MIDlet :
MIDlet 是在MIDP 中定义的一种应用程序框架,它是被应用管理软件(AMS)管理
的。MIDlet 是在支持MIDP 规范的移动信息设备上运行的应用程序,MIDlet 不是一个单独的文件,而是一个文件的集合,它除了必须包含一个继承自javax.microedition.midlet.MIDlet 的类之外,还包括此类执行时间所需的其他类和资源文件(只要是非class 文件都成为资源文件) 。 1.4参考资料
本模块功能测试请参考《软件测试计划》,《用户操作手册》和本章。并参考《软件工程》一书,运用白盒法与黑盒法相结合进行测试。
2测试概要
3测试结果及发现
3.1测试1(标识符)
经测试,所以按键都能正常被监听,并完成他的功能
4分析摘要
5.1能力
该游戏能正常运行,可以在业余时间娱乐,放松心情 5.2缺陷和限制
该游戏是简单的贪食蛇游戏,缺陷在于还不够人性化,没有关卡模式,没有计时等多项功能。 5.3评价
总上,通过测试,软件已经达到我们的预期目标,可以交付使用,请广大玩家尽情去玩。
6测试资源消耗
七、软件项目开发总结报告
完成人:1引言
1.1编写目的
为了总结报告在工作工程中产生的问题、行到经验,并且总结报告设计和制作者过程中的逻辑和想法。 1.2背景
项目名称:贪食蛇游戏
开发背景:通过开发此软件的过程,提高用软件员工程序分析问题、解决问题的能力,增强对Java 和数据的使用能力,同时了解各种文档的标准编写方式。 1.3定义
NewGame :开始游戏 SnakeControl :监听控制
SnakeModel :游戏内的数据对象初始化 1.4参考资料
1.Java 从入门到精通 魔乐科技(MLDN )软件实训中心 编著/2010-04-01/人民邮电出版社
2.Java 编程思想(第4版) 2007-06-01/机械工业出版社
3. 轻量级Java EE企业应用实战(第3版)李刚 编著/2012-04-01/电子工业出版社 4. 疯狂Java 讲义(第2版) 李刚 编著/2012-01-01/电子工业出版社 5.Java 语言程序设计:基础篇(第8版) (美)梁勇 著,李娜 译/2011-06-01/机械工业出版社
6.Effective Java中文版(第2版) (美)布洛克 著,杨春花,俞黎敏 机械工业出版社
2实际开发结果
2.1产品
产品名称:贪食蛇游戏
产品功能:能正常运行贪食蛇游戏,能对蛇的速度进行加速和减速 2.2主要功能和性能
详细参加《需求规格说明书》 2.3基本流程
用图给出本程序系统的实际的基本的处理流程。 2.4进度
按照原定计划进行 2.5费用
无费用
3开发工作评价
3.1对生产效率的评价
实际生产时间:1周
平均每使用小时数:3小时 3.2对产品质量的评价
产品质量较好,在测试过程中相对来说稳定,但是由于功能还不够完善,不适合大规模推广普及。 3.3对技术方法的评价
在开发过程中,组员们严格按照开发阶段行事,掌握了整个开发流程,但是由于部分组员有技术问题,还需要更加的磨合,增强相关技术知识。 3.4出错原因的分析
1、对于程序员设计不够科学,对于设计师语言的掌握不够了解。 2、由于没有大量的时间来制作,功能还不够完善。
3、小组人员沟通不足,协调出现了些问题,但都能很好的按时解决
4经验与教训
经过这段时间开发过程,组员们了解了软件工程序的具体涵义,熟悉了开发流程,也 撑握了软件文档的编写标准,学到了很多以前没有了解到的知识,但是由于时间不够充裕,功能没能够完善,组员之间的交流不够,个人技术问题不足,还希望之后能增强个人技术知识。总体来说,学到的知识都是很值得珍惜的。
41