当前位置:首页 » 编程博文
开发技术指南» 文章正文
    引言: 黑白棋规则介绍 黑白棋是由黑方和白方两人进行的益智游戏。
 

 

 ·十大超级老牌黑客(二)    »显示摘要«
    摘要: 四、十大超级老牌黑客之二:米切尔·卡普尔 五短身材,不修边幅,过肩长发,连鬓胡子,时髦的半袖沙滩上装,一副披头士的打扮。看起来象现代都市里的野人。如果他将一件"麻布僧袍"穿在身上,又戴上一顶圆形宽边帽子,有如绘画作品中环绕圣像头上的光环。一眨眼的功夫,他又变成圣经中的耶......
 ·十大超级老牌黑客(四)    »显示摘要«
    摘要: 八、十大超级老牌黑客之七:米切尔·卡普尔 1971年,卡普尔从耶鲁大学毕业。在校期间,他专修心理学、语言学以及计算机学科。也就是在这时他开始对计算机萌生兴趣。他继续到研究生院深造。20世纪60年代,退学是许多人的一个选择。只靠知识的皮毛,你也能过日子。那些年里,卡普尔1年可以挣1.2万美元。他漫无......


用c++实现黑白棋
黑白棋规则介绍

黑白棋人工智能的实现 【程序编程相关:而今迈步从头越---读 《The Jav

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

在10×10的棋盘上,除了那些已经有子的地方不能走子外,那些不能吃子的点也不能走.如何判断某个点(x, y)能不能走子呢?通过分析黑白棋的规则我们知道,在这一个方格上的八个方向的任何一个方向上只要满足:在这个方向与之相邻的有连续若干个对方的棋子,接着有一个己方的子,我们就可以肯定这一点能够走子.所以我定义了一个数组int dirstate[8](数组从右逆时针开始,如dirstate[0]表示右,dirstate[1]表示右上,以此类推)来表示个方向的状态,值1表示在这个方向上可以吃掉对方的子,值0则表示不能,同时定义一个函数movedir(int x,int y,int mover)来判断各方向的状态,函数movedir的具体实现见源代码,这里以右方向为例说明,其他各个方向类似,右方向的判断可以用以下语句实现: 【扩展信息:精解——安全配置 Windows 200

       我们这里取棋盘大小为10×10个方格,用数组int state[10][10]来表示棋盘的状态,其中0表示方格为空,-1表示用黑方的棋,1表示白方的棋.

int tx=x+1,ty=y,step=0;//tx,ty分别用来表示右方向各点在数组中的索引

dirstate[0]=0;//初始化为不能吃子

while(1)

{

      if(tx>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个对方的棋子,则.

//表示该方向上可以吃子,修改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(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++;

       }

有了这些函数,电脑就可以用这个有利值选择一个位置下棋,因此接下来我们就要考虑黑白棋的下棋后棋盘状态的变化了.我们知道,当我们在(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(state[ty][++tx]==mover*(-1))//循环直到遇到己方的棋子

       {

              state[ty][tx]=mover;//将对方的棋子改为己方的棋子

       }

}


...   下一页
 ·十大超级老牌黑客(六)    »显示摘要«
    摘要: 十二 、结语:"罪恶的对立面不是德行,而是信念" 10大黑客之旅就是黑客世界的一次全面探索,就是黑客历史和黑客传统的一次全程回顾。走完这段路程,我们可能对黑客的未来之路依然无所把握,但是,我们做了努力。"罪恶的对立面不是德行,而是信念。"对于黑客尤其如此。......
» 本期热门文章:

©2000-2007 All Rights Reserved. 最佳浏览:1024X768 MSIE