资源描述
软件测试小论文
题目:五子棋开发和测试
班 级: 12计算机科学和技术特色本(2)班
小组组员: 刘文志(18)、刘学(19)、朱和中 (51)
完成日期: .4.18
指导老师: 钱 丽
摘 要
五子棋游戏不仅能增强思维能力,提升记忆力,而且富含哲理,有利于修身养性。现有“场”概念,亦有“点”连接,是古今哲理结晶。所以,开发出一款简单实用单机版五子棋软件很有意义。
本论文分析了五子棋游戏游戏规则,设计了游戏算法,并选择eclipse作为该软件开发平台,实现了五子棋多个对战模式,既可人和人对战,也可人和电脑对战。还实现了,自定义棋盘行列数。
本文将从开发环境安装,到五子棋功效分析和设计,到各功效模块实现,逐步向您展现五子棋实现过程。经测试,本游戏系统功效齐全,能平稳运行,含有较强使用价值。
关键词:五子棋;思索算法;多人对战;人机对战;
目 录
1.引言 1
1.1编写目标 1
1.2背景 1
2.单机版五子棋系统介绍 2
2.1平台介绍 2
2.2游戏概述 2
3.基于Java五子棋游戏设计 3
3.1游戏模块 3
3.1.1 开局、退出、棋盘 3
3.1.2 模式栏 4
3.2游戏步骤图 4
4.软件测试 5
4.1测试目标 5
4.2测试方法 5
4.3白盒测试 6
4.3.1测试用例 7
4.4黑盒测试 10
4.5测试游戏存在问题 12
4.6游戏不足处理方案 12
4.6.1游戏改善后代码 12
4.7回归测试 13
5.总结 15
参考文件 16
附录 17
1.引言
1.1编写目标
依据测试计划汇报,对软件进行测试,具体统计测试过程,以对软件质量进行评价,为软件设计人员提供BUG依据,故做产生测试分析汇报。
1.2背景
为了使游戏愈加完善,使玩家有愈加好游戏体验,针对游戏出现部分问题,做出修复,使游戏愈加生动,符合玩家游戏习惯。
2.单机版五子棋系统介绍
2.1平台介绍
Eclipse 是一个开放源代码、基于Java可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于经过插件组件构建开发环境。幸运是,Eclipse 附带了一个标准插件集,包含Java开发工具(Java Development Kit,JDK)。
2.2游戏概述
该游戏软件采取 Java 语言设计,在 Windows 系统为玩家提供五子棋游戏人 机对战基础功效。玩家能够经过鼠标在棋盘对应位置下子,一方为白色,另 一方为黑色,先下为黑子(主场)。游戏过程中,只要有一人先连成五个棋子, 不管横、竖或斜,就会在屏幕上显示是谁赢了比赛,也能够是平局收场,从而可 以进行下一场比赛。在比胜过程中,假如一方需要悔棋,先得经过对手同意才能够。
3.基于Java五子棋游戏设计
本项目中五子棋关键包含两大关键模块,以下图3.1(a)所表示。第一个模块为关键模块,用于实现五子棋游戏功效。第二个模块为辅助模块,用于实现五子棋相关辅助设置。游戏主界面图3.1(b)。
五子棋游戏
视图帮助块
游戏模块
图3.1(a) 关键模块
图3.1(b)游戏主界面
3.1游戏模块
该模块实现游戏关键功效,共包含两个小模块,以下图3.2(a)所表示。第一个模块为棋盘栏,实现游戏玩家点击下棋功效。第二个小模块为模式栏,对下棋方法进行选择。游戏菜单图3.2(b)所表示。
游戏模块
模式栏
开局、退出、棋盘栏
图3.2(a) 游戏模块
图3.2(b) 游戏菜单
3.1.1 开局、退出、棋盘
实现可视化开局和退出功效,和棋盘选择对战模式。
图3.3 开局、退出、棋盘
3.1.2 模式栏
模式栏,关键实现游戏过程中多种控制功效,包含人人、人机实例化对战模式。
图3.4 模式选择
是
电脑下子
电脑是否下子
是
电脑下子
电脑是否下子
否
游戏结束
是
白子或黑子是否有5个连成一线
否
游戏者是否下子
否
游戏者下子
模式选择
开局
3.2游戏步骤图
4.软件测试
4.1测试目标
软件测试是为了发觉错误而实施程序过程。或说,软件测试是依据软件开发各阶段规格说明和程序内部结构而精心设计一批测试用例{即输入数据及其预期输出结果},并利用这些测试用例去运行程序,以发觉程序错误过程。设计测试目标是想以最少时间和人力,系统地找出软件中潜在多种错误和缺点。假如成功地实施了测试,就能够发觉软件中错误。测试附带收获是,它能够证实软件功效和性能和需求说明相符合。另外,实施测试搜集到测试结果数据为可靠性分析提供了依据。而测试目标就是在软件投入生产性运行之前,尽可能地发觉软件中错误。
4.2测试方法
常见软件测试阶段工作关键分为单元测试、集成测试、确定测试和系统测试四个步骤,测试方法有黑盒测试和白盒测试两种方法:黑盒测试(已经知道产品应该含有功效,能够经过测试来检验是否每个功效全部正常);白盒测试(假如知道产品内部工作过程,能够经过测试来检验内部动作是否根据说明书要求正常进行)。
本游戏测试关键方法包含黑盒测试和白盒测试,由小组人员经过自己亲自去玩,然后观察游戏在运行过程中,所需要实现功效有没有实现,和在测试过程中有没有发觉新问题统计在案。然后依据测试后所产生一系列问题,有本组负责编码人员对游戏进行改善,然后在进行测试,就这么反复进行这么工作,直到游戏运行和预想时情况基础一致时,才算经过测试。
图4.1 完整游戏图
4.3白盒测试
经过程序源代码进行测试而不使用用户界面。这种类型测试需要从代码句法发觉内部代码在算法,溢出,路径,条件等等中缺点或错误,进而加以修正,这一方法是把测试对象看作一个打开盒子,测试人员依据程序内部逻辑结构相关信息,设计或选择测试用例,对程序全部逻辑路径进行测试,经过在不一样点检验程序状态,确定实际状态是否和预期状态一致。用软件白盒测试产生测试用例能够:
1.确保一个模块中全部独立路径最少被使用一次;
2.对全部逻辑值均需测试true和false;
3.在上下边界及可操作范围内运行全部循环;
4.检验内部数据结构以确保其有效性。
4.3.1测试用例
(1)用例1:
因为类ChessFrame关键功效是创建五子棋游戏主窗体,所以对其进行测试,看其结构五子棋游戏主窗体方法是否正确。
class ChessFrame extends JFrame implements ActionListener {
private String[] strsize={"20x15","30x20","40x30"};
private String[] strmode={"人机对弈","人人对弈"};
public static boolean iscomputer=true,checkcomputer=true;
private int width,height;
private ChessModel cm;
private MainPanel mp;
public ChessFrame() {
this.setTitle("五子棋游戏");
cm=new ChessModel(1);
mp=new MainPanel(cm);
Container con=this.getContentPane();
con.add(mp,"Center");
this.setResizable(false);
this.addWindowListener(new ChessWindowEvent());
MapSize(20,15);
JMenuBar mbar = new JMenuBar();
this.setJMenuBar(mbar);
JMenu gameMenu = new JMenu("游戏");
mbar.add(makeMenu(gameMenu, new Object[] {
"开局", "棋盘","模式", null, "退出"
}, this));
JMenu lookMenu =new JMenu("视图");
mbar.add(makeMenu(lookMenu,new Object[] {
"Metal","Motif","Windows"
},this));
JMenu helpMenu = new JMenu("帮助");
mbar.add(makeMenu(helpMenu, new Object[] {
"相关"
}, this));
}
(2)用例2:
用play(int x,int y)方法实现电脑下子,并先经过方法readyplay(int x,int y)判定某坐标位置是否可下棋子。
public void readyplay(int x,int y){
if(badxy(x,y))
return;
if (chessExist(x,y))
return;
this.arrMapShow[x][y]=3;
}
public void play(int x,int y){
if(badxy(x,y))
return;
if(chessExist(x,y)){
this.isExist=true;
return;
}else
this.isExist=false;
if(getisOdd()){
setisOdd(false);
this.arrMapShow[x][y]=1;
}else{
setisOdd(true);
this.arrMapShow[x][y]=2;
}
}
(3)用例3:
计算机走棋方法(computerDo)测试
经过方法 computerDo实现电脑下子思想
public void computerDo(int width,int height){
int max_black,max_white,max_temp,max=0;
setisOdd(true);
System.out.println("计算机走棋 ...");
for(int i = 0; i <= width; i++){
for(int j = 0; j <= height; j++){
if(!chessExist(i,j)){
max_white=checkMax(i,j,2);
max_black=checkMax(i,j,1);
max_temp=Math.max(max_white,max_black);
if(max_temp>max){
max=max_temp;
this.x=i;
this.y=j; }}}}
(4)用例4:
依据提供棋子信息(颜色、坐标)画棋子方法( draw)测试
public void draw(Graphics g, int i, int j, int v){
int x = 20 * i+20;
int y = 20 * j+20;
//画棋盘
if(i!=width && j!=height){
g.setColor(Color.white);
g.drawRect(x,y,20,20);
}
//画黑色棋子
if(v == 1 ){
g.setColor(Color.gray);
g.drawOval(x-8,y-8,16,16);
g.setColor(Color.black);
g.fillOval(x-8,y-8,16,16);
}
//画白色棋子
if(v == 2 ){
g.setColor(Color.gray);
g.drawOval(x-8,y-8,16,16);
g.setColor(Color.white);
g.fillOval(x-8,y-8,16,16);
}
if(v ==3){
g.setColor(Color.cyan);
g.drawOval(x-8,y-8,16,16);
}
}
(5)用例5:
响应鼠标点击事件,结构方法(mousePressed)实现鼠标点击来实现下棋动作。
public void mousePressed(MouseEvent evt){
int x = (evt.getX()-10) / 20;
int y = (evt.getY()-10) / 20;
System.out.println(x+" "+y);
if (evt.getModifiers()==MouseEvent.BUTTON1_MASK){
cm.play(x,y);
System.out.println(cm.getisOdd()+" "+cm.getarrMapShow()[x][y]);
repaint();
if(cm.judgeSuccess(x,y,cm.getisOdd())){
cm.showSuccess(this);
evt.consume();
ChessFrame.iscomputer=false;
}
(6)用例6:
结构方法judgeSuccess(int x,int y,boolean isodd)对目前棋子各个位置判定来得出是否胜败。
public boolean judgeSuccess(int x,int y,boolean isodd){
int num=1;
int arrvalue;
int x_temp=x,y_temp=y;
if(isodd)
arrvalue=2;
else
arrvalue=1;
int x_temp1=x_temp,y_temp1=y_temp;
4.4黑盒测试
软件黑盒测试也是软件测试关键方法之一,也能够称为功效测试、数据驱动测试或基于规格说明测试。测试者不了解程序内部情况,只知道程序输入、输出和系统功效,这是从用户角度针对软件界面、功效及外部结构进行测试,而不考虑程序内部逻辑结构。
软件黑盒测试法重视于测试软件功效需求,关键试图发觉下列几类错误:
1)功效不正确或遗漏;
2)界面错误;
3)数据库访问错误;
4)性能错误;
5)初始化和终止错误等。
测试方法能够分为以下多个:等价类划分法、边界值分析法、错误推测法、因果图法、判定表驱动法、正交试验设计法、功效图法等。
从理论上讲,软件黑盒测试只有采取穷举输入测试,把全部可能输入全部作为测试情况考虑,才能查出程序中全部错误。实际上测试情况有没有穷多个,大家不仅要测试全部正当输入,而且还要对那些不正当但可能输入进行测试。这么看来,完全测试是不可能,所以我们要进行有针对性测试,经过制订测试案例指导测试实施,确保软件测试有组织、按步骤,和有计划地进行。软件黑盒测试行为必需能够加以量化,才能真正确保软件质量,而测试用例就是将测试行为具体量化方法之一。
五子棋游戏测试用例以下表所表示:
用例
操作
预期结果
实际结果
用例1
能否在不一样版本eclipese中运行该游戏
游戏能够在设计该游戏
版本及以上中正常运行
Pass
用例2
运行时能否正常显示主
界面
运行时能正常显示主
界面
Pass
用例3
鼠标单击菜单—开始,是否能够运行游戏
能够运行游戏
Pass
用例4
鼠标单击棋盘,是否会有棋子落于该位置
棋子落于鼠标单击位置
Pass
用例5
当人下子出现“活三”、“冲四”,电脑是否会下子堵截
电脑会下子阻挡
Pass
用例6
数次游戏测试:在人(黑棋)没有出现“活三”、“冲四”情况下,电脑(白棋)落子是否存在规律
黑棋没有出现“活三”、
“冲四”情况下,电脑
(白棋)随机落子,不存
在规律
Pass
用例7
进行对战时,根据规则下棋能否正常输赢
能够正常输赢
Pass
用例8
判定在横线上5子能否取得胜利
能够
Pass
用例9
判定在竖线上5子能否取得胜利
能够
Pass
用例10
判定在斜线上5子能否取得胜利
能够
Pass
4.5测试游戏存在问题
1.经过小组以外人员游戏测试发觉,因为棋盘大小问题,使得可能造成有时棋子满格也没有分出胜败,这么,就极难显示博弈者水平。
2.小组以外人员游戏测试后提议认为,我们所设计五子棋游戏只能实现人机博弈,不能实现人和人之间博弈,这么极难让更多人一展她们高超棋艺。
4.6游戏不足处理方案
1.经过对后台代码修改实现对游戏棋盘大小规格控制选择,新添规格30*20格和40*30格模式,让博弈者尽展各自高超棋艺。
2.在人机对战基础上新增人人对战模式,以方便人和人之间棋艺博弈乐趣让更多爱好五子棋玩家参与进来。
4.6.1游戏改善
1. 在菜单中新加棋盘选项,再在模式中新增规格30*20格和40*30格模式
实现代码以下:
public ChessModel(int modeChess){
this.isOdd=true;
if(modeChess == 1){
PanelInit(20, 15, modeChess); }
if(modeChess == 2){
PanelInit(30, 20, modeChess); }
if(modeChess == 3){
PanelInit(40, 30, modeChess);}}
private void PanelInit(int width, int height, int modeChess){
this.width = width;
this.height = height;
this.modeChess = modeChess;
arrMapShow = new int[width+1][height+1];
for(int i = 0; i <= width; i++){
for(int j = 0; j <= height; j++){
arrMapShow[i][j] = -5;
}
}
}
2在菜单中新加模式选项,新增人人对战模式
if(arg.equals("人人对弈")){
this.checkcomputer=false;
this.iscomputer=false;
cm=new ChessModel(cm.getModeChess());
MapSize(cm.getWidth(),cm.getHeight());
SwingUtilities.updateComponentTreeUI(this);
}
4.7回归测试
对修改后游戏版本实施回归测试
用例
操作
预期结果
测试结果
用例1
选择不一样规格棋盘,能否正常运行
能正常运行
Pass
用例2
选择人人对战,能否正常运行
能正常运行
Pass
用例3
选择不一样规格棋盘,对其它功效正常运行是否产生影响
没有影响
Pass
用例4
选择人人对战模式,对其它功效正常运行是否产生影响
没有影响
Pass
5.总结
在测试阶段,一系列测试方案全部是为了“破坏”已经建造好软件系统而特地设计,它存在是为了尽力证实程序中错误不能根据预定要求正确工作。软件测试从不一样角度出发会派生出两种不一样测试标准,从用户角度出发,就是期望经过软件测试能充足暴露软件中存在问题和缺点,从而考虑是否能够接收该产品,从开发者角度出发,就是期望测试能表明软件产品不存在错误,已经正确地实现了用户需求,确立大家对软件质量信心。
经过此次软件测试课程设计,深刻学习掌握了软件测试和软件测试过程基础方法和基础技术,相关黑盒、白盒测试用例设计,也进行了认真学习研究,从而深入提升了自己在程序上编写能力,和部分之前未触及问题。
总而言之,收获颇丰,增强了自己动手和团体合作能力。付出才会有回报,实践才能出真知。为立即踏上社会自己又做了一份理论和实践准备。
参考文件
[1] 谢希仁. 计算机网络(第五版)[M]. 北京:电子工业出版社,2月
[2] 胡小强 计算机网络[M] 北京:北京邮电大学出版社1月
[3] 刘群策 LoadRunner和软件项目性能测试 [M] 机械工业出版社
[4] 朱少民 软件测试方法和技术 [M] 清华大学出版社
[5] 郑人杰 软件测试 [M] 人民邮电出版社
附录
//Java编程:五子棋游戏源代码
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
import javax.swing.*;
import java.io.PrintStream;
import javax.swing.JComponent;
import javax.swing.JPanel;
/*
*main方法创建了ChessFrame类一个实例对象(cf),
*并开启屏幕显示显示该实例对象。
**/
public class FiveChessAppletDemo {
public static void main(String args[]){
ChessFrame cf = new ChessFrame();
cf.show();
}
}
/*
*类ChessFrame关键功效是创建五子棋游戏主窗体和菜单
**/
class ChessFrame extends JFrame implements ActionListener {
private String[] strsize={"20x15","30x20","40x30"};
private String[] strmode={"人机对弈","人人对弈"};
public static boolean iscomputer=true,checkcomputer=true;
private int width,height;
private ChessModel cm;
private MainPanel mp;
//结构五子棋游戏主窗体
public ChessFrame() {
this.setTitle("五子棋游戏");
cm=new ChessModel(1);
mp=new MainPanel(cm);
Container con=this.getContentPane();
con.add(mp,"Center");
this.setResizable(false);
this.addWindowListener(new ChessWindowEvent());
MapSize(20,15);
JMenuBar mbar = new JMenuBar();
this.setJMenuBar(mbar);
JMenu gameMenu = new JMenu("游戏");
mbar.add(makeMenu(gameMenu, new Object[] {
"开局", "棋盘","模式", null, "退出"
}, this));
JMenu lookMenu =new JMenu("视图");
mbar.add(makeMenu(lookMenu,new Object[] {
"Metal","Motif","Windows"
},this));
JMenu helpMenu = new JMenu("帮助");
mbar.add(makeMenu(helpMenu, new Object[] {
"相关"
}, this));
}
//结构五子棋游戏主菜单
public JMenu makeMenu(Object parent, Object items[], Object target){
JMenu m = null;
if(parent instanceof JMenu)
m = (JMenu)parent;
else if(parent instanceof String)
m = new JMenu((String)parent);
else
return null;
for(int i = 0; i < items.length; i++)
if(items[i] == null)
m.addSeparator();
else if(items[i] == "棋盘"){
JMenu jm = new JMenu("棋盘");
ButtonGroup group=new ButtonGroup();
JRadioButtonMenuItem rmenu;
for (int j=0;j<strsize.length;j++){
rmenu=makeRadioButtonMenuItem(strsize[j],target);
if (j==0)
rmenu.setSelected(true);
jm.add(rmenu);
group.add(rmenu);
}
m.add(jm);
}else if(items[i] == "模式"){
JMenu jm = new JMenu("模式");
ButtonGroup group=new ButtonGroup();
JRadioButtonMenuItem rmenu;
for (int h=0;h<strmode.length;h++){
rmenu=makeRadioButtonMenuItem(strmode[h],target);
if(h==0)
rmenu.setSelected(true);
jm.add(rmenu);
group.add(rmenu);
}
m.add(jm);
}else
m.add(makeMenuItem(items[i], target));
return m;
}
//结构五子棋游戏菜单项
public JMenuItem makeMenuItem(Object item, Object target){
JMenuItem r = null;
if(item instanceof String)
r = new JMenuItem((String)item);
else if(item instanceof JMenuItem)
r = (JMenuItem)item;
else
return null;
if(target instanceof ActionListener)
r.addActionListener((ActionListener)target);
return r;
}
//结构五子棋游戏单选按钮式菜单项
public JRadioButtonMenuItem makeRadioButtonMenuItem(
Object item, Object target){
JRadioButtonMenuItem r = null;
if(item instanceof String)
r = new JRadioButtonMenuItem((String)item);
else if(item instanceof JRadioButtonMenuItem)
r = (JRadioButtonMenuItem)item;
else
return null;
if(target instanceof ActionListener)
r.addActionListener((ActionListener)target);
return r;
}
public void MapSize(int w,int h){
setSize(w * 20+50 , h * 20+100 );
if(this.checkcomputer)
this.iscomputer=true;
else
this.iscomputer=false;
mp.setModel(cm);
mp.repaint();
}
public boolean getiscomputer(){
return this.iscomputer;
}
public void restart(){
int modeChess = cm.getModeChess();
if(modeChess <= 3 && modeChess >= 1){
cm = new ChessModel(modeChess);
MapSize(cm.getWidth(),cm.getHeight());
}else{
System.out.println("\u81EA\u5B9A\u4E49");
}
}
public void actionPerformed(ActionEvent e){
String arg=e.getActionCommand();
try{
if (arg.equals("Windows"))
UIManager.setLookAndFeel(
"com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
else if(arg.equals("Motif"))
UIManager.setLookAndFeel(
"com.sun.java.swing.plaf.motif.MotifLookAndFeel");
else
UIManager.setLookAndFeel(
"javax.swing.plaf.metal.MetalLookAndFeel" );
SwingUtilities.updateComponentTreeUI(this);
}catch(Exception ee){}
if(arg.equals("20x15")){
this.width=20;
this.height=15;
cm=new ChessModel(1);
MapSize(this.width,this.height);
SwingUtilities.updateComponentTreeUI(this);
}
if(arg.equals("30x20")){
this.width=30;
this.height=20;
cm=new ChessModel(2);
MapSize(this.width,this.height);
SwingUtilities.updateComponentTreeUI(this);
}
if(arg.equals("40x30")){
this.width=40;
this.height=30;
cm=new ChessModel(3);
MapSize(this.width,this.height);
SwingUtilities.updateComponentTreeUI(this);
}
if(arg.equals("人机对弈")){
this.checkcomputer=true;
this.iscomputer=true;
cm=new ChessModel(cm.getModeChess());
MapSize(cm.getWidth(),cm.getHeight());
SwingUtilities.updateComponentTreeUI(this);
}
if(arg.equals("人人对弈")){
this.checkcomputer=false;
this.isco
展开阅读全文