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;
相关推荐: