黑白棋程序设计实验报告C++版

上传人:飞*** 文档编号:38076676 上传时间:2018-04-26 格式:PDF 页数:24 大小:236.79KB
返回 下载 相关 举报
黑白棋程序设计实验报告C++版_第1页
第1页 / 共24页
黑白棋程序设计实验报告C++版_第2页
第2页 / 共24页
黑白棋程序设计实验报告C++版_第3页
第3页 / 共24页
黑白棋程序设计实验报告C++版_第4页
第4页 / 共24页
黑白棋程序设计实验报告C++版_第5页
第5页 / 共24页
点击查看更多>>
资源描述

《黑白棋程序设计实验报告C++版》由会员分享,可在线阅读,更多相关《黑白棋程序设计实验报告C++版(24页珍藏版)》请在金锄头文库上搜索。

1、2 海南大学课程论文课程名称:数据结构课程设计题目名称:黑白棋学院:信息学院专业班级:姓名:学号:评阅意见评阅成绩评阅教师:2011年12 月 17 日3 目录一、 黑白棋简介2 二、程序设计思路及实现界面图3 三、程序设计算法性能分析6 四、实验总结6 五、实验代码7 4 一、 黑白棋简介黑白棋,又叫反棋(Reversi)、奥赛罗棋 (Othello) ,苹果棋,翻转棋。黑白棋的棋子和围棋类似。 但它的下法与围棋的很不相同。黑白棋是由黑方和白方两人进行的益智游戏。棋盘为 NN 方格,黑白棋总共使用N2个棋子,每个棋子分正反两面,分别是黑色和白色。轮到一方下棋时, 必须把棋下在与对方棋子相邻的

2、空位上,要求所下的棋子和原有的已方棋子夹住对方的至少一个棋子( 横竖斜夹均可 ) ,然后把被夹住的子变成己方的颜色( 也叫吃子 ) 。下棋过程中,任何棋子既不会从棋盘上拿走,也不会从一个格子移到另一个格子, 吃子时,不会发生连锁反应,吃进的棋子不能再夹吃其他的子。当双方都无棋可下,或者方格全部占满后,棋局结束,子多的一方为胜方。5 二、程序设计思路及游戏实现界面1、设计初始化棋盘函数2、复制棋盘函数3、显示棋盘函数4、选择下棋类型4、计算可落子的位置个数, 及该位置落子后翻过的棋子的个数5、设置棋子的稳定性( 计算得分的依据) ,空白处除外6、评价棋手得分游戏开始选择类型和棋子:6 打印棋盘棋

3、手开始下棋输入下棋的位置:游戏结束,统计棋数并分出胜负:7 一局结束后选择是否继续:8 三、性能分析人机对战中稳定性算法用了8 层循环,所以程序的性能为O (N8)级别四、实验总结这个程序主要用来实现黑白棋的人人对战,程序中的人机对战的算法主要参考别的程序,而人人对战则相对简单所以以自己的能力就只实现了其中的人人对战部分,由于没有自学 MFC ,所以界面不是很友好,直接在doc 环境下运行,但程序总的实现了黑白棋的基本功能,能够在doc 下显示棋盘,判断棋手可下棋位置及最后判断出胜负。9 五、程序代码:#include using namespace std; int const MAX=10

4、000; enum Color WHITE=-1,BLANK,BLACK /是否能落子/ 黑子; class Choice public: int posX; int posY; int score; ; class Chessman public: enum Color color; unsigned stable; /* 棋子的稳定性 (08),若棋子为BLANK 则表示该位置落子后可翻过的棋子个数. */ ; / 即下此位置后对方的棋变为自己的棋子的数目class Chessboard / 棋盘 public: Chessman cell88; / 定义棋盘中有8*8 个格子unsign

5、ed whiteNum; / 白棋数目unsigned blackNum; / 黑棋数void initChessboard(Chessboard *board); void clone( Chessboard *boardDest,const Chessboard *boardSource); void view( Chessboard *board); int judge( Chessboard *board,enum Color player); int putChess( Chessboard *board,Choice *choice,enum Color player); 10 v

6、oid setStable( Chessboard *board); int evaluate(Chessboard *board,enum Color player); ; void Chessboard:initChessboard(Chessboard *board) / 初始化棋盘 / 声明一个 Chessboard结构体 board int i,j; board-whiteNum=2; board-blackNum=2; for(i=0;icellij.color=BLANK; board-cellij.stable=0; board-cell33.color=board-cell4

7、4.color=BLACK; board-cell34.color=board-cell43.color=WHITE; / 复制棋盘 . void Chessboard:clone( Chessboard *boardDest,const Chessboard *boardSource) int i,j; boardDest-whiteNum=boardSource-whiteNum; boardDest-blackNum=boardSource-blackNum; for(i=0;icellij.color=boardSource-cellij.color; boardDest-cellij

8、.stable=boardSource-cellij.stable; / 显示棋盘 . void Chessboard:view( Chessboard *board) int i,j; coutcellij.color) case BLACK: coutcellij.stable) coutwhiteNumblackNumcellij.stable) int Chessboard:judge( Chessboard *board,enum Color player) int i,j; 12 unsigned num=0; for(i=0;icellij.color=BLANK) int x,

9、y; board-cellij.stable=0; for(x=-1;x=0 else if(board-celli2j2.color=player) board-cellij.stable+=player*num2; break; else if(board-celli2j2.color=BLANK) break; if(board-cellij.stable) num+; 13 return num; / 落子 ,翻子 . int Chessboard:putChess( Chessboard *board,Choice *choice,enum Color player) int i=c

10、hoice-posX,j=choice-posY; int x,y; if(board-cellij.color!=BLANK | board-cellij.stable=0 | player=BLANK) return -1; board-cellij.color=player; board-cellij.stable=0; if(player=WHITE) board-whiteNum+; else if(player=BLACK) board-blackNum+; for(x=-1;x=0 else if(board-celli2j2.color=player) board-whiteN

11、um+=(player*WHITE)*num; board-blackNum+=(player*BLACK)*num; 14 for(i2-=x,j2-=y;num0;num-,i2-=x,j2-=y) board-celli2j2.color=player; board-celli2j2.stable=0; break; else if(board-celli2j2.color=BLANK) break; return 0; /* * 设置棋子的稳定性(计算得分的依据),空白处除外. */ void Chessboard:setStable( Chessboard *board) int i

12、,j; for(i=0;icellij.color!=BLANK) int x,y; board-cellij.stable=1; for(x=-1;x=0 break; for(i2=i-x,j2=j-y;i2=0 break; if(flag) /* 在某一条线上稳定*/ board-cellij.stable+; /* * 评价棋手得分. */ int Chessboard:evaluate(Chessboard *board,enum Color player) int value=0; int i,j; setStable(board); for(i=0;icellij.color)

13、*(board-cellij.stable); value+=64*board-cell00.color; value+=64*board-cell07.color; value+=64*board-cell70.color; value+=64*board-cell77.color; value-=32*board-cell11.color; value-=32*board-cell16.color; value-=32*board-cell61.color; value-=32*board-cell66.color; return value*player; / 考虑 step 步,选择最

14、优方案.采用最大最小博弈和- 剪裁算法Choice * maximin( Chessboard *board,enum Color player,int step,int min,int max, Choice *choice) int i,j,k,num; Choice *allChoices; choice-score=-MAX; choice-posX=-1; choice-posY=-1; num=board-judge(board,player); if(num=0) /* 无处落子*/ if(board-judge(board,(enum Color)-player) /* 对方可以落子,让对方下 .*/ Chessboard tempBoard; Choice nextChoice; Choice *pNextChoice= board-clone( pNextChoice=maximin( choice-score=-pNextChoice-score; choice-posX=-1; choice-posY=-1; 17 return choice; else /* 对方也无处落子,游戏结束 . */ int value=WHITE*(board-whiteNum) + BLACK*(board-blackNum); if(play

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 研究报告 > 综合/其它

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号