还剩6页未读,继续阅读
文本内容:
五子棋代码阅读
一、构建棋盘,用鼠标依次下黑白棋子L在网页上设置两个元素!DOCTYPE HTMLhtml五子棋head/head bodycanvas id=,,myCanvasM width=600height=600,onmousedown=,,show_coordseventH/canvaspxinput type=,,buttonH value=,,Jf$p,onClick=llbeginn id=l,butl,,x/p/body/html一个是画布,用来画棋盘,在上面显示棋子;一个按钮表示开始下棋这两个动作对应两个函数show_coordsevent begin
2.相关函数JavaScript在body之前插入脚本函数标记script type=,ltext/javascript,,/script设置变量记录下棋子的数目,也是序号var no=0开始函数,把按钮变为不可用并调用画棋盘document.getElementByld,butl,-dsabled=lldisableddrawline画棋盘行列直线1919function drawline・var c=document getElementByldmyCanvas;var cxt=c.getContext2cT;cxt.fillStyle=,,#A5DF00H;cxt.fillRect0,0,570,570;fori=0;i19;i++cxt.moveTo15i*30+15;/cxt.lineTo555J*30+15;cxt.stroke;fori=0;i19;i++cxt.moveToi*30+1515;/cxt.lineToi*30+15,555;cxt.stroke;在x,y画圆表示下的棋子先下的为黑子function drawOlfx.y・var c=document getElementByldmyCanvas;var cxt=c.getContext”2cT;ifno%2==0;cxt.fillStyle=#FFFFFF”elsecxt.fillStyle=,,#OOOOOOH;cxt.beginPath;cxt.arc30*x+1530*y+15150Math.PI*2true;/////cxt.closePath;cxt.fill;鼠标点击动作把鼠标的坐标转化为行列坐标,表示行x0-18function show_coordseventifno=19*19x=parselntevent.clientX/30y=parselntevent.clientY/30no=no+ldraw01x,y
二、为人机交互做准备p输入框内为表示用户先选择位置,表示机器先选择10/pinput type=buttonvalue=开始,,onClick=,begin,,id=,,butlinput type=text id=selel value=l〉增加输入用户或机器先下的选择方式var user=O;,并增加用户变量表示当前下机器的是机器,1代表人var chess=[];棋盘数组记录已下棋子信息,开始初始化为0表示未有棋子functioninitvar i;〃初始化棋盘数组为0强化鼠标动作,只有user为时才被调用,并检验下的位置是否有棋子1for i=0;i19*19;i++chess[i]=0;function show_coordseventifno=19*19user==lx=parselntevent.clientX/30y=parselntevent.clientY/30if chess[x+y*19]=0{no=no+l chess[x+y*19]=nodrawO1x,y//listchess当设置为机器先选择时,此鼠标事件不能被调用
三、设计机器下棋子L要实现交互,在人操作后,把用户设置为0,调用函数选择位置functionshow_coordseventif no=19*19user==lx=parselntevent.clientX/30y=parselntevent.clientY/30ifchess[x+y*19]==0no=no+lchess[x+y*19]=nodrawOl x,yfreshmarkuser=0computer机器选择位置后落子,把用户转为人var i,j;i=maxjnoj=maxjno+1ifij j=i;no=no+lchessEj]=nodraw01j%19,parselntj/19freshmark user=l
2.如何选择位置根据双方棋子情况选择要下的位置,通过双方位置权重来判断,根据已下的棋子在空白处与多的能相连的位置最好ovar val=[[],[]];二维数组分别记录先后下棋的权重function initvalvari;〃初始化估值数组为0for i=0;i19*19;i++{valEO][i]=0;val[l][i]=0;.各空位置上的权重计算是机器选择的决定问题,如何设计权重是见仁见智根据五子棋的特点,要想五子一线,必须前面相同棋子多处在一直线上,所以看哪儿能成一直线或三连以上最好,也就是同类棋子的线性聚集,集中分布function markk,un{//k棋盘中序号un落子序号1-19*19var x,y,same,go;for i=0;i8;i++{〃8个方向上棋子数统计x=k%19;y=parselntk/19;.dx=di8[i]
[0],dy=di8[i]
[1].val
[0][k]=
0.val
[1][k]=0go=lsame=0forj=0;j3go==l;j++x=x+dxy=y+dyif chess[x+y*19]==0val[un%2][x+y*19]=val[un%2][x+y*19]+l+same;elseif chess[x+y*19]%2==un%2same++;else{val[un%2]Ex+y*19]=0;go=0}标记估值的策略尽显智慧,在此统计各方向上的数目规律性变化坐标的实现var di8=[[0,-l],[0,1],H,-1],[1,1],.[1,-1],H,l]]〃8个方向的xy的下一步偏移量上、下、左、右、左上、右下、右上、左下每次落子后,计算一次两种棋子的估值,以便于后面机器选择位置function freshmarkvari,j;initval fori=0;i19*19;i++ifchess Li]=0marki,chess[i]要实现机器先选择,输入时置0,并在begin中调用computer进行选择要下的位置本模块未实现先让机器选择
四、设计机器选择相关函数
五、人机对奕实训要求以五子棋游戏为基础,优化或重构程序相关函数,分组对抗检验各自程序机器选择能力。
个人认证
优秀文档
获得点赞 0