[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
仔细看了下netbenton的代码,对五子棋规则了解很深,大大节省了代码提升了效率。
而且很多地方的字符串设计的很巧妙,集判断处理多种结果于一身。

最近我重新改写了五子棋核心代码,使用了别的算法;
返回最高评分坐标集合,判断棋型禁手布局,计算时间大约0.5-1秒,只是如果要完成计算3步棋,时间花费可能达到10秒,当然保存几个计算的走子结果,在电脑“意料中”的走棋将直接读取或者从布局查找,估计电脑“思考”时间将1-10秒不等。

只是我写的代码都有点其它语言的遗留传统,在BAT本身特性的了解方面,还差很远啊。

TOP

回复 14楼 的帖子

嘻嘻,准确的说是蜂鸣器啦,别让蜂鸣器发出滴滴滴的声音,你那个五子棋哦,下一个子,会滴一声,我觉得这个似乎没必要吧。嘎嘎。

TOP

最近改写的程序如下,并没有多少特征字串,完全使用算法思考。
已经用它执白跟netbenton兄的程序对弈过,走了3次,都是20-30多步后不小心下错坐标罢手了,但至少一直防守没有错漏。

当前只有核心代码,很粗糙,界面,悔棋等都没有做,很多都处在调试阶段,但是已经可以下棋了。

以后将会更新:
1,动态调整k1,k2值,使得电脑在判断当前局面后不至于一味防守或者进攻,只是判断标准目前还没确定,简单的以当前最高得分的落子点分值判断,还是以 “二,三,四”的数量综合评分来判断。
2,禁手,查找分值串,可以很容易判断 多行交叉的禁手,只是长连禁手还得考虑下是否放入特征串。
3,开局棋谱,目前没有加入,所以测试都是用电脑做后手。如果要电脑先手,调整为k1=10,k2=7。
4,走棋预判,以目前的计算速度看,每一步评分的时间为0.5秒,那么考虑3步需要大量时间。代码框架已经完备,以后试着添加这个功能。
5,胜负判断还没做=。=
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set "tzk=11111_9999999 011110_300000 11110_2500 01111_2500 11101_3000 10111_3000 11011_2600 0011100_3000 11100_500 00111_500 010110_800 011010_800 10011_600 11001_600 10101_550 00011000_650 11000_150 00011_150 0010100_250 010010_200"
  4. set "p_tzk=22222_9999999 022220_300000 22220_2500 02222_2500 22202_3000 20222_3000 22022_2600 0022200_3000 22200_500 00222_500 020220_800 022020_800 20022_600 22002_600 20202_550 00022000_650 22000_250 00022_250 0020200_250 020020_200"
  5. rem 默认走白棋,k1<k2侧重防守(后手),k1>k2侧重进攻(先手)。k1,k2值可在判断双方局面评分后动态调整。
  6. set /a k1=7,k2=10
  7. set error1=坐标应为“x,y”形式,并且1-x-15,1-y-15。
  8. set error2=x,y坐标越界。
  9. set error3=该坐标已有棋子,无法在指定坐标下子。
  10. :初始化棋盘
  11. for /l %%i in (1 1 15) do (
  12.         set "Display_%%i=┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼"
  13. )
  14. for /l %%i in (1 1 15) do for /l %%j in (1 1 15) do set QP[%%i][%%j]=0
  15. :loop
  16. call :显示棋盘
  17. call :玩家走 ||(echo,!error%ERRORLEVEL%!&goto :loop)
  18. call :显示棋盘
  19. call :判断胜负
  20. call :电脑走
  21. call :显示棋盘
  22. call :判断胜负
  23. goto :loop
  24. :玩家走
  25. set /a zq=0
  26. set /p P_zb=请输入坐标{1-15,1-15}:
  27. for /f "tokens=1,2 delims=," %%a in ("!P_zb!") do (
  28.         if %%a GTR 0 if %%a LSS 16 set /a zq+=1
  29.         if %%b GTR 0 if %%b LSS 16 set /a zq+=1
  30.         if "!QP[%%a][%%b]!"=="0" set /a zq+=1
  31.         if "!zq!"=="3" call :设置坐标 %%a %%b 2
  32. )
  33. if "!P_zb!"=="exit" exit
  34. if !zq! EQU 0 exit /b 1
  35. if !zq! EQU 1 exit /b 2
  36. if !zq! EQU 2 exit /b 3
  37. exit /b 0
  38. goto :eof
  39. :电脑走
  40. set /a 最高分=0
  41. for /l %%x in (1 1 15)  do (
  42.         for /l %%y in (1 1 15) do (
  43.                 if defined C_soce[%%x][%%y] (
  44.                         set "m=!C_soce[%%x][%%y]!"
  45.                         set "n=!P_soce[%%x][%%y]!"
  46.                         set /a m=!m!,n=!n!,mn=m*!k1!+n*!k2!
  47.                         if !最高分! EQU !mn! set "坐标集=!坐标集! [%%x][%%y]"
  48.                         if !最高分! LSS !mn! (
  49.                                 set /a 最高分=!mn!
  50.                                 set "坐标集=[%%x][%%y]"
  51.                         )
  52.                 )
  53.         )
  54. )
  55. rem 坐标集可能含有多个坐标,以后应用在αβ剪枝算法中,现在只取第一个。
  56. for /f "tokens=1,2 delims=[]" %%i in ("!坐标集!") do (
  57.         call :设置坐标 %%i %%j 1
  58. )        
  59. goto :eof
  60. :判断胜负
  61. rem 还没做。
  62. goto :eof
  63. :显示棋盘
  64. for /l %%i in (15 -1 1) do (
  65.         echo,%%i !Display_%%i!
  66. )
  67. echo,Y↑X→ 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
  68. goto :eof
  69. :设置坐标 [X为90°,Y为0°,Y-X为45°,Y+X为135°]
  70. set /a QP[%1][%2]=%3,x=%1,y=%2,z=%3,cut1=x-1,cut2=x,最高分=0
  71. if !z! equ 1 (set "cr=●") else (set "cr=○")
  72. set "str1=!Display_%y%:~0,%cut1%!"
  73. set "str2=!Display_%y%:~%cut2%!"
  74. set "Display_!y!=!str1!!cr!!str2!"
  75. set "C_str[%1][%2]="
  76. set "C_soce[%1][%2]="
  77. set "P_soce[%1][%2]="
  78. set "P_str[%1][%2]="
  79. ::落子点估值
  80. for /l %%i in (1 1 4) do (
  81.         for %%j in (%%i_0 %%i_-%%i 0_-%%i -%%i_-%%i -%%i_+0 -%%i_+%%i 0_%%i %%i_%%i) do (
  82.                 for /f "tokens=1,2 delims=_" %%x in ("%%j") do (
  83.                         set /a xx=x+%%x,yy=y+%%y
  84.                         for /f "tokens=1,2" %%a in ("!xx! !yy!") do (
  85.                                 if defined QP[%%a][%%b] if !QP[%%a][%%b]! EQU 0 (
  86. rem 更新双方字串并评分,没有的则重新创建,只更新 x-4 => x+4 范围且在一条直线上的评分。
  87. set /a a=%%a,b=%%b,c=1
  88. if "!C_str[%%a][%%b]!"=="" (
  89.         set /a c_str1=c,c_str2=c,c_str3=c,c_str4=c,p_str1=2,p_str2=2,p_str3=2,p_str4=2
  90.         for /l %%I in (-1 -1 -4) do (
  91.                 set /a xxx=a+%%I,yyy=b+%%I,lj1=0
  92.                 if !xxx! LSS 1 (
  93.                         set /a lj1=1
  94.                         set "c_str1=x!c_str1!"
  95.                         set "p_str1=x!p_str1!"
  96.                 ) else (
  97.                         for /f "tokens=1,2" %%A in ("!xxx! !b!") do (
  98.                                 set "c_str1=!QP[%%A][%%B]!!c_str1!"
  99.                                 set "p_str1=!QP[%%A][%%B]!!p_str1!"
  100.                         )
  101.                 )
  102.                 if !yyy! LSS 1 (
  103.                         set /a lj1=1
  104.                         set "c_str2=x!c_str2!"
  105.                         set "p_str2=x!p_str2!"
  106.                 ) else (
  107.                         for /f "tokens=1,2" %%A in ("!a! !yyy!") do (
  108.                                 set "c_str2=!QP[%%A][%%B]!!c_str2!"
  109.                                 set "p_str2=!QP[%%A][%%B]!!p_str2!"
  110.                         )
  111.                 )
  112.                 if !lj1! EQU 1 (
  113.                         set "c_str3=x!c_str3!"
  114.                         set "p_str3=x!p_str3!"
  115.                 ) else (
  116.                         for /f "tokens=1,2" %%A in ("!xxx! !yyy!") do (
  117.                                 set "c_str3=!QP[%%A][%%B]!!c_str3!"
  118.                                 set "p_str3=!QP[%%A][%%B]!!p_str3!"
  119.                         )
  120.                 )
  121.                 set /a xxx=a+%%I,yyy=b-%%I,lj1=0
  122.                 if !xxx! LSS 1 set /a lj1=1
  123.                 if !yyy! GTR 15 set /a lj1=1
  124.                 if !lj1! EQU 1 (
  125.                         set "c_str4=x!c_str4!"
  126.                         set "p_str4=x!p_str4!"
  127.                 ) else (
  128.                         for /f "tokens=1,2" %%A in ("!xxx! !yyy!") do (
  129.                                 set "c_str4=!QP[%%A][%%B]!!c_str4!"
  130.                                 set "p_str4=!QP[%%A][%%B]!!p_str4!"
  131.                         )
  132.                 )
  133.         )
  134.         for /l %%I in (1 1 4) do (
  135.                 set /a xxx=a+%%I,yyy=b+%%I,lj1=0
  136.                 if !xxx! GTR 15 (
  137.                         set /a lj1=1
  138.                         set "c_str1=!c_str1!x"
  139.                         set "p_str1=!p_str1!x"
  140.                 ) else (
  141.                         for /f "tokens=1,2" %%A in ("!xxx! !b!") do (
  142.                                 set "c_str1=!c_str1!!QP[%%A][%%B]!"
  143.                                 set "p_str1=!p_str1!!QP[%%A][%%B]!"
  144.                         )
  145.                 )
  146.                 if !yyy! GTR 15 (
  147.                         set /a lj1=1
  148.                         set "c_str2=!c_str2!x"
  149.                         set "p_str2=!p_str2!x"
  150.                 ) else (
  151.                         for /f "tokens=1,2" %%A in ("!a! !yyy!") do (
  152.                                 set "c_str2=!c_str2!!QP[%%A][%%B]!"
  153.                                 set "p_str2=!p_str2!!QP[%%A][%%B]!"
  154.                         )
  155.                 )
  156.                 if !lj1! EQU 1 (
  157.                         set "c_str3=!c_str3!x"
  158.                         set "p_str3=!p_str3!x"
  159.                 ) else (
  160.                         for /f "tokens=1,2" %%A in ("!xxx! !yyy!") do (
  161.                                 set "c_str3=!c_str3!!QP[%%A][%%B]!"
  162.                                 set "p_str3=!p_str3!!QP[%%A][%%B]!"
  163.                         )
  164.                 )
  165.                 set /a xxx=a+%%I,yyy=b-%%I,lj1=0
  166.                 if !xxx! GTR 15 set /a lj1=1
  167.                 if !yyy! LSS 1 set /a lj1=1
  168.                 if !lj1! EQU 1 (
  169.                         set "c_str4=!c_str4!x"
  170.                         set "p_str4=!p_str4!x"
  171.                 ) else (
  172.                         for /f "tokens=1,2" %%A in ("!xxx! !yyy!") do (
  173.                                 set "c_str4=!c_str4!!QP[%%A][%%B]!"
  174.                                 set "p_str4=!p_str4!!QP[%%A][%%B]!"
  175.                         )
  176.                 )
  177.         )
  178.         set /a soce1=0,soce2=0,soce3=0,soce4=0
  179.         for %%X in (!tzk!) do (
  180.                 for /f "tokens=1,2 delims=_" %%A in ("%%X") do (
  181.                         for /l %%W in (1 1 4) do (
  182.                                 if not "!c_str%%W!"=="!c_str%%W:%%A=@!" if !soce%%W! LSS %%B set /a soce%%W=%%B
  183.                         )
  184.                 )
  185.         )
  186.         set "C_str[!a!][!b!]=!c_str1!,!c_str2!,!c_str3!,!c_str4!"
  187.         set "C_soce[!a!][!b!]=!soce1!+!soce2!+!soce3!+!soce4!"
  188.         set /a soce1=0,soce2=0,soce3=0,soce4=0
  189.         for %%X in (!p_tzk!) do (
  190.                 for /f "tokens=1,2 delims=_" %%A in ("%%X") do (
  191.                         for /l %%W in (1 1 4) do (
  192.                                 if not "!p_str%%W!"=="!p_str%%W:%%A=@!" if !soce%%W! LSS %%B set /a soce%%W=%%B
  193.                         )
  194.                 )
  195.         )
  196.         set "P_str[!a!][!b!]=!p_str1!,!p_str2!,!p_str3!,!p_str4!"
  197.         set "P_soce[!a!][!b!]=!soce1!+!soce2!+!soce3!+!soce4!"
  198. rem end 创建。
  199. ) else (
  200. rem 更新字串及评分,已存在的点会加快效率。
  201.         if %%x NEQ 0 (
  202.                 set /a cut1=5-%%x-1,cut2=5-%%x,tk=1,pd=%%x+%%y
  203.                 if !pd! EQU 0 (
  204.                         set /a cut1=cut1+30,cut2=cut2+30,tk=4
  205.                 )
  206.                 if %%x EQU %%y (
  207.                         set /a cut1=cut1+20,cut2=cut2+20,tk=3
  208.                 )
  209.         ) else (
  210.                 set /a cut1=15-%%y-1,cut2=15-%%y,tk=2
  211.         )
  212.         for /f "tokens=1,2" %%X in ("!cut1! !cut2!") do (
  213.                 set "C_str[%%a][%%b]=!C_str[%%a][%%b]:~0,%%X!!z!!C_str[%%a][%%b]:~%%Y!"
  214.                 set "P_str[%%a][%%b]=!P_str[%%a][%%b]:~0,%%X!!z!!P_str[%%a][%%b]:~%%Y!"
  215.         )
  216.         for /f "tokens=1-4 delims=+" %%A in ("!C_soce[%%a][%%b]!") do (
  217.                 set /a soce1=%%A,soce2=%%B,soce3=%%C,soce4=%%D
  218.         )
  219.         set /a soce=0,ttk=tk*10-10
  220.         for %%T in (!ttk!) do (
  221.                 set "t_str=!C_str[%%a][%%b]:~%%T,9!"
  222.         )
  223.         for %%Q in (!tzk!) do (
  224.                 for /f "tokens=1,2 delims=_" %%A in ("%%Q") do (
  225.                         if not "!t_str!"=="!t_str:%%A=@!" (
  226.                                 if !soce! LSS %%B set /a soce=%%B
  227.                         )
  228.                 )
  229.         )
  230.         set /a soce!tk!=!soce!
  231.         set "C_soce[%%a][%%b]=!soce1!+!soce2!+!soce3!+!soce4!"
  232. rem 更新player评分
  233.         for /f "tokens=1-4 delims=+" %%A in ("!P_soce[%%a][%%b]!") do (
  234.                 set /a soce1=%%A,soce2=%%B,soce3=%%C,soce4=%%D
  235.         )
  236.         set /a soce=0
  237.         for %%T in (!ttk!) do (
  238.                 set "t_str=!P_str[%%a][%%b]:~%%T,9!"
  239.         )
  240.         for %%Q in (!p_tzk!) do (
  241.                 for /f "tokens=1,2 delims=_" %%A in ("%%Q") do (
  242.                         if not "!t_str!"=="!t_str:%%A=@!" (
  243.                                 if !soce! LSS %%B set /a soce=%%B
  244.                         )
  245.                 )
  246.         )
  247.         set /a soce!tk!=!soce!
  248.         set "P_soce[%%a][%%b]=!soce1!+!soce2!+!soce3!+!soce4!"
  249. )
  250. rem end更新
  251.                                 )
  252.                         )
  253.                 )
  254.         )
  255. )
复制代码

[ 本帖最后由 caruko 于 2011-1-26 15:17 编辑 ]

TOP

=。= 做了测试,发现防守还可以,进攻却缺少章法,不够犀利。

只有想办法加入“定式”,完善预判来提高智能了。

TOP

重复了。。看楼下。

[ 本帖最后由 caruko 于 2011-1-26 21:11 编辑 ]

TOP

已经完善了禁手判断,胜负判断,增加选择先后手。
对于匹配“定式”,走棋预判,已经有了思路。
有空完善后参上。
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. ::初始变量
  4. set "tzk=11111_9999999 011110_300000 11110_2500 01111_2500 0011100_3000 11101_3000 10111_3000 11011_2600  11100_500 00111_500 010110_800 011010_800 10011_600 11001_600 10101_550 00011000_650 11000_150 00011_150 0010100_250 010010_200"
  5. set "p_tzk=22222_9999999 022220_300000 22220_2500 02222_2500 0022200_3000 22202_3000 20222_3000 22022_2600 22200_500 00222_500 020220_800 022020_800 20022_600 22002_600 20202_550 00022000_650 22000_250 00022_250 0020200_250 020020_200"
  6. set "禁手=0011100_三 011010_三 010110_三 011100_#三 001110_@三 01111_四 11110_四 10111_四 11011_四  11101_四 11111_五 111111_长连 "
  7. set "error1=坐标应为“x,y”形式,并且1-x-15,0-y-15。"
  8. set "error2=x,y坐标越界。"
  9. set "error3=该坐标已有棋子,无法在指定坐标下子。"
  10. set /a 步=0
  11. ::初始化棋盘
  12. for /l %%i in (1 1 15) do (
  13.         set "Display_%%i=┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼"
  14. )
  15. for /l %%i in (1 1 15) do for /l %%j in (1 1 15) do set QP[%%i][%%j]=0
  16. call :显示棋盘
  17. ::设置先手
  18. :xs
  19. set /p 先手=请选择先手(玩家Player:P,电脑Computer:C)
  20. if "!先手!"=="C" (set "行动方=Computerr" & set /a k1=10,k2=7 & set "先手=C" & set "qizi1=○" & set "qizi2=●")
  21. if "!先手!"=="c" (set "行动方=Computer" & set /a k1=10,k2=7 & set "先手=C" & set "qizi1=○" & set "qizi2=●")
  22. if "!先手!"=="p" (set "行动方=Player" & set /a k1=7,k2=10 & set "先手=P" & set "qizi1=●" & set "qizi2=○")
  23. if "!先手!"=="P" (set "行动方=Player" & set /a k1=7,k2=10 & set "先手=P" & set "qizi1=●" & set "qizi2=○")
  24. if not defined 先手 goto :xs
  25. if "!先手!"=="C" (call :设置坐标 8 8 1) else (call :设置坐标 8 8 2 &goto :loop2)
  26. :loop
  27. call :显示棋盘
  28. call :玩家走 ||(echo,!error%ERRORLEVEL%!&goto :loop)
  29. :loop2
  30. call :显示棋盘
  31. call :电脑走
  32. goto :loop
  33. :玩家走
  34. set "行动方=Player"
  35. set /a zq=0
  36. set /p P_zb=请输入坐标{1-15,1-15}:
  37. for /f "tokens=1,2 delims=," %%a in ("!P_zb!") do (
  38.         if %%a GTR 0 if %%a LSS 16 set /a zq+=1
  39.         if %%b GTR 0 if %%b LSS 16 set /a zq+=1
  40.         if "!QP[%%a][%%b]!"=="0" set /a zq+=1
  41.         if "!zq!"=="3" call :设置坐标 %%a %%b 2
  42. )
  43. if "!P_zb!"=="exit" exit
  44. if !zq! EQU 0 exit /b 1
  45. if !zq! EQU 1 exit /b 2
  46. if !zq! EQU 2 exit /b 3
  47. exit /b 0
  48. :电脑走
  49. set "行动方=Computer"
  50. set /a 最高分=0
  51. for /l %%x in (1 1 15)  do (
  52.         for /l %%y in (1 1 15) do (
  53.                 if defined C_soce[%%x][%%y] (
  54.                         set "m=!C_soce[%%x][%%y]!"
  55.                         set "n=!P_soce[%%x][%%y]!"
  56.                         set /a m=!m!,n=!n!,mn=m*!k1!+n*!k2!
  57.                         if !最高分! EQU !mn! set "坐标集=!坐标集! [%%x][%%y]"
  58.                         if !最高分! LSS !mn! (
  59.                                 set /a 最高分=!mn!
  60.                                 set "坐标集=[%%x][%%y]"
  61.                         )
  62.                 )
  63.         )
  64. )
  65. rem 坐标集可能含有多个坐标,以后应用在αβ剪枝算法中,现在只取第一个。
  66. for /f "tokens=1,2 delims=[]" %%i in ("!坐标集!") do (
  67.         call :设置坐标 %%i %%j 1
  68. )
  69. goto :eof
  70. :胜利
  71. call :显示棋盘
  72. if "%1"=="禁手" (
  73.   echo !行动方!范"!禁!"禁手,该局判负!
  74. ) else (
  75.   echo !行动方!五子连珠,赢得该局胜利!
  76. )
  77. set /p =按任意键结束游戏!<nul
  78. pause>nul
  79. exit
  80. goto :eof
  81. :显示棋盘
  82. for /l %%i in (15 -1 1) do (
  83.     echo %%i !Display_%%i!
  84. )
  85. echo,Y↑X→ 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
  86. goto :eof
  87. :设置坐标 [x] [y] [1,2]
  88. set /a QP[%1][%2]=%3,x=%1,y=%2,z=%3,cut1=x-1,cut2=x,最高分=0,fens=0,步+=1
  89. set "cr=!qizi%3!"
  90. set "Display_!y!=!Display_%y%:~0,%cut1%!!cr!!Display_%y%:~%cut2%!"
  91. set "第!步!步=%1,%2"
  92. ::判断禁手,“三四” “成五” 不算禁手,@三#三看似不是活三,两个一起构不成活四,但是跟别的活三,四搭配仍然是活三。
  93. set "禁="
  94. if "!行动方:~0,1!"=="!先手!" (
  95.    for %%D in (!禁手!) do (
  96.       for /f "tokens=1,2 delims=_" %%E in ("%%D") do (
  97.         if not "!%先手%_str[%1][%2]!"=="!%先手%_str[%1][%2]:%%E=@!" set "禁=!禁!%%F"
  98.       )
  99.    )
  100. )
  101. if "!禁!"=="三四" set "禁="
  102. if not "!禁!"=="!禁:#=!" if not "!禁!"=="!禁:@=!" set "禁="
  103. if not "!禁!"=="!禁:五=!" if "!禁!"=="!禁:长连=!" set "禁="
  104. if "!禁:~1,1!"=="" set "禁="
  105. if defined 禁 call :胜利 禁手
  106. ::判断是否5连,断定胜负
  107. if !步! GTR 1 if "!行动方!"=="Computer" (set /a fens=!C_soce[%1][%2]!) else (set /a fens=!P_soce[%1][%2]!)
  108. if !fens! GEQ 9999999 call :胜利
  109. set "C_str[%1][%2]="
  110. set "C_soce[%1][%2]="
  111. set "P_soce[%1][%2]="
  112. set "P_str[%1][%2]="
  113. ::落子点估值
  114. for /l %%i in (1 1 4) do (
  115.         for %%j in (%%i_0 %%i_-%%i 0_-%%i -%%i_-%%i -%%i_+0 -%%i_+%%i 0_%%i %%i_%%i) do (
  116.                 for /f "tokens=1,2 delims=_" %%x in ("%%j") do (
  117.                         set /a xx=x+%%x,yy=y+%%y
  118.                         for /f "tokens=1,2" %%a in ("!xx! !yy!") do (
  119.                                 if defined QP[%%a][%%b] if !QP[%%a][%%b]! EQU 0 (
  120. rem 更新双方字串并评分,没有的则重新创建,只更新 x-4 => x+4 范围且在一条直线上的评分。
  121. set /a a=%%a,b=%%b,c=1
  122. if "!C_str[%%a][%%b]!"=="" (
  123.         set /a c_str1=c,c_str2=c,c_str3=c,c_str4=c,p_str1=2,p_str2=2,p_str3=2,p_str4=2
  124.         for /l %%I in (-1 -1 -4) do (
  125.                 set /a xxx=a+%%I,yyy=b+%%I,lj1=0
  126.                 if !xxx! LSS 1 (
  127.                         set /a lj1=1
  128.                         set "c_str1=x!c_str1!"
  129.                         set "p_str1=x!p_str1!"
  130.                 ) else (
  131.                         for /f "tokens=1,2" %%A in ("!xxx! !b!") do (
  132.                                 set "c_str1=!QP[%%A][%%B]!!c_str1!"
  133.                                 set "p_str1=!QP[%%A][%%B]!!p_str1!"
  134.                         )
  135.                 )
  136.                 if !yyy! LSS 1 (
  137.                         set /a lj1=1
  138.                         set "c_str2=x!c_str2!"
  139.                         set "p_str2=x!p_str2!"
  140.                 ) else (
  141.                         for /f "tokens=1,2" %%A in ("!a! !yyy!") do (
  142.                                 set "c_str2=!QP[%%A][%%B]!!c_str2!"
  143.                                 set "p_str2=!QP[%%A][%%B]!!p_str2!"
  144.                         )
  145.                 )
  146.                 if !lj1! EQU 1 (
  147.                         set "c_str3=x!c_str3!"
  148.                         set "p_str3=x!p_str3!"
  149.                 ) else (
  150.                         for /f "tokens=1,2" %%A in ("!xxx! !yyy!") do (
  151.                                 set "c_str3=!QP[%%A][%%B]!!c_str3!"
  152.                                 set "p_str3=!QP[%%A][%%B]!!p_str3!"
  153.                         )
  154.                 )
  155.                 set /a xxx=a+%%I,yyy=b-%%I,lj1=0
  156.                 if !xxx! LSS 1 set /a lj1=1
  157.                 if !yyy! GTR 15 set /a lj1=1
  158.                 if !lj1! EQU 1 (
  159.                         set "c_str4=x!c_str4!"
  160.                         set "p_str4=x!p_str4!"
  161.                 ) else (
  162.                         for /f "tokens=1,2" %%A in ("!xxx! !yyy!") do (
  163.                                 set "c_str4=!QP[%%A][%%B]!!c_str4!"
  164.                                 set "p_str4=!QP[%%A][%%B]!!p_str4!"
  165.                         )
  166.                 )
  167.         )
  168.         for /l %%I in (1 1 4) do (
  169.                 set /a xxx=a+%%I,yyy=b+%%I,lj1=0
  170.                 if !xxx! GTR 15 (
  171.                         set /a lj1=1
  172.                         set "c_str1=!c_str1!x"
  173.                         set "p_str1=!p_str1!x"
  174.                 ) else (
  175.                         for /f "tokens=1,2" %%A in ("!xxx! !b!") do (
  176.                                 set "c_str1=!c_str1!!QP[%%A][%%B]!"
  177.                                 set "p_str1=!p_str1!!QP[%%A][%%B]!"
  178.                         )
  179.                 )
  180.                 if !yyy! GTR 15 (
  181.                         set /a lj1=1
  182.                         set "c_str2=!c_str2!x"
  183.                         set "p_str2=!p_str2!x"
  184.                 ) else (
  185.                         for /f "tokens=1,2" %%A in ("!a! !yyy!") do (
  186.                                 set "c_str2=!c_str2!!QP[%%A][%%B]!"
  187.                                 set "p_str2=!p_str2!!QP[%%A][%%B]!"
  188.                         )
  189.                 )
  190.                 if !lj1! EQU 1 (
  191.                         set "c_str3=!c_str3!x"
  192.                         set "p_str3=!p_str3!x"
  193.                 ) else (
  194.                         for /f "tokens=1,2" %%A in ("!xxx! !yyy!") do (
  195.                                 set "c_str3=!c_str3!!QP[%%A][%%B]!"
  196.                                 set "p_str3=!p_str3!!QP[%%A][%%B]!"
  197.                         )
  198.                 )
  199.                 set /a xxx=a+%%I,yyy=b-%%I,lj1=0
  200.                 if !xxx! GTR 15 set /a lj1=1
  201.                 if !yyy! LSS 1 set /a lj1=1
  202.                 if !lj1! EQU 1 (
  203.                         set "c_str4=!c_str4!x"
  204.                         set "p_str4=!p_str4!x"
  205.                 ) else (
  206.                         for /f "tokens=1,2" %%A in ("!xxx! !yyy!") do (
  207.                                 set "c_str4=!c_str4!!QP[%%A][%%B]!"
  208.                                 set "p_str4=!p_str4!!QP[%%A][%%B]!"
  209.                         )
  210.                 )
  211.         )
  212.         set /a soce1=0,soce2=0,soce3=0,soce4=0
  213.         for %%X in (!tzk!) do (
  214.                 for /f "tokens=1,2 delims=_" %%A in ("%%X") do (
  215.                         for /l %%W in (1 1 4) do (
  216.                                 if not "!c_str%%W!"=="!c_str%%W:%%A=@!" if !soce%%W! LSS %%B set /a soce%%W=%%B
  217.                         )
  218.                 )
  219.         )
  220.         set "C_str[!a!][!b!]=!c_str1!,!c_str2!,!c_str3!,!c_str4!"
  221.         set "C_soce[!a!][!b!]=!soce1!+!soce2!+!soce3!+!soce4!"
  222.         set /a soce1=0,soce2=0,soce3=0,soce4=0
  223.         for %%X in (!p_tzk!) do (
  224.                 for /f "tokens=1,2 delims=_" %%A in ("%%X") do (
  225.                         for /l %%W in (1 1 4) do (
  226.                                 if not "!p_str%%W!"=="!p_str%%W:%%A=@!" if !soce%%W! LSS %%B set /a soce%%W=%%B
  227.                         )
  228.                 )
  229.         )
  230.         set "P_str[!a!][!b!]=!p_str1!,!p_str2!,!p_str3!,!p_str4!"
  231.         set "P_soce[!a!][!b!]=!soce1!+!soce2!+!soce3!+!soce4!"
  232. rem end 创建。
  233. ) else (
  234. rem 更新字串及评分,已存在的点会加快效率。
  235.         if %%x NEQ 0 (
  236.                 set /a cut1=5-%%x-1,cut2=5-%%x,tk=1,pd=%%x+%%y
  237.                 if !pd! EQU 0 (
  238.                         set /a cut1=cut1+30,cut2=cut2+30,tk=4
  239.                 )
  240.                 if %%x EQU %%y (
  241.                         set /a cut1=cut1+20,cut2=cut2+20,tk=3
  242.                 )
  243.         ) else (
  244.                 set /a cut1=15-%%y-1,cut2=15-%%y,tk=2
  245.         )
  246.         for /f "tokens=1,2" %%X in ("!cut1! !cut2!") do (
  247.                 set "C_str[%%a][%%b]=!C_str[%%a][%%b]:~0,%%X!!z!!C_str[%%a][%%b]:~%%Y!"
  248.                 set "P_str[%%a][%%b]=!P_str[%%a][%%b]:~0,%%X!!z!!P_str[%%a][%%b]:~%%Y!"
  249.         )
  250.         for /f "tokens=1-4 delims=+" %%A in ("!C_soce[%%a][%%b]!") do (
  251.                 set /a soce1=%%A,soce2=%%B,soce3=%%C,soce4=%%D
  252.         )
  253.         set /a soce=0,ttk=tk*10-10
  254.         for %%T in (!ttk!) do (
  255.                 set "t_str=!C_str[%%a][%%b]:~%%T,9!"
  256.         )
  257.         for %%Q in (!tzk!) do (
  258.                 for /f "tokens=1,2 delims=_" %%A in ("%%Q") do (
  259.                         if not "!t_str!"=="!t_str:%%A=@!" (
  260.                                 if !soce! LSS %%B set /a soce=%%B
  261.                         )
  262.                 )
  263.         )
  264.         set /a soce!tk!=!soce!
  265.         set "C_soce[%%a][%%b]=!soce1!+!soce2!+!soce3!+!soce4!"
  266. rem 更新player评分
  267.         for /f "tokens=1-4 delims=+" %%A in ("!P_soce[%%a][%%b]!") do (
  268.                 set /a soce1=%%A,soce2=%%B,soce3=%%C,soce4=%%D
  269.         )
  270.         set /a soce=0
  271.         for %%T in (!ttk!) do (
  272.                 set "t_str=!P_str[%%a][%%b]:~%%T,9!"
  273.         )
  274.         for %%Q in (!p_tzk!) do (
  275.                 for /f "tokens=1,2 delims=_" %%A in ("%%Q") do (
  276.                         if not "!t_str!"=="!t_str:%%A=@!" (
  277.                                 if !soce! LSS %%B set /a soce=%%B
  278.                         )
  279.                 )
  280.         )
  281.         set /a soce!tk!=!soce!
  282.         set "P_soce[%%a][%%b]=!soce1!+!soce2!+!soce3!+!soce4!"
  283. )
  284. rem end更新
  285.                                 )
  286.                         )
  287.                 )
  288.         )
  289. )
复制代码

[ 本帖最后由 caruko 于 2011-1-27 20:53 编辑 ]

TOP

21楼,一开始就提示,找不到操作数,

下子无法对齐,请检查下看

才一个四,就提示四四禁手

就这样了

TOP

=.= 检查了一下, 操作数那个错误是下面这句
if "!行动方!"=="Computer" (set /a fens=!C_soce[%1][%2]!) else (set /a fens=!P_soce[%1][%2]!)
胜负判断放在估值前,导致第一次运行调用的变量没有。

至于禁手那个错误,我只惦记 2-4个符合的情况,竟然忘记了只有一个时不是禁手。
代码修改过了。。

至于对齐没发现问题啊。。

另外电脑也可能自己走出禁手,因为考虑禁手的多层的搜索算法还没写好。
主要是在 :设置坐标 函数基础上做部分修改,预判走棋的搜索范围进一步减小,因为在循环中不使用call,判断条件比较多,只能使用重复代码来写。

"定式"的算法想好了,只是定式字串还没找到资料参考,如下
set "定式=_[8][8][7][9][7][7][9][9]..._[8][8][7][9][9][7][7][7]..._....."
然后记录连续下子的坐标set jilu=!jilu![!x!][!y!],
比如第一步下[8][8],第2步下的[7][9],求第3步;
那么set !定式:%记录%=@! ,如果替换成功,表示有符合该棋路的定式
然后用替换后的字符串 "_@[7][7][9][9]_@[9][7][7][7]_.."
for /f "tokens=2,3 delims=@[]" 得到坐标值,如果替换后是@_,或者没有替换成功,那就表示以后都不需要检查定式了。

[ 本帖最后由 caruko 于 2011-1-27 21:23 编辑 ]

TOP

还考虑过用相对坐标设计定式 =。= 如 set "定式=[-1][1][-2][-1][-2][-2]"
具体还要测试了。。

TOP

回复 12# netbenton


    我觉得这所谓的智能好像还有点问题,三子一线都不理,自己在一边乱下。不管各种技巧,这应该是基本吧。

TOP

返回列表