网络象棋游戏的开发及测试_第1页
网络象棋游戏的开发及测试_第2页
网络象棋游戏的开发及测试_第3页
网络象棋游戏的开发及测试_第4页
网络象棋游戏的开发及测试_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、武汉理工大学华夏学院课程设计报告书课程名称: 软件测试综合设计 题 目: 网络象棋游戏的开发及测试 系 名: 信息工程系 专业班级: 软件1091 姓 名: 学 号: 指导教师: 司晓梅、钱小红 2013 年 1 月 4 日课程设计任务书学生姓名: 专业班级: 软件1091 指导教师: 司晓梅 工作单位: 信息工程系 设计题目:网络象棋游戏的开发及测试初始条件:jdk1.5+eclipse(netbeans)要求完成的主要任务:用Java语言实现一个网络象棋游戏软件,并对实现后的软件进行测试。要求按照IEEE标准模板给出具体的测试计划书、软件的黑盒测试用例规格说明,并按照测试用例进行测试,提交

2、缺陷报告。提示:IEEE标准测试文档模板可以参阅人民邮电出版社佟伟光主编的教材软件测试 设计报告撰写格式要求:1设计题目与要求2 设计思想3系统结构 4 数据结构的说明和模块的算法流程图 5 使用说明书(即用户手册)、运行结果、关键界面截图6 测试计划说明书、测试用例规格说明、缺陷报告7 自我评价与总结8 附录:程序清单,注意加注释(包括关键字、方法、变量等),在每个模块前加注释;时间安排 12月24日12月29日完成网络象棋游戏的开发、系统的打包和验收;1月2 日1月4日完成测试计划、测试用例的设计、测试缺陷报告的写作,并将以上工作整理成为课程设计报告,于1月4日下午提交课程设计报告。指 导

3、 教 师 签 字: 2012年 12月 15日系 主 任 签 字: 2012年 12月 16日 1 设计题目与要求1.1设计题目网络象棋游戏的开发及测试1.2设计要求 用Java语言实现一个网络象棋游戏软件,并对实现后的软件进行测试。使用的开发环境是:JDK1.5及MyEclipse。黑方先走或红方先走都可。要求给每个棋子定义标准的走法规则。红黑方对弈。写出各个棋子走法的测试用例。2 设计思想首先在画布上确定位置画出棋盘。象棋是双方在有着9条竖线和10条横线的棋盘上对弈,对弈的竖线与横线的交叉点称做棋点,每个棋子都是在棋点上行走而不是在方格中行走河界将棋盘分成两个等份。每一边都有一块由9个点组

4、成的九宫棋子。将、帅、士只能在九宫内移动,并且将帅每一步只可以水平或垂直移动一个棋点。士(仕),它只能在九宫内移动,并且它每一步只可以沿对角线方向移动一个棋点;象(相),它必须一步沿对角线方向走两个棋点,但它既不能过河,也不能跳过或穿越障碍,即象在走的过程中不能被别眼;马(馬),每一步只可以水平或垂直移动一个棋点,但必须按对角线方向,向左或右移动,象棋的马不能跳过障碍,即在走的过程中不能被别腿;车(車),可以水平或垂直方向移动任意个无阻碍的点;炮,移动起来和车很类似,但它必须跳过一个棋子来吃掉对方的一个棋子,被跳过的那个棋子称为桥或者屏风;兵(卒),每步只能向前移动一个棋点,过河以后,它便增加

5、了向左右移动的能力,兵不允许向后移动。画出10条横线和9条竖线形成90个正方形(边长为50)的小方格,4条对角线构成帅和将的九方格。一个和棋盘背景颜色相同的填充矩形形成红黑方的分界。然后画出棋子。首先定义棋子,用一个二维数组来初始化这些棋子。即用二维数组的值来表示棋子,如果为0,表示没有棋子;1-7表示黑方的("車","馬","象","仕","将","炮","卒");8-14表示红方的("车","马","相

6、","士","帅","炮","兵")。然后画棋子,两层for循环遍历棋盘中每个交叉的点,在每个点上画出适当的圆,根据初始化二维数组的对应的行和列的值来显示相应的棋子。即根据条件判断,等于0的没有棋子,在1-7之见的分别显示黑方的("車","馬","象","仕","将","炮","卒"),在8-14之间的分别显示红方的("车","马&quo

7、t;,"相","士","帅","炮","兵")。移动棋子。其实就是监听了鼠标点击相应事件,先选棋子,通过点击了某一个有效的棋子区域,就将该点转化为棋子所在的行和列,再点击其他的有效区域,将先前的棋子的值复值给新的区域的值,并将原来的区域的值改为0,最后再调用repaint(),就实现了棋子的移动效果了。3 系统结构 系统结构流程图运行主函数 temp=0temp=0 or temp=1?temp=0 temp=1红方选子黑方选子temp=0temp=1黑方走子红方走子吃帅?吃将?No NoYes

8、 Yes结束结束图3-1 系统结构流程图4 数据结构的说明和模块的算法流程图 4.1象棋游戏主要模块 4.1.1主窗口模块 Chess.java 该java 文件的类负责创建中国象棋的"主窗口",该文件含有 main 方法,程序从该类开始执行。 4.1.2棋盘模块 ChessBoard.java 该文件生成的类负责创建"对弈棋盘"对象,用户可以用鼠标拖动棋盘上棋子进行对弈,当松开鼠标时将棋子固定到棋点,该棋盘使得用户不能将棋子拖放到非棋点上,棋盘的Rule对象负责判断走棋是否遵守了象棋的规则,例如:"马"走日,"象"

9、;走田,小卒一去不回头等等,如果用户的走法不符合规则,棋子将不动,重新选择路线在落子。 4.1.3棋点模块 ChessPoint.java 该文件生成的类负责创建棋盘的棋点对象,棋点对象可以判断该棋点上是否有棋子,可以指定当前棋点上的棋子,获取当前棋点上的棋子,移掉当前棋点上的棋子。 4.1.4绘制棋子模块 ChessPiece.java 该文件生成的类负责创建棋子对象,并绘制棋子的外观,棋子对象可以获取本身的颜色、大小、名字,也可以设置和获取本身的类别-红棋或黑棋。 4.1.5规则模块 Rule.java 该文件生成的类负责为创建走棋法则对象,该对象负责判断用户的走着是否遵守了中国象棋规则。

10、 4.1.6记录走棋模块 MakeStep.java 该类创建的对象负责记录一步走棋。5 使用说明 5.1点击运行,显示棋盘界面,红黑双方自动摆好棋子准备对战图5-1 棋盘界面图 该棋盘是由10条横线和9条竖线形成90个正方形(边长为50)的小方格,并在帅和将所在的特殊位置画出相应的对角线来,中间是由一个和棋盘背景颜色相同的填充矩形形成红黑方的分界,炮和兵(卒)初始化所对应的位置的棋盘背景是由相应的直线所画出来的。用一个二维数组来定义相应的棋子,用二维数组的下标来表示该棋子所在的行和列,用二维数组的值来表示相应的棋子,即0表示没有棋子,1-7表示黑方的("車","

11、馬","象","仕","将","炮","卒"),8-14表示红方的("车","马","相","士","帅","炮","兵")。 5.2选择棋子,开始走棋图5-2选棋落子 用变量temp当做一个开关来切换红黑两方走棋的顺序。初始值为0表示红方先走,红方走完后立即将该temp值改为1,当再次点击棋子时,只能使用黑方了,黑方同理。当选中一方的棋子时,将选

12、中的当前行赋值给selectRow,将选中的当前列赋值给selectCol,然后调用repaint()方法,并在paint()方法中进行判断,如果selectRow和selectCol的值发生了变化,就在变化的位置处画上相应的正方形。 走棋的原理是:先选中棋子,将先前的棋子的值赋值给新的区域的值,并将原来的区域的值改为0,最后再调用repaint(),就实现了棋子的移动效果了。实现了棋子的移动效果后就要去实现各类棋子的走法规则,即让每个棋子按照规定的法则来移动。如若棋子不是按规定走的将不会有所改变,需在重新选择有效路径。6 测试用例规格说明 6.1中国象棋中走马的测试用例 6.1.1分析中国象

13、棋中走马的实际情况 1.如果落点在棋盘外,则不移动棋子; 2.如果落点与起点不构成日字型,则不移动棋子; 3.如果在落点方向的邻近交叉点有棋子(绊马腿),则不移动棋子; 4.落点处有己方棋子,则不移动棋子; 5.如果不属于1-4条, 落点处无棋子,则移动棋子; 6.如果不属于1-4条, 落点处为对方棋子(非老将),则移动棋子并除去对方棋子; 7.如果不属于1-4条,且落点处为对方老将,则移动棋子,并提示战胜对方,游戏结束。6.1.2根据分析明确原因和结果 原因: 1.落点在棋盘上; 2.落点与起点构成日字; 3.落点方向的邻近交叉点无棋子; 4.落点处为自己方棋子; 5.落点处无棋子; 6.落

14、点处为对方棋子(非老将); 7.落点处为对方老将。 结果: E1、不移动棋子; E2、移动棋子; E3、移动棋子,并除去对方棋子; E4、移动棋子,并提示战胜对方,结束游戏。 6.1.3添加中间节点11,目的是作为导出结果的进一步原因,简化因果图导出的判定表图6-1判定表 6.1.4决策表分解图6-2决策表分解 6.2兵(卒)的走法规则及测试结果图 走法规则:兵(卒)没有过河时只能竖着向前面走且有且只能移动一步,当过河后可以竖着向前面走,也可以横着左右走,但是不能往后走。如下图: 图6-3 没有过河可移动位置 图6-4过河后可移动的位置 6.3炮的走法规则及测试结果图 走法规则:炮隔三打子。当

15、炮在横纵轴方向上没有遇到障碍物时可以随意移动,一旦有障碍物出现的话,障碍物的前方必须存在有对方棋子时,才能移动到对方的棋子位置处如下图: 图6-5炮走动图 6.4车(車)的走法规则及测试结果图 走法规则:车横冲直撞。车只能在横纵轴方向上随意移动,且不能越过障碍物,如果有障碍物的话,也只能是对方的棋子所造成的障碍,此时可以移动到对方棋子所在的位置。 图6-6车走动图 6.4马(馬)的走法规则及测试结果图 走法规则:马跳日。当马在横向(或纵向)的方向上跳动时,如果在横向(纵向)的方向上没有障碍物的话,马才能跳过去,否则就跳不过去。图6-7马走动图 6.5象(相)的走法规则及测试结果图 走法规则:象

16、(相)飞田。当象(相)往前方(或后方)跳动时,如果在田子的中心位置没有障碍物出现,象(相)才能走动,否则它将不能移动。并且象(相)是不能过河的。如图:图6-8相走动图 6.6仕(士)的走法规则及测试模拟图 走法规则:仕(士)只能在九方格的对角线上行走,且每次只能移动一格。如图:图6-9仕走动图 6.7帅(将)的走法规则及测试结果图 走法规则:帅(将)只能在九方格中的横纵轴上行走,且每次只能移动一步。如图:图6-10帅走动图7.自我评价与总结通过此次课程设计,使得我对测试进一步熟悉,对JAVA编程也进一步加强。对于这次使用Java语言编写出象棋游戏的设计,很重要一点就是我们要知道象棋有哪些规则,

17、象棋的摆发,棋子走动的规律,再用程序化的语言通过算法来设计出象棋游戏。象棋的规则开始并不熟悉,通过网上查询,了解了象棋走法。首先要将棋盘制作出来,在相应的位置摆上棋子,通过调用Java的API将它们画出来的。一开始什么都不会,通过老师的讲解,思路慢慢明朗化。象棋游戏开发完成,必须先测试,通过黑盒测试,探测此次开发象棋游戏功能是否正确,界面是否达到标准。要是不满足,还得继续修改程序,进步完善。开发过程中并没有出现太大的问题,有什么不清楚的,通过向老师同学请教,都顺利解决了。通过此次课程设计,不仅巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。理论与实际相结合才能是自己学得更多,

18、学的更扎实。通过理论实践相结合可以提高自己的实际动手能力和独立思考的能力。通过这次,让我了解到自己还有许多不足,知识学的并不牢靠,实践能力有待加强,各方面能力还需不断提高。附录:程序清单package com.game;import javax.swing.JFrame;/* * 此类是窗体类的子类,就是一个窗体 */public class Gui extends JFrame /定义一张白纸private MyCanvase c;/在本窗体类的构造函数,来设计这个窗体public Gui() c=new MyCanvase();/构造这张白纸this.add(c);/将这张白纸,铺在窗体上

19、this.setSize(500,550);/设置窗体大小this.setTitle("中国象棋");/设置标题栏this.setResizable(false);/不能改变大小this.setLocationRelativeTo(null);/设置窗体剧中显示this.setVisible(true);/设置窗体可见this.setDefaultCloseOperation(EXIT_ON_CLOSE);/设置窗体的关闭方式public static void main(String args) / TODO Auto-generated method stub/创建此窗

20、体new Gui();package com.game;import java.awt.Canvas;import java.awt.Color;import java.awt.Font;import java.awt.Graphics;import java.awt.Point;import java.awt.event.MouseEvent;import java.awt.event.MouseListener;/* * 自定义一个画布类,必须是系统Canvas类的子类 * 本类就是一个画布=一张白纸 */public class MyCanvase extends Canvas impl

21、ements MouseListener/定义棋子数组,1-7(红方),8-14(黑方),无子:0private int allChessMan=new int109;private int turn;private int myturn;private int temp;private Point tp;public MyCanvase() /设置纸的背景颜色this.setBackground(new Color(100,124,45);/初始化棋盘this.addMouseListener(this); this.init();public void init() /初始化棋盘中的棋子/

22、1-7(红方): 车马相士将炮兵this.turn=1;this.myturn=0;this.temp=0;this.tp=new Point(8,9);this.allChessMan00=1;this.allChessMan01=2;this.allChessMan02=3;this.allChessMan03=4;this.allChessMan04=5;this.allChessMan05=4;this.allChessMan06=3;this.allChessMan07=2;this.allChessMan08=1;this.allChessMan21=6;this.allChess

23、Man27=6;this.allChessMan30=7;this.allChessMan32=7;this.allChessMan34=7;this.allChessMan36=7;this.allChessMan38=7;this.allChessMan90=8;this.allChessMan91=9;this.allChessMan92=10;this.allChessMan93=11;this.allChessMan94=12;this.allChessMan95=11;this.allChessMan96=10;this.allChessMan97=9;this.allChessM

24、an98=8;this.allChessMan71=13;this.allChessMan77=13;this.allChessMan60=14;this.allChessMan62=14;this.allChessMan64=14;this.allChessMan66=14;this.allChessMan68=14;public void fixd(int i,int j,Graphics g)g.drawLine(i-8,j-16,i-8,j-8);g.drawLine(i-8,j+16,i-8,j+8);g.drawLine(i+8,j-16,i+8,j-8);g.drawLine(i

25、+8,j+16,i+8,j+8);g.drawLine(i-16,j-8,i-8,j-8);g.drawLine(i+16,j-8,i+8,j-8);g.drawLine(i-16,j+8,i-8,j+8);g.drawLine(i+16,j+8,i+8,j+8);/屏幕上每个横向的9个点,每个竖向的10个点,都有可能出现棋子/程序 = 数据结构 + 算法/问题 = 用一种数据结构,把要操作的东西装起来/+/ 在这个装下了东西的口袋中怎么操作/通过分析发现:每个点上一共有15种状态,无子|有子/有子:1-7(红方),8-14(黑方),无子:0/横有9个点,竖有10个点,一共有90个点/90个点

26、=10行9列的整型数组/棋盘上的棋子,完全依赖这个棋子数组来画for(int row=0;row<this.allChessMan.length;row+)for(int col=0;col<this.allChessManrow.length;col+)/if(this.allChessManrowcol=0)/无子,不需要画什么if(this.allChessManrowcol!=0)/有子,调用画棋子方法,单独画出这个棋子this.drawChessMan(this.allChessManrowcol, row, col, g);/* * 根据数组中的值,在棋盘的相应位置,画

27、出相应的棋子 * param val:棋子的值 * param row:棋子的行坐标 * param row:棋子的列坐标 */public void drawChessMan(int val,int row,int col,Graphics g)int x,y; String c="车","马","相","士","帅","炮","兵","車","馬","象","仕",&quo

28、t;将","炮","卒"/将数组中的下标=棋盘上的坐标/0,0=>50,50 3,1=>100,200 1,2=>150,100 /row=>y col=>xy=row*50+25;x=col*50+25;public Point chg(Point x)/转换棋盘坐标为数组坐标int i,tempx,tempy;/Point k = null;i=x.x % 50; /System.out.println("sd"+i);if(i<25)/System.out.println("

29、;wii"+x.x);/k.x=x.x-i;/System.out.println(k.x);tempx=x.x-i;else tempx=x.x-i+50;i=x.y % 50; if(i<25)tempy=x.y-i;else tempy=x.y-i+50;tempx=tempx/50 -1;tempy=tempy/50 -1;Point k=new Point(tempx,tempy);/k.setLocation(tempx, tempy);/System.out.println(k.x+"sd"+k.y);return k;/判断是否为已方棋子pu

30、blic int own(Point x)if(this.allChessManx.yx.x=0)return 0;else if(this.turn=0 && this.allChessManx.yx.x<8)|(this.turn=1&&this.allChessManx.yx.x>7)return 1;elsereturn 2;/各种棋子的移动方式/车public int zhu(Point x)if(jg(x,this.tp)=0)return 1;return 0;/马public int ma(Point x)int i,j;if(dis

31、t(x,this.tp)=5)i=x.x-this.tp.x;i=i*i;if(i=1)j=x.y+1;if(j>this.tp.y)j=x.y-1;if(this.allChessManjthis.tp.x=0)return 1;elsej=x.x+1;if(j>this.tp.x)j=x.x-1;if(this.allChessManthis.tp.yj=0)return 1;return 0;/相public int xiang(Point x)int i,j;if(this.turn=0&&x.y>4)return 0;if(this.turn=1&a

32、mp;&x.y<5)return 0;if(dist(x,this.tp)=8)i=x.x+this.tp.x;j=x.y+this.tp.y;if(this.allChessManj/2i/2=0)return 1;return 0;/士public int shi(Point x)int k;k=dist(x,this.tp);System.out.println(k);if(k=2)System.out.println("43");if(x.x>2 && x.x<6 &&x.y>=0 &&

33、x.y<3)return 1;if(x.x>2 && x.x<6 &&x.y>6 && x.y<=9)return 1;return 0;/将军public int jiang(Point x)if(dist(x,this.tp)=1)if(x.x>2 && x.x<6 &&x.y>=0 &&x.y<3)return 1;if(x.x>2 && x.x<6 &&x.y>6 && x

34、.y<=9)return 1;return 0;/炮public int pao(Point x)if(jg(x,this.tp)=0&&this.allChessManx.yx.x=0)return 1;if(jg(x,this.tp)=1&&own(x)=2)return 1;return 0;/兵public int bing(Point x)if(dist(x,this.tp)=1)if(this.turn=0&&x.y>this.tp.y)return 1;if(this.turn=1&&x.y<thi

35、s.tp.y)return 1;/过河后if(this.tp.y>4&&this.turn=0&&x.y>=this.tp.y)return 1;if(this.tp.y<5&&this.turn=1&&x.y<=this.tp.y)return 1;return 0;/计算路径中有几个挡道的 车和炮用public int jg(Point x,Point y)int s=0,i,j1,j2;if(x.x=y.x)j1=x.y;j2=y.y;if(x.y>y.y)j1=y.y;j2=x.y;for(i=j1+1;i<j2;i+)if(this.allChessManix.x!=0)s+;return s;else if(x.y=y.y)j1=x.x;j2=y.x;if(x.x>y.x)j1=y.x;j2=x.x;for(i=j1+1;i<j2;i+)if(this.allChessMany.yi!=0)s+;return s;return 25;/计算移动距离 马,兵,将,相,士 使用public int dist(Point x,Point y)int i,sum=0;i=x.x-y.x;i=i*i;sum+=i;i=x.y-y.y;i=i*i;sum+=i;retu

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论