闲来玩十三水规律|十三水马牌赢了怎么算|

HTML5五子棋输赢算法


在上一小节中,我们实现了五子棋的画子,在这一节我们实现五子棋输赢的算法。我们接下来要做的就是,当下满5个白子或者5个黑子的时候,让它赢。



水平方向上的输赢


其实我们每点击一次棋盘落子,都把这个棋子的信息记录在了这个maps里面了。



HTML5-1.png


当我们每次点击一个鼠标下子的时候,都要判断一下,这个数组的横向黑子或者是白子是不是满5个,要做这样的算法,所以我们写一个单独的方法。这个方法命名为isWin()。

这个函数我们给这么几个参数。


第一个参数:t,1表示白子;2表示黑子。
第二个参数:row。
第三个参数:col。

每下完一个子以后,我们都要判断输赢。


HTML5-2.png


所以,我们在这里面调用这个isWin方法,这里是黑子就传入2和row,col。


HTML5-3.png


然后,同样的道理,在下完白子之后,也要调用这个方法进?#20449;?#26029;。


HTML5-4.png



然后,我们开始编写isWin方法里面的代码。


a) 定义一个orgrow和一个orgcol。


HTML5-5.png


我想这样做,我在这里下了一个黑子,然后查看它旁边的这个子是不是黑色的。


HTML5-6.png


再看再旁边的子是不是黑色的,一直延伸看过去;也就是以它为中心,让它的列(就是col)减减的查看,如果都是黑子的话,就累加起来,知道这个子不是黑色的。然后再向右,列加加。然后统计一下,总共有几个子。


b好,那么我们这个地方就可以做判断。如果向左的话就是col减减;(我们这里再定义一个变量。叫total,赋值为1)

(注意这里要向左不断的推移,直?#38454;?#36793;这个子不为黑子的时候再找右边;所以这里使用的是while)


HTML5-7.png


找右边。找右边的时候,我们的row又要回归到orgrow。col赋值于orgcol。


HTML5-8.png


那么我们再在下面判断一下,如果total大于等于5,即相同颜色的棋子大于等于5,那就赢了。赢的时候,根据传入的参数t来判断当前落下的是白子还是黑子,然后弹出对应的提示信息。


HTML5-9.png


运行一下浏览器,查看效果。


HTML5-10.png


我们落下了这么多的子,但是仍然没有执行到弹出?#24405;?#25105;们这里犯了一个?#22270;?#38169;误,这里忘记写function了。


HTML5-11.png


我们再来运行浏览器一次。OK,成功的弹出了对话框,ccc执行了


HTML5-12.png

 


垂直方向上的赢


垂直方向上的赢,我们仍然是在isWin方法里面编写代码。我们需要回归一个:


row=orgrow;

col=orgcol;


然后把total回归到1的状态。


total=1;


然后进行while判断,这个我们判断的是垂直方向上的。


HTML5-16.png


垂直方向上,我们看一下这个算法是怎么样的?


垂直方向上,我们需要关注的是行,比如从这个子开始。


HTML5-17.png


列不变,向上是行减减;向下就是行加加。

 

在代码里面实现一下


a) 首先我们向上搜索,循环搜索判断。

while(row-1>0&&maps[row-1][col]==t)

{

row--;

total++;

   }



b) 在搜索完之后,又回归一次原点。(如果你是初级程序员的话,需要在纸上好好的计算一下这个原理,因为算法是最难的,特别是游戏的算法)然后向下搜索。

row=orgrow;

col=orgcol;

while(row+1<15&&maps[row+1][col]==t)

{

row++;

 total++;

}



c) 然后我们再做一次这样的判断。

if(total>=5)

{

if(t==1)

alert("白子赢");

 else

 alert("黑子赢");

}



d) 运行一下,看看效果。现在我们是纵向的。在这?#26234;?#20917;下,白子赢了。


HTML5-18.png



左下角方向的输赢


左下是这样的:列减1,行加1。我们先实现左下。


把这三个参数回归一下。


row=orgrow;

col=orgcol;

  total=1;


然后进行左下的循环判断,计算一条斜线上的相同颜色的连续棋子数量。


while(row+1<15&&col-1>0&&maps[row+1][col-1]==t)

{

row++;

col--;

total++;

}

 


右上角的输赢


右上角的话,是列不断的加;行不断的减。


同样的,回归这几个变量的值


row=orgrow;

  col=orgcol;


然后编写代码循环判断的代码


while(row-1>0&&col+1<15&&maps[row-1][col+1]==t)

{

row--;

col++;

total++;

}


通过这个total变量的值,来判断这个是黑子赢了还是白子赢了


使用这段代码,这段代码是复用的,完全可以抽取成一个函数。


if(total>=5)

{

if(t==1)

alert("白子赢");

 else

 alert("黑子赢");

}


这个左下角和右上角搞定了,测试一下


这个情况下,黑子赢了。


HTML5-19.png



左上角的输赢


这个很简单了,因为前面会做,这个也是同样的原理。


先把变量回归一下


row=orgrow;

col=orgcol;

  total=1;


左上的话,假如以它为原点


HTML5-20.png


左上是:列减减;行减减。


编写循环判断的代码


while(row-1>0&&col-1>0&&maps[row-1][col-1]==t)

{

row--;

col--;

total++;

}



右下角的输赢


回归一下变量的值


row=orgrow;

  col=orgcol;


编写循环判断的代码


while(row+1<15&&col+1<15&&maps[row+1][col+1]==t)

{

row++;

col++;

total++;

}


再来一次谁输谁赢的判断


if(total>=5)

{

if(t==1)

alert("白子赢");

else

alert("黑子赢");

}


这样,我们就实现了水平方向、垂直方向,两个交叉方向的输赢算法了。




【本文由麦子学院独?#20197;?#21019;,转载请注明出处并保留原文链接】

logo
? 2012-2016 www.znlucv.tw
蜀ICP备13014270号-4 Version 5.0.0 release20160127

免费领取价值1888元求职宝典!

客服热线 400-862-8862

回到顶部

闲来玩十三水规律
体彩6码最大遗漏 买六肖怎么算中奖 五星两码不定位万能码 赛车pk10微信群计划群 广东11选5任一中一技技巧 如何防止负盈利打偏 三个骰子大小玩法规则豹子为啥赢不了 幸运28投注技巧详解 手机北京赛pk10计划软件 北京十一选五投注技巧