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

上传人:b****3 文档编号:4149126 上传时间:2022-11-28 格式:DOCX 页数:27 大小:151.76KB
下载 相关 举报
黑白棋程序设计实验报告C++版.docx_第1页
第1页 / 共27页
黑白棋程序设计实验报告C++版.docx_第2页
第2页 / 共27页
黑白棋程序设计实验报告C++版.docx_第3页
第3页 / 共27页
黑白棋程序设计实验报告C++版.docx_第4页
第4页 / 共27页
黑白棋程序设计实验报告C++版.docx_第5页
第5页 / 共27页
点击查看更多>>
下载资源
资源描述

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

《黑白棋程序设计实验报告C++版.docx》由会员分享,可在线阅读,更多相关《黑白棋程序设计实验报告C++版.docx(27页珍藏版)》请在冰豆网上搜索。

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

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

海南大学课程论文

 

课程名称:

数据结构课程设计

题目名称:

黑白棋

学院:

信息学院

专业班级:

        

 姓  名:

         

   学  号:

 

评阅意见

 

评阅成绩

评阅教师:

2011年12月17日

 

一、黑白棋简介……………………………………………………2

二、程序设计思路及实现界面图……………………………………3

三、程序设计算法性能分析…………………………………………6

四、实验总结…………………………………………………………6

五、实验代码…………………………………………………………7

一、黑白棋简介

黑白棋,又叫反棋(Reversi)、奥赛罗棋(Othello),苹果棋,翻转棋。

黑白棋的棋子和围棋类似。

但它的下法与围棋的很不相同。

黑白棋是由黑方和白方两人进行的益智游戏。

棋盘为N×N方格,黑白棋总共使用N2个棋子,每个棋子分正反两面,分别是黑色和白色。

轮到一方下棋时,必须把棋下在与对方棋子相邻的空位上,要求所下的棋子和原有的已方棋子夹住对方的至少一个棋子(横竖斜夹均可),然后把被夹住的子变成己方的颜色(也叫吃子)。

下棋过程中,任何棋子既不会从棋盘上拿走,也不会从一个格子移到另一个格子,吃子时,不会发生连锁反应,吃进的棋子不能再夹吃其他的子。

当双方都无棋可下,或者方格全部占满后,棋局结束,子多的一方为胜方。

 

二、程序设计思路及游戏实现界面

1、设计初始化棋盘函数

2、复制棋盘函数

3、显示棋盘函数

4、选择下棋类型

4、计算可落子的位置个数,及该位置落子后翻过的棋子的个数

5、设置棋子的稳定性(计算得分的依据),空白处除外

6、评价棋手得分

游戏开始选择类型和棋子:

打印棋盘棋手开始下棋输入下棋的位置:

游戏结束,统计棋数并分出胜负:

一局结束后选择是否继续:

三、性能分析

人机对战中稳定性算法用了8层循环,所以程序的性能为O(N8)级别

 

四、实验总结

这个程序主要用来实现黑白棋的人人对战,程序中的人机对战的算法主要参考别的程序,而人人对战则相对简单所以以自己的能力就只实现了其中的人人对战部分,由于没有自学MFC,所以界面不是很友好,直接在doc环境下运行,但程序总的实现了黑白棋的基本功能,能够在doc下显示棋盘,判断棋手可下棋位置及最后判断出胜负。

五、程序代码:

#include

usingnamespacestd;

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);

voidsetStable(Chessboard*board);

intevaluate(Chessboard*board,enumColorplayer);

};

voidChessboard:

:

initChessboard(Chessboard*board)//初始化棋盘

{//声明一个Chessboard结构体board

inti,j;

board->whiteNum=2;

board->blackNum=2;

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

{

for(j=0;j<8;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;i<8;i++)

{

for(j=0;j<8;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;i<8;i++)

{

cout<<"---"<

}

cout<<"\n────────────────\n";

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

{

cout<

for(j=0;j<8;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<<"白棋(●)个数为:

"<whiteNum<<"";

cout<<"黑棋(○)个数为:

"<blackNum<

}

//计算可落子的位置个数,及该位置落子后翻过的棋子的个数(board->cell[i][j].stable)

intChessboard:

:

judge(Chessboard*board,enumColorplayer)

{

inti,j;

unsignednum=0;

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

{

for(j=0;j<8;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++;

}

}

}

}

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;

for(i2-=x,j2-=y;num>0;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;i<8;i++)

{

for(j=0;j<8;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;

}

else

{

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;i<8;i++)

{

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

{

value+=(board->cell[i][j].color)*(board->cell[i][j].stable);

}

}

value+=64*board->cell[0][0].color;

value+=64*board->cell[0][7].color;

value+=64*board->cell[7][0].color;

value+=64*board->cell[7][7].color;

value-=32*board->cell[1][1].color;

value-=32*board->cell[1][6].color;

value-=32*board->cell[6][1].color;

value-=32*board->cell[6][6].color;

returnvalue*player;

}

//考虑step步,选择最优方案.采用最大最小博弈和α-β剪裁算法

Choice*maximin(Chessboard*board,enumColorplayer,intstep,intmin,intmax,Choice*choice)

{

inti,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,(enumColor)-player))/*对方可以落子,让对方下.*/

{

ChessboardtempBoard;

ChoicenextChoice;

Choice*pNextChoice=&nextChoice;

board->clone(&tempBoard,board);

pNextChoice=maximin(&tempBoard,(enumColor)-player,step-1,-max,-min,pNextChoice);

choice->score=-pNextChoice->score;

choice->posX=-1;

choice->posY=-1;

returnchoice;

}

else/*对方也无处落子,游戏结束.*/

{

intvalue=WHITE*(board->whiteNum)+BLACK*(board->blackNum);

if(player*value>0)

{

choice->score=MAX-1;

}

elseif(player*value<0)

{

choice->score=-MAX+1;

}

else

{

choice->score=0;

}

returnchoice;

}

}

if(step<=0)/*已经考虑到step步,直接返回得分*/

{

choice->score=board->evaluate(board,player);

returnchoice;

}

allChoices=(Choice*)malloc(sizeof(Choice)*num);

k=0;

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

{

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

{

if(i==0||i==7||j==0||j==7)

{

if(board->cell[i][j].color==BLANK&&board->cell[i][j].stable)

{

allChoices[k].score=-MAX;

allChoices[k].posX=i;

allChoices[k].posY=j;

k++;

}

}

}

}

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

{

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

{

if((i==2||i==5||j==2||j==5)&&(i>=2&&i<=5&&j>=2&&j<=5))

{

if(board->cell[i][j].color==BLANK&&board->cell[i][j].stable)

{

allChoices[k].score=-MAX;

allChoices[k].posX=i;

allChoices[k].posY=j;

k++;

}

}

}

}

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

{

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

{

if((i==1||i==6||j==1||j==6)&&(i>=1&&i<=6&&j>=1&&j<=6))

{

if(board->cell[i][j].color==BLANK&&board->cell[i][j].stable)

{

allChoices[k].score=-MAX;

allChoices[k].posX=i;

allChoices[k].posY=j;

k++;

}

}

}

}

for(k=0;k

{

ChessboardtempBoard;

ChoicethisChoice,nextChoice;

Choice*pNextChoice=&nextChoice;

thisChoice=allChoices[k];

board->clone(&tempBoard,board);

board->putChess(&tempBoard,&thisChoice,player);

pNextChoice=maximin(&tempBoard,(enumColor)-player,step-1,-max,-min,pNextChoice);

thisChoice.score=-pNextChoice->score;

if(thisChoice.score>min&&thisChoice.score

{

min=thisChoice.score;

choice->score=thisChoice.score;

choice->posX=thisChoice.posX;

choice->posY=thisChoice.posY;

}

elseif(thisChoice.score>=max)/*好的超乎预计*/

{

choice->score=thisChoice.score;

choice->posX=thisChoice.posX;

choice->posY=thisChoice.posY;

break;

}

/*不如已知最优值*/

}

free(allChoices);

returnchoice;

}

intmain(void)/////////////主函数

{

Chessboardboard;

Chessboard*pBoard=&board;

enumColorplayer=BLANK,nowPlayer=BLACK;//声明两个enum枚举变量player,nowplayer

Choicechoice;

Choice*pChoice=&choice;

intdif=-1,step=4,success=0;

charrestart='';

start:

/////////////////////////////////////////////

player=BLANK;/////////////////////////////////////////////

nowPlayer=BLACK;

dif=-1;

step=4;

restart='';

intb;

cout<<"输入1为人人对战,否则为人机对战:

";

cin>>b;

if(b==1

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销 > 经济市场

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1