太原网站建设价格,印度网站域名,杭州建设网双标化工地2022年,佛山网站开发公司电话五子棋游戏禁手算法的改进
五子棋最新的禁手规则#xff1a;
1#xff0e;黑棋禁手判负、白棋无禁手。黑棋禁手有“三三”#xff08;包括“四三三”#xff09;、“四四”#xff08;包括“四四三”#xff09;和“长连”。黑棋只能以“四三”取胜。 2#xff0e;黑方…五子棋游戏禁手算法的改进
五子棋最新的禁手规则
1黑棋禁手判负、白棋无禁手。黑棋禁手有“三三”包括“四三三”、“四四”包括“四四三”和“长连”。黑棋只能以“四三”取胜。 2黑方五连与禁手同时形成判黑方胜。 3黑方禁手形成时白方应立即指出。若白方在之后继续落子则禁手失效此后指出禁手也不判黑方负。 注意本条仅限于“三三”和“四四”禁手点黑方走出的长连则不同在对局结束前白方无论何时指出黑方出现长连都判白方胜。
禁手设置算法 禁手有三种基本形即三三禁手和四四禁手以及长连禁手。 另外还有三三四四四三类禁手以及一些特殊形态的禁手。 三三禁手形态00 10100 0 x K x 1 x 0 00 1100 0 x K 1 x 0 0 10010 0 K x x 1 0 四四禁手形态00 11100 0 x K 1 1 x 0 0 11010 0 K 1 x 1 0 0 10110 0 K x 1 1 0 K 是遍历搜索点if (K1) 黑子时 x 点位就是三连和四连的禁手点位。 用遍历搜索算法按15 * 15 棋盘点位pn ( 1 -225 ) 分四个方向搜索即左右上下右斜斜左。遇黑子则计算加权分赋100分值。此方法可减少计算量无黑子位不计算。三三四四各形态同时搜索查验加权计算一次遍历加权计分最后查验加权分情况超过100分的点位就是禁手点位。如有超过200分的情况就是三三四和四四三禁手。 长连禁手设置在判胜负函数detect()时黑棋超过五连即是长连禁手判黑负白棋胜。 有一些特殊的形态如扁担阵暂不设置。此程序是简版完整版本要全面设置。 代码中有显示计算的分值点标记黄色是100分的点位紫色是超过100分的点位即禁手点位。这是测试算法时用来查看的应用时可注释掉。 此算法是基本的算法优点是简单和易于理解。
黑棋如设置禁手要想获胜就只有活四和嵌五还有就是冲四活三原先发布的博文有bug当时较仓促算法测试不充分忽略了冲四活三的情况。今就此补充修正代码。
这里有个巧妙的算法在原代码上改一下就成了。算法是三三计权分仍然是100而四四的计权分改为110这样三三禁手分是200四四禁手分是220如是三三四就310分四四三就320分 if ( js[i]110 js[i]!210 ) { ...... } 这样计分大于110就触发禁手而若等于210分就是冲四活三必胜点。 图例 黄色点是计分点紫色点是禁手点 restrict_move ( ) { //禁手设置 //黑棋禁手加权计算查找 for (i1;i225;i) { js[i]0 ; } //init scan //三三禁手01010 此情况中间为可成三三的交点 //此点记100若有两个三三此点就计分200 //即禁手点位黑棋若下子即可判负 for (i1;i15;i){ //遍历scan 黑子 for (j1;j15;j){ k(i-1)*15j ; //pn(n) number //三三禁手形 0 0 1 010 0, k前后 0位计权 //两边为空中间可成活三有子是假活三 if (pn[k]1){ // scan B (k) if (pn[k-1]0pn[k1]0pn[k2]1pn[k3]0){ js[k1] js[k1]100 ; if ( pn[k-2]0) js[k-1] js[k-1]100 ; if (pn[k4]0) js[k3] js[k3]100 ; if ( pn[k-2]1pn[k4]1) { //101(0)101四四的特殊情况 js[k1] js[k1]200 ; } }//左右 if (pn[k-15]0pn[k15]0pn[k30]1pn[k45]0){ js[k15] js[k15]100 ; if ( pn[k-30]0) js[k-15] js[k-15]100 ; if (pn[k60]0) js[k45] js[k45]100 ; if ( pn[k-30]1pn[k60]1) { //四四 js[k15] js[k15]200 ; } }//上下 if (pn[k-14]0pn[k14]0pn[k28]1pn[k42]0){ js[k14] js[k14]100 ; if ( pn[k-28]0) js[k-14] js[k-14]100 ; if (pn[k56]0) js[k42] js[k42]100 ; if ( pn[k-28]1pn[k56]1) { //四四 js[k14] js[k14]200 ; } }//斜左 if (pn[k-16]0pn[k16]0pn[k32]1pn[k48]0){ js[k16] js[k16]100 ; if ( pn[k-32]0) js[k-16] js[k-16]100 ; if (pn[k64]0) js[k48] js[k48]100 ; if ( pn[k-32]1pn[k64]1) { //四四 js[k16] js[k16]200 ; } }//右斜 } //00 1 0100 四四 1(0)101的特殊情况
//禁手形 00 1 100 , k前后 0位计权 if (pn[k]1){ //scan B (k) if (pn[k-1]0pn[k1]1pn[k2]0){ if (pn[k-2]0) js[k-2] js[k-2]100 ; if (pn[k-2]0) js[k-1] js[k-1]100 ; if (pn[k3]0) js[k2] js[k2]100 ; if (pn[k3]0) js[k3] js[k3]100 ; } //左右 if (pn[k-15]0pn[k15]1pn[k30]0){ if (pn[k-30]0) js[k-30] js[k-30]100 ; if (pn[k-30]0) js[k-15] js[k-15]100 ; if (pn[k45]0) js[k30] js[k30]100 ; if (pn[k45]0) js[k45] js[k45]100 ; } //上下 if (pn[k-14]0pn[k14]1pn[k28]0){ if (pn[k-28]0) js[k-28] js[k-28]100 ; if (pn[k-28]0) js[k-14] js[k-14]100 ; if (j12pn[k42]0) js[k28] js[k28]100 ; if (pn[k42]0) js[k42] js[k42]100 ; } //斜左 if (pn[k-16]0pn[k16]1pn[k32]0){ if (pn[k-32]0) js[k-32] js[k-32]100 ; if (pn[k-32]0) js[k-16] js[k-16]100 ; if (pn[k48]0) js[k32] js[k32]100 ; if (pn[k48]0) js[k48] js[k48]100 ; } //右斜 } //00 1 100 //禁手形 0 1 0010 , 中间 0位计权 if (pn[k]1){ //scan B (k) if (pn[k-1]0pn[k1]0pn[k2]0pn[k3]1pn[k4]0){ js[k1] js[k1]100 ; js[k2] js[k2]100 ; } //左右 if (pn[k-15]0pn[k15]0pn[k30]0pn[k45]1pn[k60]0){ js[k15] js[k15]100 ; js[k30] js[k30]100 ; } //上下 if (pn[k-14]0pn[k14]0pn[k28]0pn[k42]1pn[k56]0){ js[k14] js[k14]100 ; js[k28] js[k28]100 ; } //斜左 if (pn[k-16]0pn[k16]0pn[k32]0pn[k48]1pn[k64]0){ js[k16] js[k16]100 ; js[k32] js[k32]100 ; } //右斜 } //010010
//四四禁手算法同三三禁手 //四四禁手形 00 1 1100 , 前后 0 位计权 //更正冲四加活三不是禁手!! add 110分 //加特殊禁手 111 0 x 0 111 if (pn[k]1){ //scan B (k) if (pn[k1]1pn[k2]1){ if (pn[k-2]0pn[k-1]0){ js[k-1] js[k-1]110 ; js[k-2] js[k-2]110 ; } if (pn[k3]0pn[k4]0){ js[k3] js[k3]110 ; js[k4] js[k4]110 ; } } //左右 if (pn[k15]1pn[k30]1){ if (pn[k-30]0pn[k-15]0){ js[k-15] js[k-15]110 ; js[k-30] js[k-30]110 ; } if (pn[k45]0pn[k60]0){ js[k45] js[k45]110 ; js[k60] js[k60]110 ; } } //上下 if (pn[k14]1pn[k28]1){ if (pn[k-28]0pn[k-14]0){ js[k-14] js[k-14]110 ; js[k-28] js[k-28]110 ; } if (pn[k42]0pn[k56]0){ js[k42] js[k42]110 ; js[k56] js[k56]110 ; } } //斜左 if (pn[k16]1pn[k32]1){ if (pn[k-32]0pn[k-16]0){ js[k-16] js[k-16]110 ; js[k-32] js[k-32]110 ; } if (pn[k48]0pn[k64]0){ js[k48] js[k48]110 ; js[k64] js[k64]110 ; } } //右斜 } //0 1 110 ( 111 0x0 111 )
//四四禁手形 0 1 1010 , 0 1 0110 前后 0 位计权 if (pn[k]1){ //scan B (k) if (pn[k-1]0pn[k1]0pn[k3]1pn[k4]0){ if (pn[k1]0pn[k2]1)js[k1] js[k1]110 ; if (pn[k1]1pn[k2]0)js[k2] js[k2]110 ; } //左右 if (pn[k-15]0pn[k15]0pn[k45]1pn[k60]0){ if (pn[k15]0pn[k30]1)js[k15] js[k15]110 ; if (pn[k15]1pn[k30]0)js[k30] js[k30]110 ; } //上下 if (pn[k-14]0pn[k14]0pn[k42]1pn[k56]0){ if (pn[k14]0pn[k28]1)js[k14] js[k14]110 ; if (pn[k14]1pn[k28]0)js[k28] js[k28]110 ; } //斜左 if (pn[k-16]0pn[k16]0pn[k48]1pn[k64]0){ if (pn[k16]0pn[k32]1)js[k16] js[k16]110 ; if (pn[k16]1pn[k32]0)js[k32] js[k32]110 ; } //右斜 } //0 1 1010 0 1 0110 //******** } } //scan i , j 整个搜索过程
//禁手的基本设置就这样 //长连禁手设置在判胜负函数 detect ( ) 时 // 黑棋超过五连即判黑负白棋胜。 //********** cs.SetTextSize (16); cs.SetTextStyle (0); cs.SetFillMode (1);//0不填色1填色 for (i1;i225;i){ //test restrict_move if (js[i] !0) { //Mark it 标记禁手点 sintToString ( js[i]) ; dx(i-(i/15*15))*40; dy(i/15)*4040; if (dx0){ dx15*40; dydy-40; } cs.SetColor (255,250,250,0) ; cs.DrawCircle (dx,dy,3) ; //draw mark //更正冲四加活三不是禁手!! 四加 110分 if (js[i]110js[i]!210){ cs.SetColor (255,180,0,180) ; cs.DrawCircle (dx,dy,5) ; } //draw mark } } cs.Update ( ) ; }//restrict_move ( )
图例
在下拉菜单设置禁手 上图E 9 G 10 H 6 此三点位就是冲四活三必杀点
全局变量加 int js[225]; //禁手设置 遍历棋盘点位 int jsset ; //0on 有禁手1off 无禁手下拉菜单
在白棋下子后加禁手判断 white_do ( ){ //白棋下子 ............ testAIq ( ); //AI 算法测试 **** //scan restricted move and draw mark if (jsset0) restrict_move ( ) ; //禁手设置标记 }//white_do ( )
在判胜负的function detect ( ) 中加代码 如触禁手判白棋胜
detect ( ) { ...... ...... //***************************** if (jsset0pn[n]1js[n]110js[i]!210){ //禁手判白棋胜 print 禁手 pn, n ; cs.SetColor(255,255,0,0); cs.SetTextSize (16); cs.DrawText (( 禁手 ),655,(dn2)*16 ); cs.SetTextSize (40); cs.DrawText (( 禁手 ),460,530 ); ss9白棋胜 !; goto heqi; } ...... ...... }//detect ( )
其他功能设置感兴趣的朋友可参阅我本站其他博文
需要游戏程序源码可联系我micelu126.com
//**End**