五子棋游戏项目报告.docx
《五子棋游戏项目报告.docx》由会员分享,可在线阅读,更多相关《五子棋游戏项目报告.docx(15页珍藏版)》请在冰豆网上搜索。
五子棋游戏项目报告
《软件技术基础》课程项目报告
项目名称:
用VC++实现的五子棋游戏
专业班级:
G11009
项目成员:
崔光浩程德武付强付钰
李洪润尚振兴沈婷玉佟承雨周彤姣
********
完成时间:
2011/10/31
摘要
摘要
五子棋是起源于中国古代的传统黑白棋种之一。
现代五子棋日文称之为“連珠”,英译为“Renju”,英文称之为“Gobang”或“FIR”(FiveinaRow的缩写),亦有“连五子”、“五子连”、“串珠”、“五目”、“五目碰”、“五格”等多种称谓。
五子棋不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性。
五子棋既有现代休闲的明显特征“短、平、快”,又有古典哲学的高深学问“阴阳易理”;它既有简单易学的特性,为人民群众所喜闻乐见,又有深奥的技巧和高水平的国际性比赛;它的棋文化源渊流长,具有东方的神秘和西方的直观;既有“场”的概念,亦有“点”的连接。
它是中西文化的交流点,是古今哲理的结晶。
一、需求分析
1.1开发背景
五子棋是一种两人对弈的纯策略型棋类游戏,是起源于中国古代的传统黑白棋种之一。
发展于日本,流行于欧美。
五子棋容易上手,老少皆宜,而且趣味横生,引人入胜;不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性。
传统五子棋的棋子分为黑白两色,采用围棋棋盘,棋子放置于棋盘线交叉点上。
两人对局,各执一色,轮流下一子,先将横、竖或斜线的5个同色棋子连成不间断的一排者为胜。
棋类游戏规则简单,对外部要求不高,人们可以随时随地进行对弈。
但是,真正能够精通棋类游戏的人却不是很多,主要是棋类游戏具有变化莫测的特点,人们经常得在棋局上深思熟虑才能找到克敌制胜的办法。
因此,各种棋类游戏都具有开发智力的效能。
在休闲中使自己得到真正的长进,这或许就是其倍受人们青睐的原因所在!
1.2项目目标
我们将主要通过VC++语言,运用面向对象的程序设计方法,开发此款五子棋游戏。
力争使程序短小精悍,简洁明了;游戏界面优美,容易操作;功能丰富,趣味性强。
现在将我们对项目期望实现的目标一一介绍:
a.能供两人对弈。
b.可以实现经典棋局的回放。
c.可以悔棋。
D.能实现棋局步数的排名。
e.操作方便,容易上手。
1.3运行环境
本游戏短小精悍,而且对电脑配置的要求均不高,目前几乎所有的PC机均可运行该游戏。
但是为了能让大家更好地体验该款游戏,我们给出如下的最低配置:
最低配置:
CPU1GHz内存32M硬盘4GWindows95MicrosoftVisualC++6.0
同时结合我们开发该游戏的环境,我们强烈推荐用户使用如下的配置:
最佳配置:
CPU2GHz及以上内存256M及以上硬盘80G及以上WindowsXP及以上MicrosoftVisualC++6.0
1.4游戏说明
(1)游戏流程:
启动游戏后,显示主菜单。
里面包括开始游戏、读取游戏、排行榜、关于游戏、游戏帮助、退出。
读取游戏中包含经典棋局的回放和未下完的棋局。
排行榜中显示的是棋局步数的排名。
(2)游戏规则:
落子:
对阵双方交替落子,任何一方不能多下一步,也不能在已有棋子的地方继续落子,否则会有错误提示。
赢棋:
任何一方先出现在棋盘的横、纵或斜线上形成连续的五子,则该方获胜。
排行榜:
可以判断赢者是否可以进入排行榜。
(3)特别提示:
●双人对弈模式下,悔棋的过程为:
首先由玩家向对方发送悔棋请求(悔棋消息),然后由对方决定是否允许玩家悔棋,在玩家得到对方的响应消息(允许或者拒绝)之后,才进行悔棋与否的操作。
1.5项目任务书
(1)班级:
G11009
(2)组长:
崔光浩
(3)成员:
尚振兴、李洪润、沈婷玉、程德武、付强、周彤娇、佟承雨、付钰
(4)项目名称:
五子棋
(5)项目背景:
五子棋是起源于中国古代的传统黑白棋种之一。
五子棋不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性。
五子棋既有现代休闲的明显特征“短、平、快”,又有古典哲学的高深学问“阴阳易理”。
(6)项目分工:
程德武:
显示棋盘、显示帮助、游戏版权、显示在线帮助文档。
李洪润:
排行榜全部。
付强:
下棋、经典棋局的回放。
沈婷玉:
构造函数、初始化所有数据、析构函数。
尚振兴:
负责文档规划。
周彤姣:
文件的保存和读取。
付钰:
技术支持。
(7)项目进度:
1-3天:
前期准备,各类资料收集,流程图,算法等同时完成。
4-7天:
实现基本功能和附加功能。
8-10天:
最后测试,最后优化。
(各类文档的设计与编写穿插于始终)
二、技术路线
2.1总体方案
游戏的简单流程如下图:
2.2详细设计
a.实现玩家的类Player。
其中实现各个成员变量的set和get方法,以及构造和析构函数。
b.实现五子棋的类Gobang。
其中实现各个功能的函数如下:
1.开始游戏:
开始、下棋、悔棋、认输、保存voidstartGame();
2.显示帮助文档voidshowHelp();
3.显示版权voidshowEdition();
4.显示棋盘voidshowChessBoard();
5.显示在线在帮助文档voidshowOnlineHelp();
6.显示菜单voidshowMenu();
7.播放历史棋局voidmovieGoBang();
8.读取排行榜voidsetWinnerHome();
9.显示排行榜voidshowWinnerHome();
10.修改排行榜voideditWinnerHome(Player&player);
11.保存历史记录、保存经典、继续intsaveHD(char*arr);
12.读取历史记录、读取经典、继续intloadHD(char*arr);
13.鼠标模拟1.voidmonitor();2.boolagree(inta);
14.悔棋voidrepent();
15.判断五子连线boolfun();
16.显示已保存文档、有经典文档和继续文档intshowSave(intchoice);
三、工程进度
本次作业历时十天时间,总的说起来可以分为三个部分:
3.1前期准备部分(第1-3天)
主要完成方案的讨论、资料的收集、流程图、算法等前期工作,编写报告中需求分析的一部分和总体方案的一部分及项目任务书。
第1天:
选定题名,进行方案的讨论。
收集资料,写出需求分析中的开发背景部分。
第2-3天:
商定算法,将软件总体分块,写出项目任务书。
3.2中期实现功能部分(第4-7天)
主要完成预先设想的基本功能和附加功能,完成项目文档中的技术路线和需求分析的剩余部分,完成调试报告中的单功能调适。
第4天:
开始软件编写,完成棋盘的设计部分。
完成下棋部分程序的编写,测试棋盘设计部分。
完成悔棋部分程序的编写,测试下棋部分程序。
第5-6天:
完成两人对弈部分程序的编写,测试基本功能,测试悔棋部分。
第7天:
完成附加功能,测试对弈部分情况。
完善各项功能,测试附加功能。
3.3后期总结完善部分(第8-10天)
总体功能的调试改进,完成项目文档。
第8天:
功能调试,优化软件。
第9-10天:
其它报告剩余部分。
四、测试报告
4.1第4天:
测试棋谱
测试人:
程德武
测试内容:
通过VC++语言,我们编写了基于对话框的游戏界面。
我们将测试它的最基本面貌,希望其是符合我们要求的界面模式!
测试过程:
运行程序以后,弹出了棋局的对话框,整体棋局呈现白色,棋局右边和上边都有一些空出的区域,这是我们为将来实现其他附加功能预留的地方。
但是测试过程中我们始终发现一个问题,棋格的位图没有按照我们的设想正确放置,出现了跃出棋盘的怪现象!
问题解决:
通过反复推敲程序相关部分,我们觉得可能是算法有疏漏,于是修改了一下算法。
我们将每个棋格的位图封装了起来,将其位置作为成员数据。
再运行程序,问题就不再出现了。
反复运行程序再也没有出现异常情况!
4.2第5天:
基本功能测试
测试人:
佟承雨
测试内容:
程序的基本框架已经编好了,希望能按我们的预期目标能实现供两人对弈功能!
测试过程:
将程序编译、链接、运行后,弹出棋局的对话框,然后开始下棋,我们一步一步观察了每步落子后棋局的变化过程,均与我们预期的变化过程一样,我们非常欣喜,这说明我们设计下棋程序时的算法准确无误!
4.3第6天:
悔棋功能
测试人:
沈婷玉
测试内容:
测试悔棋功能能否正常实现。
测试过程:
我们测试了悔棋功能,反复的测试,此功能运行良好,能够一步一步悔棋,直到无子可悔,而且通过记录观察,每步的悔棋过程均准确无误!
4.4第7天:
测试其他的附加功能
测试人:
李洪润
测试内容:
我们对排行榜,经典棋局回放功能进行了测试
测试过程:
我们开始游戏后,正常下棋取得胜利后,程序默认将胜方步数与排行榜中已存在的玩儿家步数进行比较,满足条件则进入排行榜,否则不进入。
如果是前五次玩的话默认都进入排行榜。
关于经典棋局,进入游戏后,载入经典棋局,每按一次回车,回放一步,经测试无异常。
4.5第8-10天:
总体测试
测试人:
崔广浩
测试内容:
我们将在总体上对程序的运行效果和运行环境进行测试,以完善所有功能,达到软件的最优化!
测试过程:
首先我们测试了软件对运行环境的要求,我们先在Windowsxp操作系统中运行了一遍,结果并无异常情况出现;随后我们在CPU只有1GHz频率的硬件系统中运行,也并未发现任何问题!
我们基本上可以得出结论,我们的软件在一般的软、硬件环境下都能正常稳定地运行,对机子的配置基本没有什么要求,适合于广大的电脑拥有者使用!
五、个人小结
通过本次五子棋程序的设计,我想我学到了很多东西。
我主要是负责大报告的设计和编写,同时也编写一部分程序。
编程的确是非常辛苦,主要是第一次利用VC++编写程序。
我的VC++学的不是很好,编程时遇到了很多的困难,好在我们班的崔光浩同学不辞辛苦的帮助我调试程序,我们参考了很多的资料,像我们《软件基础》大作业中的优秀作品,网上的有关VC++的一些实用的编程技巧,还有一些经典的算法。
善于利用已有的资源,是我在本次大作业中学到得很宝贵的经验,对于网络,我们懂得了不只要用它来实现低级的聊天、看电影、打游戏等功能,我们还要实现获取有用的信息、学习别人先进的方法、查阅相关的电子资料等功能,充分发挥它的作用。
我们这次的作品,虽然只是一个比较简单游戏的实现,但是通过这次合作,我也有很大的收获。
虽然是一个小组,但每个人有不同的看问题的方法,我们在做这个软件的时候,大家也曾有过意见的分歧,我们也曾因为预期的功能没有实现而互相指责,也曾为有一点小小的进步而欣喜若狂。
一路风风雨雨,我们毕竟是基本完成了预期的功能,努力没有白费,心里特别的充实,这就是创造的快乐,也是合作的快乐。
我还编写了大作业的文档,由于自身能力的有限,我虽然竭尽全力,但总的感觉还是不能让我满意,不过,我也从中学到了一些东西:
总的说来,这次作业中我锻炼了自己的能力,也培养了团队合作的精神,感谢我的队友!
感谢老师!
感谢生活!
——尚振兴
在本软件的开发中,还是有不少地方是不太满意的,首先我通过单纯的VC++语言来实现功能。
虽然VC++的强大功能足以应付这种软件的开发要求了,但是由于控件的缺乏,语法的繁琐,在实现很多功能的实现中花费了不少力气。
但是由于知识水平的缺乏,无法使用Delphi,flash等更简便的手段来实现功能,希望以后可以弥补这一点。
其次,缺乏完成大工程的经验,没有建立一个有效可行的工作计划。
在工作中时而通宵奋战,时而停顿不前,既浪费了宝贵的时间,也耗费了大量精力,实在得不偿失。
但值得注意的是,在软件的开发中,我也学到了很多书本上学不到的经验。
首先,我使用了别人开发的思想,虽然开始很不习惯,但是上手之后就深深的体会到模块化开发和面向对象语言的方便与高效。
其次,这次开发中我使用了很多以前没接触过的函数。
除了上网学习资料外。
熟练的使用老师提供的参考资料,相信对我以后的工作会有很大的益处。
我觉得通过这个小项目很好地考察了每个学生的知识水平,每个人都发挥了个人最佳的状态。
虽然这种形式比普通的卷面考试要难,但是却能够充分调动每个人的积极性去学习自己尚未接触的知识和运用自己已经学过的知识。
实验中,我们小组成员之间配合默契,共同商讨问题,使我们在碰到一个一个的问题后,能快速找到相关的答案。
难能可贵的是,在软件制作最紧张的时候,大家都义无反顾地放弃了一点休息时间,和团队一起坚持奋斗!
所以通过这次实验的合作,我们小组成员之间更加增进了了解,增进了团结!
——崔光浩
六、主要算法
以下时详细算法中提到的主要函数,其他函数在程序中。
1判断胜负
五子棋的胜负,在于判断棋盘上是否有一个点,从这个点开始的右、下、右下、左下四个方向是否有连续的五个同色棋子出现,判断胜负方向如下图
boolGobang:
:
fun(inta,intb)//判断是否五子连棋
{
intarr[8][2]={{-1,-1},{1,1},{-1,0},{1,0},{-1,1},{1,-1},{0,1},{0,-1}};
inti;
intsum=0;
for(i=0;i<8;i+=2)
{
sum=1;
intA=a+arr[i][0];
intB=b+arr[i][1];
while(A>=0&&A<=N&&B>=0&&B<=N&&chessBoard[A][B]==chessBoard[a][b])
{
A+=arr[i][0];
B+=arr[i][1];
sum++;
}
A=a+arr[i+1][0];
B=b+arr[i+1][1];
while(A>=0&&A<=N&&B>=0&&B<=N&&chessBoard[A][B]==chessBoard[a][b])
{
A+=arr[i+1][0];
B+=arr[i+1][1];
sum++;
}
if(sum>=5)
returntrue;
}
returnfalse;
}
2鼠标模拟
voidGobang:
:
monitor()
{
charch=getch();
switch(ch)
{
case'w':
case'W':
getMonitor=0;
break;
case'a':
case'A':
getMonitor=1;
break;
case's':
case'S':
getMonitor=2;
break;
case'd':
case'D':
getMonitor=3;
break;
case'j':
case'J':
getMonitor=4;
break;
case'r':
case'R':
getMonitor=5;
break;
case'p':
case'P':
getMonitor=6;
break;
case'Q':
case'q':
getMonitor=7;
break;
default:
break;
}
}
voidGobang:
:
startGame()
{
intchose=1;
while(chose)
{
showChessBoard();
monitor();
if(getMonitor==0&&chessBoardMark[0]-1>=0)
chessBoardMark[0]--;
if(getMonitor==1&&chessBoardMark[1]-1>=0)
chessBoardMark[1]--;
if(getMonitor==2&&chessBoardMark[0]+1chessBoardMark[0]++;
if(getMonitor==3&&chessBoardMark[1]+1chessBoardMark[1]++;
showOnLineHelp();
switch(getMonitor)
{
case4:
//下棋
if(playGoBang(chessBoardMark[0],chessBoardMark[1])==1)
if(fun()==true)
{
system("cls");
printf("\n\n\n\n\nYouWin\n\n\n\n\n\n\n\n\n\n\");
remind();
if(historyStep%2==0)
editWinnerHome(player1);
else
editWinnerHome(player2);
showWinnerHome();
remind();
}
break;
case5:
//悔棋
repent();
break;
case6:
//保存
showSave
(1);
break;
case7:
//退出
chose=0;
break;
default:
break;
}
}
}