黑白棋 联系客服

发布时间 : 星期一 文章黑白棋更新完毕开始阅读

1. 设计背景

1.1黑白棋起源

黑白棋是19世纪末英国人发明的。直到上个世纪70年代一个日本人将其发展,借用莎士比亚名剧奥赛罗(othello)为这个游戏重新命名,也就是现在大家玩的黑白棋。为何借用莎士比亚名剧呢?是因为奥赛罗是莎士比亚一个名剧的男主角。他是一个黑人,妻子是白人,因受小人挑拨,怀疑妻子不忠一直情海翻波,最终亲手把妻子杀死。后来真相大白,奥赛罗懊悔不已,自杀而死。黑白棋就是借用这个黑人白人斗争的故事而命名。

1.2程序功能

只有在可以吃到对方棋子的方格里落子

吃子规则:采用夹吃的原则,思考黑子可落子的位置。当黑子落子之后,则夹在两黑子中间的白子都降变为黑子。

夹子的方向包含:水平、竖直、斜对角。 可以选择游戏的难度和下棋顺序。

2.设计方案

2.1设计思路

程序表面看,这是一个二维平面图,所以数据用二维数组来表示,数组两个下标可以表示棋盘上的位置,数组元素的值代表七个上的状态,共有三种情况,分别是0代表空格,1代表白棋,2代表黑棋。这样程序的主要工作是接收棋手按键操作,棋手用鼠标控制光标移动。如果无棋可走,则结束。一旦棋手落子,先判断是否是有效位置,也就是说已经有棋子的位置不能重叠落子,然后再判断该位置能否吃掉对方的棋子,如果条件满座则在该位置落子,落子是执行者几个步骤,先调用画棋子函数,将棋盘的相应位置上画上棋子,再调用吃棋子函数,将对手的棋子变成自己颜色的棋子,然后根据吃掉对手棋子的个数,给自己加上相应的分数和给对手减去相应的分数,再将数组中的

相应元素赋值,标志该位置已经落子,最后将落子的权限交给对手。

2.2游戏规则

如果玩家在棋盘上没有地方可以下子,则该玩家对手可以连下。双方都没有棋子可以下时棋局结束,以棋子数目来计算胜负,棋子多的一方获胜。

在棋盘还没有下满时,如果一方的棋子已经被对方吃光,则棋局也结束。将对手棋子吃光的一方获胜。

黑白似于棋盘游戏“奥赛罗 (Othello)”,是一种得分会戏剧性变化并且需要长时间思考的策略性游戏。

黑白棋盘上有 64 个可以放置黑白棋子的方格(类似于国际象棋和跳棋)。游戏的目标是使棋盘上自己颜色的棋子数超过对手的棋子数。

该游戏非常复杂,其名称就暗示着结果的好坏可能会迅速变化。

当游戏双方都不能再按规则落子时,游戏就结束了。通常,游戏结束时棋盘上会摆满了棋子。结束时谁的棋子最多谁就是赢家。

2.3模块设计

走棋程序如下:

int CBwfind::black(int tb[][8] ) { }

int CBwfind::white(int tb[][8] ) {

int Wn=0,i,j; int Bn=0,i,j; for(i=0;i<8;i++)

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

if(tb[i][j]-1==0) Bn++;

return Bn;

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

if(tb[i][j]==-1) Wn++;

return Wn;

}

BOOL CBwfind::search(int tb[][8] , int flag) { int i,j;

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

if(judge(tb,i,j,flag)) return TRUE;

return FALSE;

}

int CBwfind::findfirst(int tb[][8] , int &step, int &flag, int cut) { int value=0,max=-100000,min=100000,k=0,i,j; int temp[8][8]; if(step==depth){ return valuefirst(tb); }

for(i=0;i<8;i++)for(j=0;j<8;j++) temp[i][j]=tb[i][j]; for(i=0;i<8;i++)for(j=0;j<8;j++){ if(judge(tb,i,j,flag)){ int ii,jj; value=0;

k=1;//′??úo?àíμ?2?×ó

newboard(tb,i,j,flag);

flag=-flag; step++;

if(-flag==ComChoice){ }

if(-flag==ManChoice){ } step--; flag=-flag; //???′???ì

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

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

tb[ii][jj]=temp[ii][jj]; Corner(tb,i,j,value); LineSense(tb,i,j,value);

value+=findfirst(tb,step,flag,min); LineSense(tb,i,j,value); Corner(tb,i,j,value);

value+=findfirst(tb,step,flag,max);

if(flag-ManChoice==0&&value

return value;

if(flag-ComChoice==0&&value>cut)

return value;

if(flag-ManChoice==0){ }

if(flag-ComChoice==0){

if(value>max){

max=value; if(value

min=value;