- 1、本文档共11页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 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
您可能关注的文档
- [BIOS优化性能提升明显菜鸟必看的BIOS优化设置教程.doc
- [英语实用与英语水平认证的考试.ppt
- [baby.doc
- [英语国家概况外语教育与研究出版社.ppt
- [BP算法应用.doc
- [BP2836-M8836替代.docx
- [BT下载.doc
- [电大应用写作.doc
- [英语培训我的.ppt
- [BT公司工程资料编制细则.doc
- 2024-2025学年高中物理选修2-3粤教版教学设计合集.docx
- 2024-2025学年高中物理必修1苏教版教学设计合集.docx
- 2024-2025学年高中数学必修2苏教版教学设计合集.docx
- 2024-2025学年高中物理必修2沪科版教学设计合集.docx
- 2024-2025学年小学科学四年级上册教科版(2024)教学设计合集.docx
- 2024-2025学年小学科学一年级上册(2024)冀人版(2024)教学设计合集.docx
- 2024-2025学年中职中职专业课金融类73 财经商贸大类教学设计合集.docx
- 2024-2025学年初中物理八年级上册教科版(2024)教学设计合集.docx
- 2024-2025学年初中美术八年级下册人教版(2024)教学设计合集.docx
- 2024-2025学年高中英语高二下册上海新世纪版教学设计合集.docx
文档评论(0)