黑白棋图片或五子棋你会拼什么图片?

&&免费注册
◇关注京东
◇客户服务
共32万件 黑白棋盘
已有人评价
已有人评价
已有人评价
已有人评价
已有人评价
已有人评价
已有人评价
已有人评价
已有人评价
已有人评价
已有人评价
已有人评价
已有人评价
已有人评价
已有人评价
已有人评价
已有人评价
已有人评价
已有人评价
已有人评价
已有人评价
已有人评价
已有人评价
已有人评价
已有人评价
已有人评价
已有人评价
已有人评价
已有人评价
已有人评价
多品类齐全,轻松购物
快多仓直发,极速配送
好正品行货,精致服务
省天天低价,畅选无忧&&&精html5游戏开发教程实战:五子棋、四子棋、围棋、翻转棋四种对弈游戏,仅仅100行代码本文是一个非常具有挑战性的编程,因为100行代码,约莫10000个字符左右,将实现围棋、五子棋、四子棋和翻转棋四种双人对弈游戏。请注意,这四个对弈游戏不是初级编程者的习作,而是有着棋盘、立体棋子、事件、走棋规则判断、输赢判断的完整对弈游戏,并且可以离线存储到 iPad、Android 平板中,试想一下,把这种游戏下载到平板中,就可以在火车,旅游景区,等没有信号的地方进行对弈,是不是扩展了平板电脑的功能,是不是一种很惬意的事情。而且,关键是,这个程序没有图片,不需要去应用商店付费下载,仅仅是用 HTML5 技术写的 100 行代码而已,绝对是目前最迷您精悍的双人对弈游戏源码。(编者注:由于网页代码的宽度有限制,所以作者的源代码经过了一些换行处理,特此说明。)目标要做一个完整的双人对弈游戏,至少要做如下事情,第一步:绘制棋盘。不同的棋类游戏棋盘不同,这一点需要进行动态处理;第二步:绘制棋子。需要说明的是,围棋,五子棋等这些棋子都是圆的啊,请不要为了图片苦恼,在 HTML5 时代,我们用代码就可以实现立体圆形棋子;第三步:判断落子事件。当然是要定位手指的点击位置,这四种棋中,有的是落在框里面的,有的却是落在纵横交错的棋盘十字线上,需要动态处理;第四步:判断落子规则。下棋都有规则,不要因为代码少,就将规则打折扣,否则程序不成熟,会变成小朋友的玩具了;第五步:判断输赢。最后,我们要判断输赢。也就是要数子,这个事情必须由程序来完成,因为下棋总得需要一个裁判嘛;第六步:就是平板电脑时代,我们得实现离线应用。这个太重要了,否则,要是在台式电脑上,接根网线玩的游戏,已经遍地都是了,您写得再牛,有什么用?就是要移动,在没有信号的地方,才有市场,现在平板,智能手机这么多,在没有网络信号的地方,掏出移动设备来下棋,才是一件很牛的事情。绘制棋盘前面说了围棋、五子棋、四子棋和翻转棋的棋盘并不相同,围棋是纵横 18 个格,其他三种棋则是 8 个格。所以绘制棋盘是需要有参数。这是个小问题,大问题是,选择什么方法来绘制棋盘?HTML5 框架下,有至少 3 种方法:第一种,用 Canvas 画线;第二种,用 DIV,CSS3 里面增加了行列属性;第三种,用 table 标签。用哪一种速度最快,代码少呢?答案是:第三种。多少有点失望啊,HTML5 不是万能的。详细代码如下:
this.board=function(name,width,height,rowBak,colBak){ /* 画棋盘 */
if(&turnover&==name){row=8;col=8;}else if(&gogame&==name){row=18;col=18;}
var aW=Math.floor(width/(col+2)),aH=Math.floor(height/(row+2));
minL=(aW&aH?aH:aW)-4;// 这个减法很重要,否则填空时会把表格撑大
var array=new Array(&&div style=\&margin:&+minL+&\&& &+
&&table border=1 cellspacing=0 width=\&&+(aW*col)+&\&
height=\&&+(aH*row)+&\&&&);
for(var i=0;i&i++){
array.push(&&tr&&);
for(var j=0;j&j++){array.push(&&td align=center&&+
evt(i,j,minL,minL,aW*j+minL/2+8,aH*i+minL/2)+&&/td&&);}
if(nameBak!=&four&&&nameBak!=&turnover&)/* 将事件添加到表格中 */
array.push(evt(i,col,minL,minL,aW*col+minL/2+8,aH*i+minL/2));
array.push(&&/tr&&);
if(nameBak!=&four&&&nameBak!=&turnover&){
for(var j=0;j&=j++){
array.push(evt(row,j,minL,minL,aW*j+minL/2+8,aH*row+minL/2));
document.write(array.join(&&)+&&/table&&/div&&);
setClick(row,col,minL,minL);/* 初始化事件 */
start();/* 初始化棋子 */
}上面代码中,最重要的是标黑体的第 6 行代码,这里面有两个诀窍,第一个就是 table 的定义,第二个就是使用了 Array 数组。为什么要使用数组,而不是定义一个字符串呢?答案是优化,就是 Array 数组的 push 方法的速度要远远快于 String 字符串的加 + 运算。共计 16 行代码,一个棋盘就画好了,当然这其中不仅仅是画线,还有棋子处理,事件定义等方法的调用,后面将陆续谈到。绘制棋子绘制完棋盘,我们来绘制棋子。我们挑选的这四种棋,虽然棋盘不同,但是棋子都是相同的,都是黑白棋子。这在以前,做在线对弈,除了 Flash 能实现美观效果外,其他的必须先请美工做几副小图片,HTML5 时代,美工的人力和沟通成本就节省了。我们至少有两种方法绘制棋子,第一种是:canvas 类,第二种就是 css 的圆角属性。用哪种速度又快代码又少呢?答案是第二种,圆角。代码如下:
function man(width,height,id,colorBak){ /* 画棋子 */
var color=colorBak==null?(order++%2==0?&000&:&CCC&):colorB
var r=&border-radius:&+width/2+&&;
var obj=id==null?event.srcElement:_$(id);
obj.innerHTML=&&div id=\&man_&+color+&_&+order+&\& style=\&display:-webkit-&
+r+&-moz-&+r+&&+r+&-moz-box-shadow:inset 0 -10px 40px rgba(0,0,0,1);&+
&box-shadow:inset 0 -10px 40px rgba(0,0,0,1);&+
&background:-webkit-gradient(radial, 50 40, 30, center center, 80, from(#&+color+&),
to(rgba(255,255,255,1)));&+
&width:&+width+&height:&+height+&\&&&/div&&;
}上面代码中,我们看到,我们将每一个棋子定义了一个 DIV,使用了 CSS3 的 shadow,gradient 属性,并且可以根据棋盘的大小自动计算棋子的大小,另外,如果用户不喜欢黑白颜色,甚至可以定义成红黄颜色,女生和小朋友估计会喜欢。这 5 行代码是画一个棋子的方法,做一个简单的循环,就可以画出多个棋子,方法如下。
function moreMan(array){for(var i=0;i&array.i++)
man(minL,minL,nameBak+&_&+array[i]);}
/* 绘制多个棋子 */处理事件绘制完棋盘和棋子,我们来分析一下用户的动作。用户的动作无非就是两种,一种是点击棋盘 table,另外一种就是点击棋子 DIV。难点在点击 table 这里,我们要获知用户点击 table 的位置。传统思路可能是这样,使用 event 方法,获得 x,y 的坐标,然后与 table 的左上角做减法,然后再跟单元格 cell 做除法。听起来都麻烦。如果您仔细阅读了前面的代码,就应该发现,其实在画棋盘是,我们向 array 数组中 push 了一个 evt 方法,很明显,这个 evt 方法要返回一个字符串变量的,那么他的内容是什么呢?答案揭晓:
function evt(i,j,width,height,left,top){ /* 单一单元格事件 */
return &&div id=\&&+nameBak+&_&+i+&_&+j+&\& style=\&position:&+
(nameBak==&four&||nameBak==&turnover&?&block&:&absolute&)+
&;border:0px solid #000;width:&+
width+&height:&+height+&top:&+top+&left:&+left+&\&&&/div&&;
}原理是一个 DIV。对了,这个添加事件的方法非常特殊,实际上是在每个棋盘的交叉的地方画了一个 DIV,然后给 DIV 添加事件。
function setClick(row,col,width,height){
for(var i=0;i&=i++){
for(var j=0;j&=j++){
var els=_$(nameBak+&_&+i+&_&+j);
if(els!=null)els.onclick=function(){if(rule())man(width,height);};
}需要说明的是,DIV 一定要先定义,即 document.write 输出出来,然后才能执行 onclick 的定义,否则会返回 DIV 未定义的错误。寥寥 10 行代码,把事件问题搞定了。落子规则前面说了,用户点击事件有两种,点击棋盘 table 事件我们采用额外增加 DIV 的方法巧妙解决了,第二种点击棋子的方法又该如何呢?先要说明的是,点击棋子其实是一种错误的事件,点击棋盘可以落子,点击棋子是什么意思?黑白棋点击棋子是无意义的,我们必须要进行判断,不能在有子的地方落子,这是规则之一。所以必须要定义一个方法,判断是不是点击的地方是不是有棋子。代码如下:
function isMan(row,col){var obj=_$(nameBak+&_&+row+&_&+col,1);
if(obj==null||obj.indexOf(&man_&)==-1)
else if(obj.indexOf(&000&)!=-1)
else if(obj.indexOf(&CCC&)!=-1)return 1;}想不到吧,其实只要一行代码就可以就可以做是否有子的判断,怎么判断的,诀窍就在于判断 DIV 的颜色,棋子要么黑,返回 0,要么白,返回 1,但是空白地方是没有颜色的,返回 null。这里要特别注意返回值,后面判断输赢的时候还要用,所以不能简单通过 true 或者 false 的的返回值来判断是否有子,而是要判断出有什么颜色的子。对于五子棋和围棋,这一条规则够用了,但是对于翻转棋和四子棋,还有第二条规则:不能在四周空白的地方落子,就是说必须是相连的。也就是说,不仅仅要判断点击的地方是不是有棋子,还要判断其四周是不是有棋子,这个,不是可以有,而是,必须有。需要做一个小循环啊,代码如下:
function rule(){/* 走棋规则 */
var id=event.srcElement.
if(id.indexOf(&man_&)==0){alert(&不能在有子的地方落子&);}else{
var p=id.indexOf(&_&),p1=id.lastIndexOf(&_&);
var row=id.substr(p+1,p1-p-1)*1,col=id.substr(p1+1)*1;
if(&gobang&==nameBak)return gobang(row,col);
else if(&four&==nameBak){
if(isMan(row,col+1)==null&&isMan(row,col-1)==null&&
isMan(row+1,col)==null&&
isMan(row-1,col)==null){
alert(&四子棋不能在四周空白的地方落子!&);
return gobang(row,col,3);
}else if(&turnover&==nameBak){
if(isMan(row,col+1)==null&&isMan(row,col-1)==null&&
isMan(row+1,col)==null&&isMan(row-1,col)==null&&
isMan(row-1,col-1)==null&&
isMan(row+1,col+1)==null){
alert(&翻转棋不能在四周空白的地方落子!&);
turnover();
}else if(&gogame&==nameBak){
}循环中,反复调用 isMan 方法判断是否有棋子,所以如果 isMan 写得不够简练,快速,不知道要耗费多少时间啊。数一数,总共 19 行代码就处理了落子规则。到这里,我们绘制了棋盘,棋子,获得了点击时间,判断了落子规则,才用了 40 行左右的代码,其实程序基本上可用了,但是我们不能满足啊,还得让他更加智能一些,我们还需要一个裁判断输赢。判断输赢要判断输赢,我们必须要知道下棋的规则:五子棋是各个方向的五子相连算赢,四子棋是各个方向四个子相连算赢,翻转棋数棋子的个数,围棋则要麻烦些,不仅仅数棋子个数,还要数围住的区域。逻辑上好像很复杂啊,似乎也是计算最多的地方,有点人工智能的意思。没错,如果前面的基础打得不好,这里的确要耗费很多代码,但是因为我们前面定义了 DIV 用颜色判断是否存在棋子的 iaMan 方法,这里再使用一个小技巧,就可以轻松搞定这个输赢判断。先看看五子棋和四子棋的输赢判断代码,然后对照代码来分析。
function gobang(row,col,num){
num=num==null?4:
var rs=[[],[],[],[]],b=[],w=[];/* 这里采用四维数组来存储棋子位置 */
for(var i=0,j=0;i&num*2+1;i++,j++){
rs[0].push(isMan(row-num+i,col));
rs[1].push(isMan(row,col-num+j));
rs[2].push(isMan(row-num+i,col-num+j));
rs[3].push(isMan(row-num+i,col-num+j));
if(i&num){b.push(0);w.push(1);}
if(rs.join(&#&).indexOf(b.join(&,&))!=-1){alert(&黑棋胜&);
}else if(rs.join(&#&).indexOf(w.join(&,&))!=-1){alert(&白棋胜&);}
}共计 9 行代码就搞定,看懂没?首先定义了一个 Javascript 多维数组 rs=[[],[],[],[]],这种定义多维数组的方法,挑出来重点说明一下,因为搜索引擎上都是搜不到的,我讲课时差不多遇到的学生也都不清楚,他们大多采用 new Array,然后加循环的蜗牛方法。第二步:从落子的地方开始循环,注意,不是循环整个棋盘,为的就是节省时间啊。循环设计纵横交叉四个方向,有棋子的地方,就向这个四维数组 push 棋子的颜色。第三步:把数组 join 起来就 ok 啦,如果有 4 个或 5 个 1 相连,自然就是白棋胜,否则就是黑棋胜。写道这里,就有点意思啦,注意我们处理的数据的方法,我称之为&块数据&的处理方法,就是充分利用 array 数组,保存一块一块的数据,无论写入,读取,还是统计分析,都是针对这一块数据进行,这样既可以提高内聚度,便于提炼出可以重用的方法,就可以大大的加快执行速度。处理相连都不在话下,数子就更简单了,使用块数据处理方法,3 行搞定。
function turnover(){
if(order&64)
var num=0;var total=row*for(var i=0;i&i++){
for(var j=0;j&j++){num+=isMan(i+&_&+j);}
if(num&total/2)alert(&黑棋胜&+(total-num*2)+&子&);
else if(num&row*col/2)alert(&白棋胜&+(num*2-total)+&子&);
else alert(&平局&);
}棋子初始化环环相扣地写到这里,还有最后一个关于棋子的问题需要处理。那就是,下五子棋是从空白棋盘开始,其他三种棋却一开始都是有子的。其实给一个空白棋盘也行,但是其他三种棋因为一般的前几步走法都是固定的,我们为了提高智能化程度,不得不在浪费四行代码,毕竟,我们的目标是一个市场化的产品,而不是一个初学者不考虑用户体验的程序。
function start(){
if(&turnover&==nameBak){moreMan([3+&_&+3,4+&_&+3,4+&_&+4,3+&_&+4]);
}else if(&four&==nameBak){man(minL,minL,nameBak+&_&+row/2+&_&+0);
}else if(&gogame&==nameBak){moreMan([3+&_&+3,15+&_&+3,15+&_&+15,3+&_&+15]);
}其实就是调用了一下 moreMan 方法,注意也是块数据引用,传输了一个数组,用下划线分割横向和纵向坐标。做成离线应用本文开头就说过,台式电脑的双人或多人对弈程序早已多如牛毛烂大街了,只有移动应用才能有市场,我们的目标就是奔着这个来的,所以最后必须做成离线应用。如何实现 HTML5 的离线应用,搜索引擎很快能找到结果,其实只要三个关键步骤。第一步;在 Web 服务器的配置文件中声明一下。Tomcat 和 Apache 的声明方式不相同,需要注意;第二步:定义 manifest 文件,文件格式需要注意;第三步:在 HTML 的文件中调用一下 manifest 文件。根据这三个步骤,读者可以自行搜索细节,这里就不赘述了,我只讲搜索引擎搜不到的。另外需要说明的是,iPad 和 Android 平板上浏览器实现全屏的方法也不一样,针对 iPad 用户,我们还必须定义一行能够实现全屏的代码。效果图、在线演示、开放源代码本文的在线演示网址是:,效果图如下图所示:图 1. 效果图图中加了一个选择棋类型和设置背景功能,如要获得全部源代码,只要使用浏览器的查看源代码功能即可,限于篇幅,这里就不贴了。官方验证可惜firefox下棋子没有css效果,大家请在chrome下测试。猜你喜欢6个牛币请下载代码后再发表评论//html5游戏开发教程实战:五子棋、四子棋、围棋、翻转棋四种对弈游戏,仅仅100行代码/html5游戏开发教程实战:五子棋、四子棋、围棋、翻转棋四种对弈游戏,仅仅100行代码/index.html/html5游戏开发教程实战:五子棋、四子棋、围棋、翻转棋四种对弈游戏,仅仅100行代码/js/html5游戏开发教程实战:五子棋、四子棋、围棋、翻转棋四种对弈游戏,仅仅100行代码/js/chess.js精精精精原精精原精原原精原精原原原原精精原原原相关分享精原原最近下载&LV1&LV1&LV1&LV1&LV1&LV4&LV1&LV1&LV1&LV1最近浏览&LV1&LV1&LV10&LV2&LV2&LV12&LV6&LV1&LV5&LV14扫描二维码关注最代码为好友"/>扫描二维码关注最代码为好友博客分类:
&&&&&&& 前言
&&&&&&& 这是我来到蓝杰之后的第一个学习感悟,阶段成果也是我第一个觉得小有成就的作品,不在于所用的知识有多么高深,而在与这是第一个凝结了失败、努力、成功这样颇有曲折经历的项目,使我收获颇多。
&&&&&&&& 下面切入正题,当学完做画板之后,面临的一个选择就是做五子棋或者黑白棋,虽然对于我而言,五子棋要比黑白棋在行的多,但由于考虑到机器搜索的代价,我便毫不犹豫地选择了制作黑白棋的小游戏,毕竟不是我去对弈,而是要“教”机器如何对弈。
至于我所谓的搜索代价,便是对机器而言,所面临的需要搜索的节点数。不妨拿黑白棋和五子棋做个对比。首先,黑白棋的棋盘是8*8的,而五子棋的棋盘是15*15的,就这个层面讲,无论是空间上还是时间上,对五子棋落子的搜索的代价都要比黑白棋要高;其次,黑白棋每轮下子的位置是有要求的,这便进一步减少了节点的数量,而五子棋则理论上可以下在棋盘上的任何一个空位(当然是有特殊情况的,比如你不能眼睁睁地看着别人出杀招);再者,基于上面两点,五子棋较黑白棋来讲,电脑是更难发起有效进攻的。
&&&&&&& 当然,黑白棋也有难以处理的地方,比如每下一步,不仅改变了自己棋子的状态,同时也会改变棋盘上对方棋子的状态,那么在深搜的过程中,便不能像五子棋那样先是尝试一个位置,然后深搜,最后再把尝试的痕迹抹掉,这样只用一个二维数组就可以了,而由于黑白棋中对翻转的棋子进行还原是很麻烦的,所以在深搜的过程中,便只能不断new一个二维数组,然后再传递翻转后的棋盘,这样便增大了额外的内存开销。
&&&&&&& 版本经历
&&&&&&& 老爸曾在我和他谈想进蓝杰的时候教育过我:“学习是好事,但千万不要好高骛远”,起初我听过龙哥安排我做黑白棋的计划之后,便陷入了无限的憧憬之中,幻想着自己的黑白棋会多么多么厉害(至少要打败某某的黑白棋程序,并且让某某打败不了我的程序,有点小邪恶- -!……),但却只是一味的想象,甚至连个框架都没有做出来,一上午都显得很毛躁。在龙哥的警醒下,我下午终于开始先投入精力至少把框架做出来,原来想象中的简单的事情其实也并不是那么简单,但至少当晚磕磕绊绊地把双人模式的雏形已经搞出来了,至少走棋的模块是没有问题了。
&&&&&&& 接下来便是对界面的美化和人机算法进行研究了。界面美化其实也不算重点,有了仿WIN7画板的经历之后,对Swing组件还是有了一定的了解和应用能力的,因此界面应该不会是大问题。也正如龙哥所说,如果做黑白棋,不把人机算法好好研究一番,是没有意思的,因此,接下来的主要任务便是拿下人机算法模块。
&&&&&&& 由于有了前面李众力的经验,我还算很快就把一个简单的BOT操作的模块写出来了,就是依赖格子的权值,尽可能地先占角和边,而尽量不去碰“C位”(两条边上的与角相邻的的格子)和“星位”(除了C位的另一个和角相邻的位置)。
&&&&&&& 有了这个思想,很容易想到,如果我的BOT能够再往下看一步该多好,因为如果BOT走了一步棋,而Player下一步走了角或者边上的其他有利位置,那么我的BOT不就亏了么,于是在原有的基础上,又堆砌了一些代码来判断下一步Player可能走的地方。就这样,v1.0就成型了。
&&&&&&& 但是后来经测试发现,如果只用权值去判断到底走哪里好是很吃亏的,因为我很轻松就把它下赢了,这时便试图去找一些更好地判断方法。
&&&&&&& 也许是有点急功近利的心态吧,找到的一些比较高深的资料和论文自己根本没心思看下去(写到这里,又联想到了龙哥的一句话:“你要想赶进度,我一天让你做一个项目都可以,但关键是你要去想怎么把这个项目做精致,你要用心去观察细节,学会把软件做得精致一些。”),后来便找了一个也是大概同龄的学生写的一个用C语言做黑白棋的报告,他是用行动力(就是每轮能够下子的位置的总数)来作为对棋局评估的标准的,而且还说这样棋力还不错,我一想这个挺好的,于是便把思想拿来用了,用了大概半天的时间把这个模块写完,并和之前的程序融合到了一起,v2.0便成型了。
&&&&&&& 然而好景不长,这样做出的程序依然很傻,到了晚上在蓝杰测试的时候,我格外沮丧。这时胡zong开始语重心长地教育我:“哦,你的意思就是说你现在这个黑白棋就相当于3岁的小孩子撒,智力还很低,但你可以每天让它涨一点撒,我们不多算,你就一个月让它长一岁,你算算,等到你大四毕业,我靠,它得多……所以你只要不放弃就行,是不?”
&&&&&&& 听完胡zong的,我便静下心来了,晚上回去之后便开始研究起一个中科大学生(柏爱俊)写的关于黑白棋算法研究的一个论文,同时又开始研究起玄黄整理版的黑白棋对弈策略指南。事后反思的时候,研究这两个东西才是真正奠定了我的程序的黑白棋算法的基础,给了我颇多的启示。首先,单由点权去判定每个点的优劣是绝对行不通的,因为你即使让对方只剩一颗棋子,他也有可能最后将局面反败为胜,而且每个点的优劣也是依具体情况而定的;其次,做人机算法,就要充分发挥机器的优势——快速而精准的暴力,因而在时间允许的范围内,让机器多想一点总比少想一点要好;再者,印证了我之前对极大极小搜索理论的一些想法,确立了用深搜的形式去暴力各种可能情况的算法,并限定深搜的层数。
&&&&&&& 有了上面的感悟,第二天我便把v2.0的人机算法模块抹掉,重新开始以递归的形式去描述我的算法,经过一天的努力,v3.0终于调试成功了。
&&&&&&& 后一天的早晨我便迫不及待地让龙哥玩上一把,毕竟如果能赢龙哥还是会很高兴的,(*^__^*)。结果龙哥一开始有时候走得太快了,于是便马失前蹄,被我的程序意外地占了更多优势,但后来仔细行棋的话,还是可以比较容易地拿下我的BOT的。虽然听完龙哥说我的这个程序还是满厉害的,但我还是有些不知足,毕竟还是让龙哥比较轻松地赢了的。
&&&&&&& 在后续完善v3.0的过程中,我发现限定深搜的层数有时并不是那么理想,因为如果每层只有很少的节点,那么实际上还是有充足的时间搜索更多步的,何乐而不为呢?于是我便把限定搜索层数改成了限定搜索节点数,这样便使程序能够更加有效地利用有限的时间了。
&&&&&&& 同时,在和别人下的过程中,还发现了对于最终棋局的判定是不宜只着眼于位置的。因为即使你占得位置再好,最后子数少也是明显不行的。于是便改变了双方都无子可下时的对棋局的评估函数,这时便着眼于子数的优势了。
&&&&&&& 周六的晚上,我便又开始依照那篇论文的指导思想开始研究剪枝优化的博弈树搜索,也即α-β搜索,由于有了前面MIN-MAX搜索代码的基础,在晚上比较晚的时候我便比较容易地写完了α-β搜索的代码,v4.0便研发成功了,同时这时一个可喜的战果便是,我的白棋赢了百度应用上面日文版的那个黑白棋的黑棋(因为这个版本被龙哥评为比较厉害的版本,所以会比较高兴),尽管我的黑棋赢不了它的白棋……同时我抱着侥幸的心理挑战了一下百度应用的聪明黑白棋,结果毫不犹豫地战败了……
&&&&&&& 周日的时候,我便在QQ上面开始用我的程序进行实战了,大概能到70%的胜率吧,而且还下赢过2000多分的。欣喜之余,我发现有些时候我的BOT会很傻,尤其是最后几步,有时对手能接连让我停步好多次,然后战胜我。后来直到晚上很晚的时候,我突然意识到了我对α-β搜索中有一方pass的处理是有BUG的,到周一中午的时候,我终于把这个BUG修复了,但我发现反倒赢不了之前的日文版的黑白棋了(BUG+BUG也许会减轻BUG的影响,但当消除一个BUG时,另一个BUG的问题就暴漏地很明显了……),这时我才更加意识到了评估函数的重要性,便又仔细修改了评估函数的值,重新又赢下了日文版,而且这次黑棋也能赢下它的白棋,我便把这个版本记作了v4.5,但我依然赢不下聪明黑白棋。
&&&&&&& 于是我便又有些沮丧,开始寄希望于网上的资料,结果把从一个外国的论文上找下的一个权值表用上之后,反倒BOT变傻了。吃晚饭回来后,我便仔细分析了一下权值表,觉得它这个权值的分布还是有道理的,同时又结合了我的一些实战的经验以及我原创并修改的权值表,对摘过来的外国的权值表上的一些值的影响进行了削弱,并将一些权值的影响进行了加强,并依现在的权值表,对最终的线性合并评估值的常数比例进行了适当的修改,之后我便拿这个程序又抱着侥幸的心理去打聪明黑白棋,这次居然完成了我一周以来梦寐以求的心愿——终于将其打败了O(∩_∩)O!之后便把这个加强之后版本命名为v4.7。
&&&&&&& 所谓有目标才能有动力,有动力才能有成功,现在百度应用上比较厉害的黑白棋已经被我的BOT战胜了,希望我还能有更多地动力继续将论文上的历史表和置换表的知识融入到我的程序之中,让我的BOT变得更聪明,加油哈!
&&&&&&& 后记
&&&&&&& 此篇仅作一个阶段性的感悟的汇总和留念,具体的开发JAVA黑白棋过程中应用到的各种算法,我还在汇总之中,相信不久就能成文了。
&&&&&&& 另附我开发的v4.7的黑白棋程序,大家疲劳之时可以娱乐一番,如果有什么建议和指导,还望大家不吝赐教O(∩_∩)O~。
P.S.由于我没有标记谁下在了哪里,所以有可能有时电脑走完子之后并不能引起我们的视觉注意,但是从当前持子那个位置可以看出来是该谁接着下了,这个问题我会在之后的版本予以修正和改善,我对因此给各位在游戏中带来的不便表示歉意,谢谢各位对我的谅解和支持。
下载次数: 193
浏览: 20363 次
来自: 保定
博主你好,请问你是怎么实现opengl窗口与对话框同时显示的呢 ...
源码下载地址在哪?楼主给个链接呗。
为什么没有代码?好坑。
其实想参考一下你的代码
可是没有。不过你做的黑白棋不错哈
你很喜欢分形啊,到分形艺术网看看吧
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'

我要回帖

更多关于 五子棋胜负图片 的文章

 

随机推荐