C++实现黑白棋

C++实现黑白棋

ID:39908783

大小:60.50 KB

页数:11页

时间:2019-07-14

C++实现黑白棋_第1页
C++实现黑白棋_第2页
C++实现黑白棋_第3页
C++实现黑白棋_第4页
C++实现黑白棋_第5页
资源描述:

《C++实现黑白棋》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、黑白棋规则介绍黑白棋是由黑方和白方两人进行的益智游戏。棋盘为N×N方格,黑白棋总共使用N2个棋子,每个棋子分正反两面,分别是黑色和白色。轮到一方下棋时,必须把棋下在与对方棋子相邻的空位上,要求所下的棋子和原有的已方棋子夹住对方的至少一个棋子(横竖斜夹均可),然后把被夹住的子变成己方的颜色(也叫吃子)。下棋过程中,任何棋子既不会从棋盘上拿走,也不会从一个格子移到另一个格子,吃子时,不会发生连锁反应,吃进的棋子不能再夹吃其他的子。当双方都无棋可下,或者方格全部占满后,棋局结束,子多的一方为胜方。黑白棋人工智能的实现

2、我们这里取棋盘大小为10×10个方格,用数组intstate[10][10]来表示棋盘的状态,其中0表示方格为空,-1表示用黑方的棋,1表示白方的棋。在10×10的棋盘上,除了那些已经有子的地方不能走子外,那些不能吃子的点也不能走。如何判断某个点(x,y)能不能走子呢?通过分析黑白棋的规则我们知道,在这一个方格上的八个方向的任何一个方向上只要满足:在这个方向与之相邻的有连续若干个对方的棋子,接着有一个己方的子,我们就可以肯定这一点能够走子。所以我定义了一个数组intdirstate[8](数组从右逆时针开始,如

3、dirstate[0]表示右,dirstate[1]表示右上,以此类推)来表示个方向的状态,值1表示在这个方向上可以吃掉对方的子,值0则表示不能,同时定义一个函数movedir(intx,inty,intmover)来判断各方向的状态,函数movedir的具体实现见源代码,这里以右方向为例说明,其他各个方向类似,右方向的判断可以用以下语句实现:inttx=x+1,ty=y,step=0;//tx,ty分别用来表示右方向各点在数组中的索引dirstate[0]=0;//初始化为不能吃子while(1){if(tx

4、>9)break;//处于边界,退出循环,该方向不能吃子if(state[ty][tx]==0)break;//空子,退出循环,该方向不能吃子if(state[ty][tx]!=mover)step++;//(tx,ty)所在的方格上的棋不一样,step加1,有连//续step个对方的棋子与(x,y)上的棋相邻else{if(step>0)dirstate[0]=1;break;}//(tx,ty)所在的方格上的棋一样,同时在(tx,ty)//和(x,y)之间如果有连续step个对方的棋子,则、//表示该方向上

5、可以吃子,修改dirstate[0]状态。tx++;}我们需要让计算机自己决定下一步走哪儿,必须让它知道走哪儿对它自己最有利,解决这个问题的基本思想就是对这个有利进行量化,我们有一个非常简单的方法就可以实现这个量化,那就是下该子能吃掉对方子的数目为该步的有利值,为了让计算机算出该值,我定义了一个intmovetotal(intx,inty,intmover)函数,该函数返回该步能吃掉对方的子数,他的主要实现跟movedir类似,也是对各个方向进行统计,因此也可以用此函数来判断该位置能不能放子:inttotal=

6、0;//total用来统计总的能够吃掉对方的子数,函数最后返回此值inttx=x+1,ty=y,step=0;while(1){if(tx>9)break;if(state[ty][tx]==0)break;if(state[ty][tx]!=mover)step++;else{if(step>0)total+=step;break;}//与movedir不同的地方,这里将step加到//total这个统计整数里面tx++;}有了这些函数,电脑就可以用这个有利值选择一个位置下棋,因此接下来我们就要考虑黑白棋的下

7、棋后棋盘状态的变化了。我们知道,当我们在(x,y)这个位置上下一个棋后,就会引起这个位置的八个方向上的符合条件(棋子和原有的已方棋子夹住对方的至少一个棋子)的方格上棋子状态的改变。为此我们定义了函数move(intx,inty,intmover)实现这个功能,其中x,y为下棋的位置,mover为-1表示己方用黑棋,1表示己方用白棋,函数move的主要实现如下(以右方向为例,详细请看源代码):movedir(x,y,mover);//调用movedir函数,得到dirstate数组表示各个方向的状态state[y

8、][x]=mover;//在该位置上下棋,改变棋盘在该位置的状态,将空状态改为moverinttx=x,ty=y;if(dirstate[0]==1)//为1则表示该方向可以吃掉对方的棋子,将已方棋子夹住对方棋子改//为己方{while(state[ty][++tx]==mover*(-1))//循环直到遇到己方的棋子{state[ty][tx]=mover;//将对方的棋子改为己方的

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。