[C实现黑白棋.docVIP

  1. 1、本文档共11页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
[C实现黑白棋

黑白棋规则介绍 黑白棋是由黑方和白方两人进行的益智游戏。棋盘为N×N方格,黑白棋总共使用N2个棋子,每个棋子分正反两面,分别是黑色和白色。轮到一方下棋时,必须把棋下在与对方棋子相邻的空位上,要求所下的棋子和原有的已方棋子夹住对方的至少一个棋子(横竖斜夹均可),然后把被夹住的子变成己方的颜色(也叫吃子)。下棋过程中,任何棋子既不会从棋盘上拿走,也不会从一个格子移到另一个格子,吃子时,不会发生连锁反应,吃进的棋子不能再夹吃其他的子。当双方都无棋可下,或者方格全部占满后,棋局结束,子多的一方为胜方。 我们这里取棋盘大小为10×10个方格,用数组int state[10][10]来表示棋盘的状态,其中0表示方格为空,-1表示用黑方的棋,1表示白方的棋。 在10×10的棋盘上,除了那些已经有子的地方不能走子外,那些不能吃子的点也不能走。如何判断某个点(x, y)能不能走子呢?通过分析黑白棋的规则我们知道,在这一个方格上的八个方向的任何一个方向上只要满足:在这个方向与之相邻的有连续若干个对方的棋子,接着有一个己方的子,我们就可以肯定这一点能够走子。所以我定义了一个数组int dirstate[8](数组从右逆时针开始,如dirstate[0]表示右,dirstate[1]表示右上,以此类推)来表示个方向的状态,值1表示在这个方向上可以吃掉对方的子,值0则表示不能,同时定义一个函数movedir(int x,int y,int mover)来判断各方向的状态,函数movedir的具体实现见源代码,这里以右方向为例说明,其他各个方向类似,右方向的判断可以用以下语句实现: int tx=x+1,ty=y,step=0;//tx,ty分别用来表示右方向各点在数组中的索引 dirstate[0]=0;//初始化为不能吃子 while(1) { if(tx9) break;//处于边界,退出循环,该方向不能吃子 if(state[ty][tx]==0) break; //空子,退出循环,该方向不能吃子 if(state[ty][tx]!=mover) step++;//(tx,ty)所在的方格上的棋不一样,step加1,有连 //续step个对方的棋子与(x,y)上的棋相邻 else {if(step0) dirstate[0]=1;break;}// (tx,ty)所在的方格上的棋一样,同时在(tx,ty) //和(x,y)之间如果有连续step个对方的棋子,则、 //表示该方向上可以吃子,修改dirstate[0]状态。 tx++; } 我们需要让计算机自己决定下一步走哪儿,必须让它知道走哪儿对它自己最有利,解决这个问题的基本思想就是对这个有利进行量化,我们有一个非常简单的方法就可以实现这个量化,那就是下该子能吃掉对方子的数目为该步的有利值,为了让计算机算出该值,我定义了一个int movetotal(int x,int y,int mover)函数,该函数返回该步能吃掉对方的子数,他的主要实现跟movedir类似,也是对各个方向进行统计,因此也可以用此函数来判断该位置能不能放子: int total=0;//total用来统计总的能够吃掉对方的子数,函数最后返回此值 int tx=x+1,ty=y,step=0; while(1) { if(tx9) break; if(state[ty][tx]==0) break; if(state[ty][tx]!=mover) step++; else {if(step0) total+=step;break;}//与movedir不同的地方,这里将step加到 //total这个统计整数里面 tx++; } 有了这些函数,电脑就可以用这个有利值选择一个位置下棋,因此接下来我们就要考虑黑白棋的下棋后棋盘状态的变化了。我们知道,当我们在(x,y)这个位置上下一个棋后,就会引起这个位置的八个方向上的符合条件(棋子和原有的已方棋子夹住对方的至少一个棋子)的方格上棋子状态的改变。为此我们定义了函数move (int x,int y,int mover)实现这个功能,其中x,y为下棋的位置, mover为-1表示己方用黑棋,1表示己方用白棋,函数move的主要实现如下(以右方向为例,详细请看源代码): movedir(x,y,mover);//调用movedir函数,得到dirstate数组表示各个方向的状态 state[y][x]=mover;//在该位置上下棋,改变棋盘在该位置的状态,将空状态改为mover int tx=x,ty=y; if(dirstate[0]==1)//为1则表示该方向可以吃掉对方的棋子,将已方棋子夹住对方棋子改 //为己方 { while

文档评论(0)

xiayutian80 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档