软件工程课程设计

软件工程课程设计

课程设计(大作业)报告

课程名称: 软件工程

设计题目: 多用户五子棋游戏 院 系:

班 级: 2011级计算机科学与技术1班 组长姓名: 何清华

指导教师: 赵卿老师

组 员: 陈飞、朗胜、孟李阳、宋罗飞、

设计时间: 20xx年12月21日至12月22日

信息技术学院

昆明学院课程设计(大作业)任务书

软件工程课程设计

软件工程课程设计

一、概述 ........................................................................................................... 2

1.1 前 言 ................................................... 2

二、 需求分析 ................................................................................................. 2

2.1业务需求 ................................................. 3

2.1.1 此系统使用范围要求 ............................................................................................. 3

2.1.2 功能要求 ................................................................................................................. 3

2.2 性能需求 ................................................. 4

2.3 系统平台需求 ............................................. 4

三、 开发工具、环境及其技术 ................................................................... 4

3.1 JAVA简介 ............................................... 4

3.2 JAVA 编程环境: ......................... 错误!未定义书签。

3.2.1 环境变量 ............................................................................... 错误!未定义书签。

3.2.2 Eclipse插件 ........................................................................ 错误!未定义书签。

四、 程序设计思路与实现 ........................................................................... 5

4.1程序设计思路 ............................................. 5

4.1.1.设计思想 ............................................................................................................... 5

4.1.2.程序设计分析 ....................................................................................................... 6

4.2 程序设计 ............................................... 10

五、主要参考文献 ......................................................................................... 14

六、总结 ......................................................................................................... 14

1

课程设计(大作业)报告

一、 概述

1.1 前 言

电脑已经深入到日常工作和生活的方方面面,比如文字处理、信息管理、辅助设计、图形图像处理、教育培训以及游戏娱乐等。Windows系统的推出使电脑从高雅的学术殿堂走入了寻常百姓家,各行各业的人们无须经过特别的训练就能够使用电脑完成许许多多复杂的工作。然而,虽然现在世界上已经充满了花样繁多的各种软件,但它们依然不能满足用户的各种特殊需要,人们还不得不开发适合自己特殊需求的软件。Java语言作为一种面向对象的编程语言,具有分布式,可移植,高性能,多线程等特点。通过系统的学习,人们就可以使用它开发出功能齐全,满足特殊需求的应用程序。Java语言易学易用,对学习者掌握技能,开拓思维都有很大的帮助。在系统的学习了软件工程和Java语言之后,这次课程设计,正好将学过的Java语言中的各种技术综合起来,用eclipse开发工具编写一个小游戏,既对自己学过的技能进行一次检验,也能系统地将学过的知识复习巩固。

二、 需求分析

软件需求分析是软件开发周期的第一个阶段,也是关系到软件开发成败的关键一步。对于任何一个软件而言,需求分析工作都是至关重要的一步。只有通过软件需求分析,才能把软件的功能和性能由总体的概念性描述转化为具体的规格说明,进而建立软件开发的基础。实践表明,需求分析工作进行得好坏,在很大程度上决定了软件开发的成败。 软件需求分析的任务是:让用户和开发者共同明确将要开发的是一个什么样的软件。具体而言,就是通过对问题及其环境的理解、分析和综合,建立逻辑模型,完成新软件的逻辑方案设计。

2

2.1业务需求

2.1.1 此系统使用范围要求

此系统为智力游戏,适合于各类游戏爱好者。由于其经典性及其游戏的简单性,各类人士都可以也都爱玩。人们在与电脑对战享受娱乐的同时,也会体会到自己的智力也会有所提升。

2.1.2 功能要求

该款游戏主要由以下几个模块组成:

软件工程课程设计

(1)人机对弈模式:选择该模式可以实现人与电脑之间的对弈,电脑会智能的选择该在哪处下子,并会在每次下棋结束后判断是否有哪方已经获胜,如果获胜则结束本局游戏,并提示玩家游戏结束。

(2)人人对弈模式:选择该模式可以实现人与人之间的对弈,系统会提示哪方先下,然后玩家之间交替的下棋,同样系统会在下完每次棋后判断是否有哪方已经获胜,如果获胜则结束本局游戏,并提示玩家游戏结束。

(3)悔棋功能:这个功能也是根据游戏的实际需求而存在的,在现实生活中难免有失误下错了棋,那么就需要悔棋。此功能提供了悔棋功能,使得下棋的灵活性有所提高。玩家若想悔棋,则只需选择悔棋按钮便可以重新下过刚才的棋。 (4)更换棋盘背景:此功能可以根据玩家的爱好任意更换棋盘的背景颜色,由

软件工程课程设计

3

于每个人对颜色的喜好不一样,因此这个功能也是非常必需的。更换一种玩家所喜欢的颜色,玩家能发挥得更好。

2.2 性能需求

该款五子棋游戏功能虽然简单,但最主要的还是实现了人人对弈模式和人机对弈两种模式,所以从这个角度来说,该款游戏需要能很好的在两种模式间良好的转换。虽然系统不大,但要在满足玩家的基本要求的情况下,电脑有一定的智能,能给于新手一定的帮助。技术可行性:运用Windows2000/XP以上的操作系统,SQL SERVER2005的数据库技术,开发以Windows XP为用户的操作平台,界面友善、功能齐全的《五子棋双人对战小游戏》。经济可行性:一方面,新系统中棋盘界面和更强劲的功能支持,再加三局两胜制的规则,不仅增加了游戏的趣味性,而且使游戏者更尽兴;另一方面系统开发成本低,现有PC机即可提供该系统开发工作需要的所有硬件设备环境。操作可行性:操作上是键盘的使用,主要凭借输入坐标确定棋子落子位置,方便简单。使用前只要看明白游戏规则及其方法即可。

2.3 系统平台需求

编程语言:JAVA

操作系统:Windows xp系列

开发工具:eclipse

三、 开发工具、环境及其技术

3.1 JAVA简介

Java技术是一门编程语言,也是一个平台,它基于Java虚拟机技术,借助这个东西建立了跨平台的优势。(题外话:Java热门的原因之一就是一个跨平台的概念,跨平台类似跨浏览器的好处也是如此,这也是现在AJAX技术流行的原因之一。另外现在热炒的RIA富客户端的概念下的技术除了AJAX外还有Adobe的Flash/Flex,微软的Silver Light,SUN的JavaFX等,个人更看好FLash/Flex,原因是Flash插件在浏览器端占用率很高)

4

四、软件设计

4.1设计思路

4.1.1.设计思想

1、功能列表如下:

a) 输出棋盘;

b) 显示用户行程,提示用户下子;

c) 查看用户的输入是否出界;

d) 悔棋,下错位置可以悔棋;

e) 记录并显示每局游戏结束时的步数;

f) 判断每局游戏输赢,显示每局游戏的获胜者及分数。 g) 判断是否进行下一局。

h) 判最终赢家(三局两胜)

退出游戏

软件工程课程设计

用例图如下:

5

软件工程课程设计

游戏说明

软件工程课程设计

判断胜负

2.本程序要实现五子棋的游戏功能,必须先有一个棋盘,所以,通过继承

JPanel,然后在JPanel上画出一个17*17的棋盘,另外还有三个按钮:重新开局、请黑方下子和请白方下子,提醒用户进行相应的操作。当然,JPanel必须放在JFrame中,所以,又通过继承JFrame得到一个实例。

3.对于下棋的操作,通过对JPanel增加鼠标事件监听器MouseListener,每次当用户点击鼠标时,先取得点击的坐标值,然后换算成对应棋盘上(即棋盘数组)的位置(数组的下标)。

4.判断此处是否已经有棋子,如果有则提示玩家重新下子,否则通过java里的画图函数在此处画上棋子,重新刷新输出棋盘。

5.判断该颜色棋子的上下左右是否满足连续五个,是的话提醒相应玩家获胜,不是的话,更换玩家下棋。

6.对于玩家的更换是程序自动的,每次用户点击鼠标后,若本局还未结束则会变换玩家,从而画出对应黑方白方的棋子,直到有一方获胜程序技术。

4.1.2.程序设计分析

1. 本款游戏有“游戏”和“选项”两个选项,其中“游戏”包括开局、重新开始、结束游戏几个选项;选项里边则包括对弈模式、悔棋、更改背景颜色几个选项,玩家可以根据具体需要选择使用。

2. 绘制棋盘,17条横线,17条竖线,在直线交点处下棋子(实心黑白圆形)。

3. 首先程序会判断对弈模式是人机对弈还是人人对弈模式,若是人机对弈则 6

软件工程课程设计

是玩家先下,玩家是黑方,电脑是白方。若是人人对弈,则是黑方先下,黑白交替下子。

4. 棋盘处于鼠标监听状态,当鼠标在棋盘上有点击操作的时候,程序会获得鼠标点击的坐标然后换算成对应的棋盘的位置,再判断此处是否有棋子,假如没有,那么在此处画出对应颜色的实心棋子,假如已经有棋子了,则提示玩家此处已经有棋子请重新下棋。

5. 当选择的是人机对弈模式的时候,轮到电脑下子时,电脑会通过算法计算每个没有棋子的位置的重要性来选择最重要的位置下子。 6. 人机对弈算法简介:

本款游戏最核心的地方就是算法,因为这是整个程序最难的模块。算法的中心思想是:利用分数代表每个位置的重要程度,越重要的位置的分数值会越高,当电脑下棋时会先将电脑和玩家棋型的分数分别计算一遍,然后选择二者中分数最高的点下子。如果玩家的分数高,那么代表电脑应该防守,如果电脑的分数高,那么代表电脑应该进攻。 具体的分数值赋值如下:

软件工程课程设计

7

每个位置的分数的计算方式是各个方向的分数相加,最后找出电脑棋型和玩家棋型的分数的最高的位置为电脑的下棋点下棋。

7. 当任何一方有五个棋子沿着横,竖,斜连在一起时,系统自动判断赢棋,并显示黑方或白方胜利。棋局结束后,任何一方均不能继续操作。

8.数据词典:

变量及说明

数据编码:数据名(标识符)

库名:三局两胜制双人对战五子棋游戏

信息:

变量 类型 说明

x1 int 黑子下棋行数

y1

x2 int 黑子下棋列数 int 白子下棋行数

y2 int 白子下棋列数

n int 下棋步数

score1 int 黑子分数

score2 int 白子分数

i int 棋盘行数

j int 棋盘列数

p int 黑棋赢的盘数

q int 白棋赢的盘数

m int 下棋的局数

heim int 单局黑子赢后,将要下的局数

baim int 单局白子赢后,将要下的局数

8

软件工程课程设计

软件工程课程设计

9

4.2 程序设计

#include<iostream>

using namespace std;

int Hsheng(char a[][15]); //判断o子是否获胜的函数 int Bsheng(char a[][15]); //判断x子是否获胜的函数 int he(char a[][15]); //判断是否平局 void qipan(char a[15][15]) //执行输出棋盘命令 {

cout<<"本游戏采用二维数组实现,棋盘为15X15的二维直角坐标系,均从1到15,祝二位游戏愉快.";

for(int i=0;i<15;i++) //打印棋盘

{

for(int j=0;j<15;j++)

cout<<a[i][j];

cout<<endl;

}

}

int main()

{

char a[15][15]; int x,y;

for(int i=0;i<15;i++)

for(int j=0;j<15;j++)

a[i][j]=' ';

qipan(a);

while(1)

{

int a1=1;

while(1)

{

for(;a1;)

{

cout<<"请输入o子下的位置:"; //输入o子的位置

cin>>x>>y; if(a[x][y]=='o'||a[x][y]=='x') //判断是否已有子 {cout<<"已有子请重下"<<",";continue;}

else if(x>=15||y>=15)

10

{cout<<"输入错误请重输"<<",";continue;}

else

{ a[x][y]='o'; a1=0;}

}

break;

}

qipan(a); //下好o子后将棋盘显示 if(Hsheng(a)) //判断o子是否已经获胜 {cout<<"o子获胜"<<endl; break; }

while(1) //下x子

{

cout<<"请输入x子下的位置:";

cin>>x>>y;

if(a[x][y]=='o'||a[x][y]=='x'||x>=15||y>=15)

{

for( ; a[x][y]=='o'||a[x][y]=='x'; )

{

cout<<"已有子请重下";

cout<<"请输入x子下的位置:";

cin>>x>>y;continue;

}

for ( ; x>=15||y>=15||x; )

{

cout<<"输入错误请重输"<<","; //判断输入棋子位置是否正确

cout<<"请输入x子下的位置:";

cin>>x>>y;continue ;

}

a[x][y]='x';break;

}

else

{a[x][y]='x'; break;}

}

qipan(a); //再一次输出棋盘

if(Bsheng(a)) //判断x子是否已经获胜 11

{cout<<"x子获胜"<<endl; break; }

if(he(a)) //判断是否平局 {cout<<"平局"<<endl; break;}

}

return 0;

}

int Hsheng(char a[][15])

{

int i,j;

for(i=0;i<15;i++)

for(j=0;j<15;j++)

if(a[i][j]=='o'&&a[i][j+1]=='o'&&a[i][j+2]=='o'&&a[i][j+3]=='o'&&a[i]

[j+4]=='o')

return 1;

for(j=0;j<15;j++)

for(i=0;i<15;i++)

if(a[i][j]=='o'&&a[i+1][j]=='o'&&a[i+2][j]=='o'&&a[i+3][j]=='o'&&a[i+4][j]=='o')

return 1;

for(i=0;i<15;i++) //判断左斜5个 for(j=0;j<15;j++)

if(a[i][j]=='o'&&a[i+1][j+1]=='o'&&a[i+2][j+2]=='o'&&a[i+3][j+3]=='o'&&a[i+4][j+4]=='o')

return 1;

for(i=0;i<15;i++) //右斜5个

for(j=14;j>3;j--)

if(a[i][j]=='H'&&a[i+1][j-1]=='o'&&a[i+2][j-2]=='o'&&a[i+3][j-3]=='o'&&a[i+4][j-4]=='o')

return 1;

return 0;

}

int Bsheng(char a[][15]) //同o,只是改字符 12

{

int i,j;

for(i=0;i<15;i++)

for(j=0;j<15;j++)

if(a[i][j]=='x'&&a[i][j+1]=='x'&&a[i][j+2]=='x'&&a[i][j+3]=='x'&&a[i]

[j+4]=='x')

return 1;

for(j=0;j<15;j++)

for(i=0;i<15;i++)

if(a[i][j]=='x'&&a[i+1][j]=='x'&&a[i+2][j]=='x'&&a[i+3][j]=='x'&&a[i+4][j]=='x')

return 1;

for(i=0;i<15;i++)

for(j=0;j<15;j++)

if(a[i][j]=='x'&&a[i+1][j+1]=='x'&&a[i+2][j+2]=='x'&&a[i+3][j+3]=='x'&&a[i+4][j+4]=='x')

return 1;

for(i=0;i<15;i++)

for(j=14;j>3;j--)

if(a[i][j]=='x'&&a[i+1][j-1]=='x'&&a[i+2][j-2]=='x'&&a[i+3][j-3]=='x'&&a[i+4][j-4]=='x')

return 1;

return 0;

}

int he(char a[][15])

{

for(int i=0;i<15;i++)

for(int j=0;j<15;j++)

{

if(a[i][j]==' ') //当棋盘全部子都不是' '时才能return 1,即棋盘已下满

return 0;

}

return 1;

}

13

程序说明:本程序定义了各种操作函数、各种状态判定宏,思想明确,思路清晰。各个判断选择了不同路径,因此继续进行或输出结果。程序中,“循环”的利用非常直接和清晰,双方交替下棋,因此循环往复。最终决出胜负或最终平局。分析时,也考虑了许多种情况,针对各个情况均作出了相对措施和解决方案。

程序采用循环进行双方交替下棋,并进行了很多判断。首先判断棋盘是否已满,若棋盘已满,则输出平局,结束游戏;若棋盘未满,则继续进行。然后判断“0”方是否胜出,若“0”方获胜,则输出“0”方获胜,结束游戏;若“0”方没有获胜,则继续进行。再判断“x”方是否获胜,若“x”方获胜,则输出“x”方获胜,结束游戏;若“x”方没有获胜,则继续进行。回到“首先”的判断。如此循环??

五、主要参考文献

[1] 张海藩编著 《软件工程导论》(第五版) 清华大学出版社 2008

[2] 王小春编著 《Pc游戏编程(人机博弈)》 重庆大学出版社 2005

[3] 李宁等编著 《Java Web 开发技术大全》 清华大学出版社 2009

[4] 耿祥义,张跃平编著 《JSP实用教程》 清华大学出版社 2003

[5] 吴其庆编著 《Java程序设计实例教程》 冶金工业出版社,2006

[6] 田淑梅、廉龙颖、高辉 《软件工程——理论与实践》 清华大学出版,2011-8-18

六、总结

该五子棋程序基本上实现了五子棋的游戏功能,有双方下棋的界面及最终结果判定的界面。同时该程序采用二维坐标实现,明了易懂,方便玩家在游戏过程中的操作,使游戏更加简便。该游戏基本实现了游戏的一般有球和特征。在游戏的源程序及文档方面,也严格遵守软件工程思想,立足实验要求,确定任务,需求分析,设计和编码,每个步骤清晰易懂。当然该系统也有很多不足的地方,第一次进行独立的软件工程课程设计,也会有很多些细节没考虑到。这款游戏也是在不断的调试和修改中不断的得到完善。希望老师能够指出不足,帮助我们不断提高。

在设计过程中我们小组遇到了很多困难,我们小组都团结在一起,遇事一起解决,在不懂的地方一起讨论并请教他人,最终所有的问题都一一被解决。在小组成员的不懈努力下,系统终于实现了。同时我们也感受到软件工程是一个庞大的计算机学科,我们要投入更多的精力和时间去学习它。总之,这次的软件工程课程设计让我们学到了很多,学会了团结协作,让我们受益匪浅。

14

相关推荐