五子棋游戏课程设计说明书.docx
- 文档编号:4205349
- 上传时间:2022-11-28
- 格式:DOCX
- 页数:20
- 大小:205.92KB
五子棋游戏课程设计说明书.docx
《五子棋游戏课程设计说明书.docx》由会员分享,可在线阅读,更多相关《五子棋游戏课程设计说明书.docx(20页珍藏版)》请在冰豆网上搜索。
五子棋游戏课程设计说明书
课程设计说明书
题目:
五子棋
*******
学院:
理学院
班级:
信计13-1
********
二〇一六年一月二十一日
内蒙古工业大学课程设计(论文)任务书
课程名称:
面向对象的程序设计学院:
理学院班级:
信计13-1
学生姓名:
杨震学号:
2**********0指导教师:
白莲花
一、题目
五子棋游戏
二、目的与意义
面向对象程序设计课程设计可以培养学生综合运用所学面向对象程序设计知识和技能分析与解决实际问题的能力,以及严肃认真的科学态度和严谨求实的工作作风。
三、要求
●采用面向对象程序设计语言C++进行程序开发
●选用一种C++语言的开发环境设计界面及程序
●在开发环境下,进行程序的运行及调试
四、工作内容、进度安排
主要内容
使用C++程序设计语言及其开发环境实现简单的五子棋游戏,完成程序的编写和调试。
工作进度安排
第一天:
熟悉课程设计题目及具体要求,确定选择的语言开发环境,查阅资料、学习、讨论。
第二天:
根据课题给出的基本需求,进行认真分析和讨论,按照软件工程的思想,完成软件的面向对象分析工作。
第三天到第四天:
在面向对象分析的基础上,进行面向对象的设计工作,完成相关设计工作。
第五天到第六天:
进行面向对象实现工作,确定需要的用户界面以及结构,完成软件的整体框架,在开发环境下,编程实现所开发的系统。
第七到第八天:
调试、测试工作,相关的后期工作。
第九和第十天:
撰写课程设计报告
五、主要参考文献
[1]郑莉,董渊,何江舟.C++语言程序设计(第4版)[M].北京:
清华大学出版.2010.7
[2]StanleyB.Lippman,JoséeLaJoie,BarbaraE.Moo.C++Primer(中文版)(第四版)[M].北京:
人民邮电出版社.2006
[3]WalterSavitch.C++面向对象程序设计——基础、数据结构与编程思想(第4版)[M].北京:
清华大学出版社.2003
[4]钱能.C++程序设计教程(第2版)[M].北京:
清华大学出版社.2005
[5]郑莉.C++语言程序设计案例教程(第1版)[M].北京:
清华大学出版社.2005
[6]韦朴,陈泰生.VisualC++通用范例开发金典[M].北京:
电子工业出版社.2008
审核意见
系(教研室)主任(签字)
指导教师下达时间
2015年12月28日指导教师签字:
_______________
摘要
随着经济的发展,社会竞争的激烈,现在社会进入了竞争的时代。
上班族为了完成公司业务,每天超负荷的工作;学生为了不落后他人每天早起晚睡不断地学习,压力巨大。
所以为了缓解大家的压力,使大家在工作、学习之余娱乐一下,活跃大脑,提高工作、学习效率,因此益智性游戏越来越受人们的关注,五子棋作为益智类游戏之一,倍受人们的喜爱,所以对于五子棋的开发也有了很多关注。
C++语言即是进行软件开发的直接工具,又是“数据结构”、“操作系统”、“编译原理”以及其他相关课程的先修课程,因此,在整个教学体系中占据十分重要的地位[1]。
本文主要讲的是利用VC++6.0软件开发一个界面简洁、直观、实用性比较高的AI功能的五子棋游戏,游戏程序实现人人对弈,在对弈过程中当用户和用户比赛时电脑利用搜索算法计算出落子的最佳位置,是先人人对弈,而且程序能够完成具有重新开始、认输、提示该轮到哪一方下棋的、游戏、判断胜负、悔棋等功能。
关键词:
人工智能;自动处理;五子棋
引言
五子棋是起源于中国古代的传统黑白棋种之一。
现代五子棋日文称之为“連珠”,英译为“Renju”,英文称之为“Gobang”或“FIR”(Five in a Row的缩写),亦有“连五子”、“五子连”、“串珠”、“五目”、“五目碰”、“五格”等多种称谓。
五子棋不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性。
五子棋既有现代休闲的明显特征“短、平、快”,又有古典哲学的高深学问“阴阳易理”;它既有简单易学的特性,为人民群众所喜闻乐见,又有深奥的技巧和高水平的国际性比赛;它的棋文化源渊流长,具有东方的神秘和西方的直观;既有“场”的概念,亦有“点”的连接。
它是中西文化的交流点,是古今哲理的结晶。
当我们一个人无聊时,五子棋无疑成为一个令人爱不释手的游戏,五子棋容易上手,老少皆宜,而且趣味横生,引人入胜;不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性。
我的目的就是通过C++来创建一个网络对战的平台,可以让在电脑工作的人也有人人博弈的机会,开发自己的兴趣。
通过这次课设,我可以独立的利用学习的C++程序设计和VisaulC++6.0编写环境写程序,加强自己学习能力和解决问题的能力。
第一章任务概述
1.1问题概述
设计一个五子棋,棋盘大小15*15,能实现人人对战。
采用面向对象程序设计语言C++进行程序开发选用一种C++语言的开发环境设计界面及程序在开发环境下,进行程序的运行及调试使用C++程序设计语言及其开发环境实现简单的五子棋游戏,完成程序的编写和调试。
1.2需求分析
明确五子棋游戏的游戏规则,编写程序实现其功能。
为了更好的实现游戏,需求分析如下:
(1)选择游戏模式
(2)进入游戏。
(3)开始游戏,一方开始下子。
(4)另一方下子。
(5)判断游戏输赢。
(6)游戏结束。
第二章概要设计
2.1功能设计
程序主要实现的功能如下所述:
(1)启动程序
(2)显示棋盘,并显示谁先开始下第一子
(3)另一方下子,判断下子是否有棋子
(4)判断输赢
(5)重复上面步骤(3)(4)
(6)游戏结束,显示胜利
2.2程序结构
程序结构如下图:
图2.1程序结构图
2.3基本流程
根据游戏规则及其结构图,画出如下程序基本流程图
图2.2基本流程图
第三章程序实现
3.1主要变量及函数说明
3.1.1主要变量
m_cSquare//棋盘坐标
intm_x;//下棋的横坐标
intm_y;//下棋的纵坐标
3.1.2主要函数
voidshow();//显示棋子
isInChessBoard//玩家落子的坐标
isLine//判断五子连线的方法
isWin()//判断输赢
3.2主要功能实现
3.2.1棋盘类的声明
classChessBoard//棋盘类
{
public:
charm_cSquare[ROW][COL][2];
public:
ChessBoard();
voidshow();
};
3.2.2玩家类的声明
classPlayer{
private:
stringm_name;
charm_chessType;
intm_x;
intm_y;
ChessBoard*m_ptBoard;
public:
Player(stringname,charchessType):
m_name(name),m_chessType(chessType),m_ptBoard(NULL){}
voidattachToBoard(ChessBoard*ptBoard){m_ptBoard=ptBoard;}
boolisInChessBoard(intx,inty);
boolisLine(intx,inty);
boolisWin();
voidsetChess();
};
3.2.3棋盘显示为方形
voidChessBoard:
:
show()
{
system("cls");
For(inti=0;i { for(intj=0;j cout< } } 3.2.4判断棋子显示位置是否合理 boolPlayer: : isInChessBoard(intx,inty) { if(x returntrue; else returnfalse; } 3.2.5判断输赢 boolPlayer: : isWin() { returnisLine(m_x,m_y)? true: false; } 第四章结果与总结 4.1.运行过程及截图 4.1.1棋盘初始化模块 开始游戏时游戏界面是没有旗子的,会显示让aaa玩家首先输入第一个旗子的坐标,如下图 图3.1游戏开始界面 所以当游戏开始始,必须做初始化,实现程序如下: #include"ChessBoard.h" ChessBoard: : ChessBoard() { for(inti=1;i for(intj=1;j m_cSquare[i][j]=''; for(intj=0;j m_cSquare[0][j]=m_cSquare[ROW-1][j]='-'; for(inti=1;i m_cSquare[i][0]=m_cSquare[i][COL-1]='|'; } voidChessBoard: : show() { system("cls"); for(inti=0;i { for(intj=0;j cout< cout< } } 4.1.2输入错误提示 当某一方输入的棋子位置不合理时,会提示“输入有误,请玩家再次输入坐标”的提示。 结果如图3.2所示。 图3.2错误提示图 4.1.3结局判断模块 如何判断输赢: 当某一方下一子后,计算与当前棋子相邻的四个方向的同色棋子个数,大于四则分出胜负,否则继续,判断是否在同一个直线上的算法流程如下图: 图3.3结局判断模块 实现程序如下: boolPlayer: : isLine(intx,inty)[4] { for(intdirec=HORIZON;direc<=LEFTTOPTORIGHTBOTTOM;direc++) { inttempX,tempY,cnt=1; for(inti=-4;i<=4;i++) { if(i==0)continue; switch(direc) { caseHORIZON: tempX=x;tempY=y+i;break; caseVERTICAL: tempX=x+i;tempY=y;break; caseLEFTBOTTOMTORIGHTTOP: tempX=x-i;tempY=y+i;break; caseLEFTTOPTORIGHTBOTTOM: tempX=x+i;tempY=y+i;break; } if(isInChessBoard(tempX,tempY)&&m_ptBoard->m_cSquare[tempX][tempY]==m_chessType) cnt++; else cnt=0; if(cnt==5) returntrue; } }returnfalse; } 当程序认定某一方赢得比赛时,会提示这一方胜利,结果如图: 图3.4胜利结果图 总结 编辑小游戏这在我以前认为是遥不可及的,但是通过这次的五子棋设计我明白了,所有的东西对我们来讲都不是遥不可及的。 通过课程设计,我们也对《C++程序设计》这门课程有了更深入的了解。 它是一门计算机程序设计的重要技术。 通过这次的课程设计,我们丛一个函数到多个函数的有机集合到多个类的使用,其中经历了不少困惑和不解,但至少我们最后做到了,战胜了课程设计的恐惧,也收获了程序与运行成功的喜悦,有付出就有回报! 通过一个学期的学习,要把知识运用到这次的课程设计还是有点差劲,学到用时方恨少,发现自己学的不精通,只是懂的一点理论知识,对于一门技术来说,浅尝辄止是远远不够的,不够的。 还好通过去网上搜索、去图书馆查找资料、请教老师同学等各种方式克服了一个又一个的困难。 多样化的处理问题,才是成功之道,终于把设计给完成了! 通过这次实践,我对编程有了新的理解,编程并不是像大多数人说的那样充满单调,乏味。 一件东西的乐趣在于你能去接触去理解。 我接触了,我理解了。 让所学的运用于生活中,做到灵活运用,学有所成的兴奋是难得的宝贵。 我在其中感悟到乐趣了,相信这是我编程高手之路的一个重要转折点 参考文献 [1]钱能.C++程序设计[M].北京: 清华大学出版社.1999 [2]罗建军.朱丹军.C++程序设计教程[M].北京: 高等教育出版社.2004 [3]张国峰.C++语言及其程序设计教程[M].北京: 电子工业出版.1997 [4]和克智.C++程序设计(第2版)[M].西安: 西安交通大学出版社.1999 附录 main.cpp #include"ChessBoard.h" #include"Player.h" intmain() { ChessBoardboard; PlayerplayA("aaa",'*');//玩家aaa的棋子形状是'*' playA.attachToBoard(&board); PlayerplayB("bbb",'#');//玩家bbb的棋子形状是'#' playB.attachToBoard(&board); board.show(); while (1) { playA.setChess();//玩家A放下一个棋子 if(playA.isWin()) { cout<<"Winer! ";break; } board.show(); playB.setChess();//玩家B放下一个棋子 if(playB.isWin()) { cout<<"Winer! ";break; } board.show(); } system("pause"); return1; } ChessBoard..h #pragmaonce #defineROW15 #defineCOL15 #include usingnamespacestd; classChessBoard//棋盘类 { public: charm_cSquare[ROW][COL]; public: ChessBoard(); voidshow(); }; ChessBoard..cpp #include"ChessBoard.h" ChessBoard: : ChessBoard() { for(inti=1;i for(intj=1;j m_cSquare[i][j]=''; for(intj=0;j m_cSquare[0][j]=m_cSquare[ROW-1][j]='-'; for(inti=1;i m_cSquare[i][0]=m_cSquare[i][COL-1]='|'; } voidChessBoard: : show() { system("cls"); for(inti=0;i { for(intj=0;j cout< cout< } } Player.h #pragmaonce //宏定义四种检测五子是否连成线的方向 #defineHORIZON0 #defineVERTICAL1 #defineLEFTBOTTOMTORIGHTTOP2 #defineLEFTTOPTORIGHTBOTTOM3 #include"ChessBoard.h" #include usingnamespacestd; #include classPlayer { private: stringm_name; charm_chessType; intm_x; intm_y; ChessBoard*m_ptBoard; public: Player(stringname,charchessType): m_name(name),m_chessType(chessType),m_ptBoard(NULL){} voidattachToBoard(ChessBoard*ptBoard){m_ptBoard=ptBoard;} boolisInChessBoard(intx,inty); boolisLine(intx,inty); boolisWin(); voidsetChess(); }; Player.cpp #include"Player.h" boolPlayer: : isInChessBoard(intx,inty) { if(x returntrue; else returnfalse; } boolPlayer: : isLine(intx,inty) { for(intdirec=HORIZON;direc<=LEFTTOPTORIGHTBOTTOM;direc++)//四个方向,权宜之计 { inttempX,tempY,cnt=1;//cnt: 连续排列的同种类的棋子的个数,达到五个则该方赢 for(inti=-4;i<=4;i++) { if(i==0)continue;//此时循环一遍相当于什么都没做 switch(direc) { caseHORIZON: tempX=x;tempY=y+i;break; caseVERTICAL: tempX=x+i;tempY=y;break; caseLEFTBOTTOMTORIGHTTOP: tempX=x-i;tempY=y+i;break; caseLEFTTOPTORIGHTBOTTOM: tempX=x+i;tempY=y+i;break; } if(isInChessBoard(tempX,tempY)&&m_ptBoard->m_cSquare[tempX][tempY]==m_chessType) cnt++; else cnt=0; if(cnt==5)//五子成线 returntrue; } }returnfalse; } voidPlayer: : setChess() { cout<<"请输入玩家"< "< cin>>m_x>>m_y; while(cin.fail()||m_ptBoard->m_cSquare[m_x][m_y]! ='')//输入不是int型变量或者此位置上已有棋子 { cout<<"输入有误,请再次输入玩家"< "< cin.clear();//清除fail状态 cin.sync();//清除缓冲区 cin>>m_x>>m_y; } if(isInChessBoard(m_x,m_y)) m_ptBoard->m_cSquare[m_x][m_y]=m_chessType; } boolPlayer: : isWin() { returnisLine(m_x,m_y)? true: false; }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 五子棋 游戏 课程设计 说明书
![提示](https://static.bdocx.com/images/bang_tan.gif)