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

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

2海南大学课程论文课程名称:数据结构课程设计题目名称:黑白棋学院:信息学院专业班级:姓名:学号:评阅意见评阅成绩评阅教师:2011年12月17日3目录一、黑白棋简介……………………………………………………2二、程序设计思路及实现界面图……………………………………3三、程序设计算法性能分析…………………………………………6四、实验总结…………………………………………………………6五、实验代码…………………………………………………………74一、黑白棋简介黑白棋,又叫反棋(Reversi)、奥赛罗棋(Othello),苹果棋,翻转棋。黑白棋的棋子和围棋类似。但它的下法与围棋的很不相同。黑白棋是由黑方和白方两人进行的益智游戏。棋盘为N×N方格,黑白棋总共使用N2个棋子,每个棋子分正反两面,分别是黑色和白色。轮到一方下棋时,必须把棋下在与对方棋子相邻的空位上,要求所下的棋子和原有的已方棋子夹住对方的至少一个棋子(横竖斜夹均可),然后把被夹住的子变成己方的颜色(也叫吃子)。下棋过程中,任何棋子既不会从棋盘上拿走,也不会从一个格子移到另一个格子,吃子时,不会发生连锁反应,吃进的棋子不能再夹吃其他的子。当双方都无棋可下,或者方格全部占满后,棋局结束,子多的一方为胜方。5二、程序设计思路及游戏实现界面1、设计初始化棋盘函数2、复制棋盘函数3、显示棋盘函数4、选择下棋类型4、计算可落子的位置个数,及该位置落子后翻过的棋子的个数5、设置棋子的稳定性(计算得分的依据),空白处除外6、评价棋手得分游戏开始选择类型和棋子:6打印棋盘棋手开始下棋输入下棋的位置:游戏结束,统计棋数并分出胜负:7一局结束后选择是否继续:8三、性能分析人机对战中稳定性算法用了8层循环,所以程序的性能为O(N8)级别四、实验总结这个程序主要用来实现黑白棋的人人对战,程序中的人机对战的算法主要参考别的程序,而人人对战则相对简单所以以自己的能力就只实现了其中的人人对战部分,由于没有自学MFC,所以界面不是很友好,直接在doc环境下运行,但程序总的实现了黑白棋的基本功能,能够在doc下显示棋盘,判断棋手可下棋位置及最后判断出胜负。9五、程序代码:#includeiostreamusingnamespacestd;intconstMAX=10000;enumColor{WHITE=-1,BLANK,BLACK//是否能落子//黑子};classChoice{public:intposX;intposY;intscore;};classChessman{public:enumColorcolor;unsignedstable;/*棋子的稳定性(0~8),若棋子为BLANK则表示该位置落子后可翻过的棋子个数.*/};//即下此位置后对方的棋变为自己的棋子的数目classChessboard//棋盘{public:Chessmancell[8][8];//定义棋盘中有8*8个格子unsignedwhiteNum;//白棋数目unsignedblackNum;//黑棋数voidinitChessboard(Chessboard*board);voidclone(Chessboard*boardDest,constChessboard*boardSource);voidview(Chessboard*board);intjudge(Chessboard*board,enumColorplayer);intputChess(Chessboard*board,Choice*choice,enumColorplayer);10voidsetStable(Chessboard*board);intevaluate(Chessboard*board,enumColorplayer);};voidChessboard::initChessboard(Chessboard*board)//初始化棋盘{//声明一个Chessboard结构体boardinti,j;board-whiteNum=2;board-blackNum=2;for(i=0;i8;i++){for(j=0;j8;j++){board-cell[i][j].color=BLANK;board-cell[i][j].stable=0;}}board-cell[3][3].color=board-cell[4][4].color=BLACK;board-cell[3][4].color=board-cell[4][3].color=WHITE;}//复制棋盘.voidChessboard::clone(Chessboard*boardDest,constChessboard*boardSource){inti,j;boardDest-whiteNum=boardSource-whiteNum;boardDest-blackNum=boardSource-blackNum;for(i=0;i8;i++){for(j=0;j8;j++){boardDest-cell[i][j].color=boardSource-cell[i][j].color;boardDest-cell[i][j].stable=boardSource-cell[i][j].stable;}}}//显示棋盘.voidChessboard::view(Chessboard*board){inti,j;cout\n---;for(i=0;i8;i++)11{cout---i+1;}cout\n────────────────\n;for(i=0;i8;i++){couti+1--│;for(j=0;j8;j++){switch(board-cell[i][j].color){caseBLACK:cout○│;break;caseWHITE:cout●│;break;caseBLANK:if(board-cell[i][j].stable){cout+│;}else{cout│;}break;default:/*棋子颜色错误*/cout*│;}}cout\n────────────────\n;}cout白棋(●)个数为:board-whiteNum;cout黑棋(○)个数为:board-blackNumendlendlendl;}//计算可落子的位置个数,及该位置落子后翻过的棋子的个数(board-cell[i][j].stable)intChessboard::judge(Chessboard*board,enumColorplayer){inti,j;12unsignednum=0;for(i=0;i8;i++){for(j=0;j8;j++){if(board-cell[i][j].color==BLANK){intx,y;board-cell[i][j].stable=0;for(x=-1;x=1;x++){for(y=-1;y=1;y++){if(x||y)/*8个方向*/{inti2,j2;unsignednum2=0;for(i2=i+x,j2=j+y;i2=0&&i2=7&&j2=0&&j2=7;i2+=x,j2+=y){if(board-cell[i2][j2].color==(enumColor)-player){num2++;}elseif(board-cell[i2][j2].color==player){board-cell[i][j].stable+=player*num2;break;}elseif(board-cell[i2][j2].color==BLANK){break;}}}}}if(board-cell[i][j].stable){num++;}}}13}returnnum;}//落子,翻子.intChessboard::putChess(Chessboard*board,Choice*choice,enumColorplayer){inti=choice-posX,j=choice-posY;intx,y;if(board-cell[i][j].color!=BLANK||board-cell[i][j].stable==0||player==BLANK){return-1;}board-cell[i][j].color=player;board-cell[i][j].stable=0;if(player==WHITE){board-whiteNum++;}elseif(player==BLACK){board-blackNum++;}for(x=-1;x=1;x++){for(y=-1;y=1;y++){if(x||y)/*8个方向*/{inti2,j2;unsignednum=0;for(i2=i+x,j2=j+y;i2=0&&i2=7&&j2=0&&j2=7;i2+=x,j2+=y){if(board-cell[i2][j2].color==(enumColor)-player){num++;}elseif(board-cell[i2][j2].color==player){board-whiteNum+=(player*WHITE)*num;board-blackNum+=(player*BLACK)*num;14for(i2-=x,j2-=y;num0;num--,i2-=x,j2-=y){board-cell[i2][j2].color=player;board-cell[i2][j2].stable=0;}break;}elseif(board-cell[i2][j2].color==BLANK){break;}}}}}return0;}/**设置棋子的稳定性(计算得分的依据),空白处除外.*/voidChessboard::setStable(Chessboard*board){inti,j;for(i=0;i8;i++){for(j=0;j8;j++){if(board-cell[i][j].color!=BLANK){intx,y;board-cell[i][j].stable=1;for(x=-1;x=1;x++){for(y=-1;y=1;y++){/*4个方向*/if(x==0&&y==0){x=2;y=2;}15else{inti2,j2,flag=2;for(i2=i+x,j2=j+y;i2=0&&i2=7&&j2=0&&j2=7;i2+=x,j2+=y){if(board-cell[i2][j2].color!=board-cell[i][j].color){flag--;break;}}for(i2=i-x,j2=j-y;i2=0&&i2=7&&j2=0&&j2=7;i2-=x,j2-=y){if(board-cell[i2][j2].color!=board-cell[i][j].color){flag--;break;}}if(flag)/*在某一条线上稳定*/{board-cell[i][j].stable++;}}}}}}}}/**评价棋手得分.*/intChessboard::evaluate(Chessboard*board,enumColorplayer){intvalue=0;inti,j;setStable(board);for(i=0;i8;i++)16{for(j=0;j8;j++){value+=(board-cell[i][j].color)*(board-cell[i][j].stable);}}value+=64*board-cell[0][0].color;value+=64*board-cell[0

1 / 24
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功