标题: [特效代码] 批处理人机对战五子棋[新算法重写了核心代码,智能中等] [打印本页]
作者: caruko 时间: 2011-1-8 17:02 标题: 批处理人机对战五子棋[新算法重写了核心代码,智能中等]
一个能玩的BAT版人机对战五子棋游戏,智能大概接近net版主那个。
快过年了,闲的时间不过,“定式”跟“多层搜索”都只完成了一半,发现了很多问题,这里只是写只是修改完善了一下代码。
修改了禁手判断的错误。
增加了同样得分的棋,使用随机走棋。
目前重玩尚有点问题,有时需要关掉黑窗后再双击玩。
不必再去后面翻代码了,已经更新到这里了。
更新日期: 2011-1-29- @echo off
- mode con: lines=17 cols=60
- :start
- setlocal enabledelayedexpansion
- ::初始变量
- set "tzk=11111_9999999 011110_300000 11110_2500 01111_2500 0011100_3000 11101_2700 10111_2700 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"
- set "p_tzk=22222_9999999 022220_300000 22220_2500 02222_2500 0022200_3000 22202_2700 20222_2700 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"
- set "C_禁手=0011100_三 011010_三 010110_三 011100_叁 001110_弎 01111_四 11110_四 10111_四 11011_四 11101_四 11111_五 111111_长连"
- set "P_禁手=0022200_三 022020_三 020220_三 022200_叁 002220_弎 02222_四 22220_四 20222_四 22022_四 22202_四 22222_五 222222_长连"
- set "error1=坐标应为“x,y”形式,并且1-x-15,0-y-15。"
- set "error2=x,y坐标越界。"
- set "error3=该坐标已有棋子,无法在指定坐标下子。"
- set /a 步=0
- ::初始化棋盘
- for /l %%i in (1 1 15) do (
- set "Display_%%i=┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼"
- )
- for /l %%i in (1 1 15) do for /l %%j in (1 1 15) do set QP[%%i][%%j]=0
- call :显示棋盘
- ::设置先手
- :xs
- set /p 先手=请选择先手(玩家Player:P,电脑Computer:C)
- if "!先手!"=="C" (set "行动方=Computerr" & set /a k1=10,k2=7 & set "先手=C" & set "qizi1=○" & set "qizi2=●")
- if "!先手!"=="c" (set "行动方=Computer" & set /a k1=10,k2=7 & set "先手=C" & set "qizi1=○" & set "qizi2=●")
- if "!先手!"=="p" (set "行动方=Player" & set /a k1=7,k2=10 & set "先手=P" & set "qizi1=●" & set "qizi2=○")
- if "!先手!"=="P" (set "行动方=Player" & set /a k1=7,k2=10 & set "先手=P" & set "qizi1=●" & set "qizi2=○")
- if not defined 先手 goto :xs
- if "!先手!"=="C" (call :设置坐标 8 8 1) else (call :设置坐标 8 8 2 &goto :loop2)
- :loop
- call :显示棋盘
- call :玩家走 ||(echo,!error%ERRORLEVEL%!&goto :loop)
- :loop2
- call :显示棋盘
- call :电脑走
- goto :loop
- :玩家走
- set "行动方=Player"
- set /a zq=0
- set /p P_zb=请输入坐标{1-15,1-15}:
- for /f "tokens=1,2 delims=," %%a in ("!P_zb!") do (
- if %%a GTR 0 if %%a LSS 16 set /a zq+=1
- if %%b GTR 0 if %%b LSS 16 set /a zq+=1
- if "!QP[%%a][%%b]!"=="0" set /a zq+=1
- if "!zq!"=="3" call :设置坐标 %%a %%b 2
- )
- if "!P_zb!"=="exit" exit
- if !zq! EQU 0 exit /b 1
- if !zq! EQU 1 exit /b 2
- if !zq! EQU 2 exit /b 3
- exit /b 0
-
- :电脑走
- set "行动方=Computer"
- set /a 最高分=0,num=0
- for /l %%x in (1 1 15) do (
- for /l %%y in (1 1 15) do (
- if defined C_soce[%%x][%%y] (
- set "m=!C_soce[%%x][%%y]!"
- set "n=!P_soce[%%x][%%y]!"
- set /a m=!m!,n=!n!,mn=m*!k1!+n*!k2!
- if !最高分! EQU !mn! (
- set /a num+=1
- set "坐标集=!坐标集! [%%x][%%y]"
- )
- if !最高分! LSS !mn! (
- set /a 最高分=!mn!,num=1
- set "坐标集=[%%x][%%y]"
- )
- )
- )
- )
- rem 坐标集可能含有多个坐标,以后应用在αβ剪枝算法中,现在只随机取一个。
- set /a get=%RANDOM%%%num+1,dd=0
- for %%i in (!坐标集!) do (
- set /a dd+=1
- if !dd! equ !num! (
- for /f "tokens=1,2 delims=[]" %%x in ("%%i") do (
- call :设置坐标 %%x %%y 1
- )
- )
- )
- goto :eof
-
- :胜利
- call :显示棋盘
- if "%1"=="禁手" (
- echo !行动方!范"!禁!"禁手,该局判负!
- ) else (
- echo !行动方!五子连珠,赢得该局胜利!
- )
- set /p =按任意键重新开始游戏!<nul
- pause>nul
- endlocal
- goto :start
- goto :eof
-
- :显示棋盘
- for /l %%i in (15 -1 1) do (
- echo %%i !Display_%%i!
- )
- echo,Y↑X→ 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
- goto :eof
-
- :设置坐标 [x] [y] [1,2]
- set /a QP[%1][%2]=%3,x=%1,y=%2,z=%3,cut1=x-1,cut2=x,最高分=0,fens=0,步+=1
- set "cr=!qizi%3!"
- set "Display_!y!=!Display_%y%:~0,%cut1%!!cr!!Display_%y%:~%cut2%!"
- set "第!步!步=%1,%2"
- ::判断禁手,“三四” “成五” 不算禁手,"弎""叁"看似不是活三,两个一起构不成活四,但是跟别的活三,四搭配仍然是活三。
- set "禁="
- set "j="
- if "!行动方:~0,1!"=="!先手!" (
- for %%i in (!%先手%_str[%1][%2]!) do (
- for %%D in (!%先手%_禁手!) do (
- for /f "tokens=1,2 delims=_" %%E in ("%%D") do (
- set "sstr=%%i"
- if not "!sstr!"=="!sstr:%%E=@!" set "j=%%F"
- )
- )
- set 禁=!禁!!j!
- set "j="
- )
- )
- if "!禁!"=="三四" set "禁="
- if not "!禁!"=="!禁:叁=!" if not "!禁!"=="!禁:弎=!" set "禁="
- if not "!禁!"=="!禁:五=!" if "!禁!"=="!禁:长连=!" set "禁="
- if "!禁:~1,1!"=="" set "禁="
- if defined 禁 call :胜利 禁手
- ::判断是否5连,断定胜负
- if !步! GTR 1 if "!行动方!"=="Computer" (set /a fens=!C_soce[%1][%2]!) else (set /a fens=!P_soce[%1][%2]!)
- if !fens! GEQ 9999999 call :胜利
- set "C_str[%1][%2]="
- set "C_soce[%1][%2]="
- set "P_soce[%1][%2]="
- set "P_str[%1][%2]="
- ::落子点估值
- for /l %%i in (1 1 4) do (
- for %%j in (%%i_0 %%i_-%%i 0_-%%i -%%i_-%%i -%%i_+0 -%%i_+%%i 0_%%i %%i_%%i) do (
- for /f "tokens=1,2 delims=_" %%x in ("%%j") do (
- set /a xx=x+%%x,yy=y+%%y
- for /f "tokens=1,2" %%a in ("!xx! !yy!") do (
- if defined QP[%%a][%%b] if !QP[%%a][%%b]! EQU 0 (
-
- rem 更新双方字串并评分,没有的则重新创建,只更新 x-4 => x+4 范围且在一条直线上的评分。
- set /a a=%%a,b=%%b,c=1
- if "!C_str[%%a][%%b]!"=="" (
- 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
- for /l %%I in (-1 -1 -4) do (
- set /a xxx=a+%%I,yyy=b+%%I,lj1=0
- if !xxx! LSS 1 (
- set /a lj1=1
- set "c_str1=x!c_str1!"
- set "p_str1=x!p_str1!"
- ) else (
- for /f "tokens=1,2" %%A in ("!xxx! !b!") do (
- set "c_str1=!QP[%%A][%%B]!!c_str1!"
- set "p_str1=!QP[%%A][%%B]!!p_str1!"
- )
- )
- if !yyy! LSS 1 (
- set /a lj1=1
- set "c_str2=x!c_str2!"
- set "p_str2=x!p_str2!"
- ) else (
- for /f "tokens=1,2" %%A in ("!a! !yyy!") do (
- set "c_str2=!QP[%%A][%%B]!!c_str2!"
- set "p_str2=!QP[%%A][%%B]!!p_str2!"
- )
- )
- if !lj1! EQU 1 (
- set "c_str3=x!c_str3!"
- set "p_str3=x!p_str3!"
- ) else (
- for /f "tokens=1,2" %%A in ("!xxx! !yyy!") do (
- set "c_str3=!QP[%%A][%%B]!!c_str3!"
- set "p_str3=!QP[%%A][%%B]!!p_str3!"
- )
- )
- set /a xxx=a+%%I,yyy=b-%%I,lj1=0
- if !xxx! LSS 1 set /a lj1=1
- if !yyy! GTR 15 set /a lj1=1
- if !lj1! EQU 1 (
- set "c_str4=x!c_str4!"
- set "p_str4=x!p_str4!"
- ) else (
- for /f "tokens=1,2" %%A in ("!xxx! !yyy!") do (
- set "c_str4=!QP[%%A][%%B]!!c_str4!"
- set "p_str4=!QP[%%A][%%B]!!p_str4!"
- )
- )
- )
- for /l %%I in (1 1 4) do (
- set /a xxx=a+%%I,yyy=b+%%I,lj1=0
- if !xxx! GTR 15 (
- set /a lj1=1
- set "c_str1=!c_str1!x"
- set "p_str1=!p_str1!x"
- ) else (
- for /f "tokens=1,2" %%A in ("!xxx! !b!") do (
- set "c_str1=!c_str1!!QP[%%A][%%B]!"
- set "p_str1=!p_str1!!QP[%%A][%%B]!"
- )
- )
- if !yyy! GTR 15 (
- set /a lj1=1
- set "c_str2=!c_str2!x"
- set "p_str2=!p_str2!x"
- ) else (
- for /f "tokens=1,2" %%A in ("!a! !yyy!") do (
- set "c_str2=!c_str2!!QP[%%A][%%B]!"
- set "p_str2=!p_str2!!QP[%%A][%%B]!"
- )
- )
- if !lj1! EQU 1 (
- set "c_str3=!c_str3!x"
- set "p_str3=!p_str3!x"
- ) else (
- for /f "tokens=1,2" %%A in ("!xxx! !yyy!") do (
- set "c_str3=!c_str3!!QP[%%A][%%B]!"
- set "p_str3=!p_str3!!QP[%%A][%%B]!"
- )
- )
- set /a xxx=a+%%I,yyy=b-%%I,lj1=0
- if !xxx! GTR 15 set /a lj1=1
- if !yyy! LSS 1 set /a lj1=1
- if !lj1! EQU 1 (
- set "c_str4=!c_str4!x"
- set "p_str4=!p_str4!x"
- ) else (
- for /f "tokens=1,2" %%A in ("!xxx! !yyy!") do (
- set "c_str4=!c_str4!!QP[%%A][%%B]!"
- set "p_str4=!p_str4!!QP[%%A][%%B]!"
- )
- )
- )
- set /a soce1=0,soce2=0,soce3=0,soce4=0
- for %%X in (!tzk!) do (
- for /f "tokens=1,2 delims=_" %%A in ("%%X") do (
- for /l %%W in (1 1 4) do (
- if not "!c_str%%W!"=="!c_str%%W:%%A=@!" if !soce%%W! LSS %%B set /a soce%%W=%%B
- )
- )
- )
- set "C_str[!a!][!b!]=!c_str1!,!c_str2!,!c_str3!,!c_str4!"
- set "C_soce[!a!][!b!]=!soce1!+!soce2!+!soce3!+!soce4!"
- set /a soce1=0,soce2=0,soce3=0,soce4=0
- for %%X in (!p_tzk!) do (
- for /f "tokens=1,2 delims=_" %%A in ("%%X") do (
- for /l %%W in (1 1 4) do (
- if not "!p_str%%W!"=="!p_str%%W:%%A=@!" if !soce%%W! LSS %%B set /a soce%%W=%%B
- )
- )
- )
- set "P_str[!a!][!b!]=!p_str1!,!p_str2!,!p_str3!,!p_str4!"
- set "P_soce[!a!][!b!]=!soce1!+!soce2!+!soce3!+!soce4!"
- rem end 创建。
- ) else (
- rem 更新字串及评分,已存在的点会加快效率。
- if %%x NEQ 0 (
- set /a cut1=5-%%x-1,cut2=5-%%x,tk=1,pd=%%x+%%y
- if !pd! EQU 0 (
- set /a cut1=cut1+30,cut2=cut2+30,tk=4
- )
- if %%x EQU %%y (
- set /a cut1=cut1+20,cut2=cut2+20,tk=3
- )
- ) else (
- set /a cut1=15-%%y-1,cut2=15-%%y,tk=2
- )
- for /f "tokens=1,2" %%X in ("!cut1! !cut2!") do (
- set "C_str[%%a][%%b]=!C_str[%%a][%%b]:~0,%%X!!z!!C_str[%%a][%%b]:~%%Y!"
- set "P_str[%%a][%%b]=!P_str[%%a][%%b]:~0,%%X!!z!!P_str[%%a][%%b]:~%%Y!"
- )
- for /f "tokens=1-4 delims=+" %%A in ("!C_soce[%%a][%%b]!") do (
- set /a soce1=%%A,soce2=%%B,soce3=%%C,soce4=%%D
- )
- set /a soce=0,ttk=tk*10-10
- for %%T in (!ttk!) do (
- set "t_str=!C_str[%%a][%%b]:~%%T,9!"
- )
- for %%Q in (!tzk!) do (
- for /f "tokens=1,2 delims=_" %%A in ("%%Q") do (
- if not "!t_str!"=="!t_str:%%A=@!" (
- if !soce! LSS %%B set /a soce=%%B
- )
- )
- )
- set /a soce!tk!=!soce!
- set "C_soce[%%a][%%b]=!soce1!+!soce2!+!soce3!+!soce4!"
- rem 更新player评分
- for /f "tokens=1-4 delims=+" %%A in ("!P_soce[%%a][%%b]!") do (
- set /a soce1=%%A,soce2=%%B,soce3=%%C,soce4=%%D
- )
- set /a soce=0
- for %%T in (!ttk!) do (
- set "t_str=!P_str[%%a][%%b]:~%%T,9!"
- )
- for %%Q in (!p_tzk!) do (
- for /f "tokens=1,2 delims=_" %%A in ("%%Q") do (
- if not "!t_str!"=="!t_str:%%A=@!" (
- if !soce! LSS %%B set /a soce=%%B
- )
- )
- )
- set /a soce!tk!=!soce!
- set "P_soce[%%a][%%b]=!soce1!+!soce2!+!soce3!+!soce4!"
- )
- rem end更新
-
-
- )
- )
- )
- )
- )
复制代码
[ 本帖最后由 caruko 于 2011-1-29 23:24 编辑 ]
作者: caruko 时间: 2011-1-8 17:12
写这个东西的时候有一个发现..
可以使用 endlocal&exit /b %var% 后来又发现 endlocal &set var=%var%的方式,将LOCAL内的变量带出来.
但是不支持需要扩展的变量!var!
setlocal endlocal 以及这个小东西,帮我解决了很大的麻烦..
虚拟走棋变的方便多了..
作者: caruko 时间: 2011-1-8 19:50
尝试了一下,打开15个进程来计算评分,每个进程最多处理15个坐标,仍然花了4分钟,单进程也才5分多钟..
cmd的效率,看来是没办法了...
作者: netbenton 时间: 2011-1-8 20:12 标题: 回复 3楼 的帖子
终于又有人对人机对战五子棋感兴趣了,希望楼主搞出比我的更高智能的,呵呵
作者: caruko 时间: 2011-1-8 22:03
我是把棋盘上的数据用012来做成字符串,分为横15列15左斜21右斜21,一共72条字符串。
形式如: 001110220100
通过setlocal-endlocal的继承环境,但不改变变量的特性,做到假设在某个位置走了一步棋后,通过判断库中的特征字串,findstr 查出符合的,给予相应分数。包括 横列斜 多种方式匹配,分数相加,最后得出分数最高的坐标。
因此,只要判断库的“匹配字串”跟“分数”设置合理,完全可以做到很智能..
但是下一步棋可以泡几杯茶..
[ 本帖最后由 caruko 于 2011-1-8 22:05 编辑 ]
作者: hanyeguxing 时间: 2011-1-8 22:27
在这样的代码中,算法优化远比代码优化更重要
作者: caruko 时间: 2011-1-8 22:37
原本还想解决人机问题后,通过ipc$共享,使用at命令交换数据,做一个网络版五子棋的,还能支持聊天...
作者: 随风 时间: 2011-1-9 05:30
效率跟代码设计很有关系,先不说楼主的代码设计如何,单就语法上提几个建议
1、尽量不要反复使用 findstr 或 find 命令,这是狂耗效率的,最好不用。
2、call 命令最好也别使用,由其是在循环中
3、所有的 call set 。。。。 都改用for中转变量
作者: caruko 时间: 2011-1-9 12:05
听从楼上建议
嗯...主要资源都耗在特征字串匹配这上面..
我试试用字符串替换来检测匹配...
时间减少了一半 =.=,跑一步2-3分钟,72个循环的速度比一个findstr还快一倍..
IF里的CALL 使用跳过代码的办法减少了好几秒。。
在想是不是合并72个字符串到一个字符串上,然后使用按优先级顺序匹配的办法..
这样效率将大大提升,预计<30秒,但是智能大打折扣。
[ 本帖最后由 caruko 于 2011-1-9 15:28 编辑 ]
作者: netbenton 时间: 2011-1-10 10:54
楼主,针对比题,我再提点高效的方法:用if判断字符串经替换后与原来的是否相同,来代替finstr的查找,把要显示的内容全存到一个变量,一次echo,代替多个set /p,用for /f %%i中的%%i可实现endlocal把值回传,效率是call几倍
[ 本帖最后由 netbenton 于 2011-1-10 11:07 编辑 ]
作者: caruko 时间: 2011-1-10 19:05
字符替换已经这么做了,除了判断胜负的没改,其它地方已经没有findstr了..
上面那个特征库已经不适合了,必须重新制作大量精准的特征库..
现在这种模糊特征库,可能会导致棋盘原数据匹配到较低分值的特征,导致评分跟预想的差距很多..
嗯,一次echo棋盘确实可以加快.. 现在的棋盘也还没做好....
或许用替换的方式,将012替换为。".@#", ","替换为"&echo,"的办法来输出。
只是这个for /f %%i 怎么带出变量还是没明白,..
作者: netbenton 时间: 2011-1-18 19:27 标题: 楼主,你勾起了我修改五子棋的想法,就消失了
这是我在我原来的基上做的增强工作,
1,在处理禁手规则上,长连禁手、三三,及四四禁手都已经解决了,
2,现在的IQ对拼杀已经做得较全面了,
3,接下来要是有时间的话,再加入布局IQ,以及补杀IQ,就算是一个高智能的五棋游戏了
下面代码是可以玩的,请对五子棋感兴趣的朋友帮忙测试下,并提点意见~~-
- @echo off&setlocal enabledelayedexpansion
- mode con: lines=43 cols=110
- set li39= A B C D E F G H I J K L M N O P Q R S
- set li0= ┌─────────────────────────────────────┐
- set li1=A│┌─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┐│A
- set var=1
- for %%a in (!li39:~5^,-1!) do (set/a var+=2&set li!var!=%%a│├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤│%%a)
- for /l %%a in (2,2,36) do (set li%%a= ││ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ││)
- set li37=S│└─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘│S
- set li38= └─────────────────────────────────────┘
- set str=a b c d e f g h i j k l m n o p q r s
- for %%a in (%str%) do (set/a .+=1,%%a=.&set z!.!=%%a)
- set li5=!li5! 五 棋 子 人 机 对 战
- set li7=!li7! 批 处 理
- set li10=!li10! 电 脑 水 平 中 等
- set li31=!li31! 由 netbenton 编写完成
- set li33=!li33! 棋盘设计参照了 batman
- title 批处理五子棋
-
- set str=###################
- set .=0
- for /l %%a in (1,1,19) do (
- set he%%a=!str!&set sh%%a=!str!
- for /l %%b in (1,1,19) do set [%%a.%%b=0
- )
- set .=37
- for /l %%a in (1,1,19) do (
- set pi%%a=!str:~,%%a!&set ni%%a=!str:~,%%a!
- set pi!.!=!str:~,%%a!&set ni!.!=!str:~,%%a!
- set/a .-=1
- )
- set ●=○&set ○=●
- set zhi=●
- set say=say
- ::读取电脑五子棋IQ
- for /f "usebackq tokens=*" %%a in ("%~dpnx0") do (
- if defined idea (
- set idea=!idea! %%a
- ) else (
- if "%%a" equ "五子棋IQ" set "idea= "
- )
- )
- set jing=-100000
- :restart
- (
- setlocal enabledelayedexpansion
- for /l %%a in (0,1,39) do (echo !li%%a!)
- set li39=!li39! reboot重新开始,exit退出。
- set li37=!li37! back 悔棋
- set /p var=选择谁先下[ W,玩家 D,电脑 Q,退出 ]:
- if /i "!var!" equ "Q" goto :quit
- if /i "!var!" equ "D" (set onez=○&set towz=●&set hou=☆) else (set onez=●&set towz=○&set hou=★)
- set a!onez!=电脑&set a!towz!=玩家
- )
- (
- set ttr=!idea:@=%onez%!&set ttr=!ttr:$=%towz%!
- set idea=
- for %%a in (!ttr!) do (
- for /f "tokens=1,2 delims=." %%b in ("%%a") do (set %%b=%%c&set idea=!idea! %%b)
- )
- set ttr=
- set li27=!li27! !onez! !a%onez%!
- set li25=!li25! !towz! !a%towz%!
- set/a pos=10,poh=10&goto :getok
- )
- :loop
- (if %zhi% equ %onez% goto :men
- set .=
- setlocal enabledelayedexpansion
- if "!onez!" equ "○" (set/a 本方jing=50000,对方jing=0) else (set/a 本方jing=0,对方jing=50000&call :禁手检查)
- for %%b in (he sh) do (
- set all%%b=!%%b1!!%%b2!!%%b3!!%%b4!!%%b5!!%%b6!!%%b7!!%%b8!!%%b9!!%%b10!!%%b11!!%%b12!!%%b13!!%%b14!!%%b15!!%%b16!!%%b17!!%%b18!!%%b19!
- )
- for %%b in (pi ni) do (
- set all%%b=!%%b5!!%%b6!!%%b7!!%%b8!!%%b9!!%%b10!!%%b11!!%%b12!!%%b13!!%%b14!!%%b15!!%%b16!!%%b17!!%%b18!!%%b19!!%%b20!!%%b21!!%%b22!!%%b23!!%%b24!!%%b25!!%%b26!!%%b27!!%%b28!!%%b29!!%%b30!!%%b31!!%%b32!!%%b33!
- )
- for %%a in (!idea!) do (
- set str=%%a
- if "!str:~,2!" neq "vs" (
- for %%b in (he sh) do (
- if "!all%%b:%%a=!" neq "!all%%b!" (
- for /l %%c in (1,1,19) do (
- if "!%%b%%c:%%a=!" neq "!%%b%%c!" set/a .+=1&set put!.!=%%b %%c.%%a
- )
- ) )
- for %%b in (pi ni) do (
- if "!all%%b:%%a=!" neq "!all%%b!" (
- for /l %%c in (5,1,33) do (
- if "!%%b%%c:%%a=!" neq "!%%b%%c!" set/a .+=1&set put!.!=%%b %%c.%%a
- )
- ) )
- ) else (
- if %%a equ vs8 if defined . goto :get
- if %%a equ vs9 if defined . goto :get
-
- )
- ))
- if defined . (goto :get)
- echo. 已经和棋了
- pause
- endlocal&goto :restart
- :men
- (
- set/a .=lips-1&for /f "tokens=1-3" %%b in ("li!liph! !lips! !.!") do (set %%b=!%%b:~0,%%d!%hou%!%%b:~%%c!)
- set li38=!li38![%悔:~,24%]
- cls
- for /l %%a in (0,1,39) do (echo !li%%a!)
- for /f "tokens=1-3" %%b in ("li!liph! !lips! !.!") do (set %%b=!%%b:~0,%%d!%zhi%!%%b:~%%c!)
- set li38=%li38%
- set /p user=!say:say=%error%! [列前,行后]:
- if "!user!" equ "reboot" endlocal&goto :restart
- if "!user!" equ "exit" goto :quit
- if "!user!" equ "back" call :悔&goto :men
- set/a pos=!user:~0,1!,poh=!user:~1,2!,var=pos-1 2>nul
- if not defined [!poh!.!pos! set error=输入点不存在&goto :men
- )
- if "!he%poh%:~%var%,1!" neq "#" set error=该点已经有子&goto men
- goto :getok
- :get
- rem set put&pause
- set `=
- ::取最佳的走法
- for /l %%z in (!.!,-1,1) do (
- for /f "tokens=1,2,3 delims=." %%1 in ("!put%%z!") do (
- for /f "tokens=1-4" %%a in ("%%1 %%2") do (
- set vara=!%%a%%b:*%%c=!srqponmlkjihgfedcba0
- for %%i in (!%%2:-^=;!) do (
- for /f "tokens=1,2 delims=:" %%4 in ("%%i") do (
- set/a var=!vara:~19,1!+%%4
- if "%%a" equ "he" (set/a poh=%%b,pos=20-var)
- if "%%a" equ "sh" (set/a poh=20-var,pos=%%b)
- if %%b lss 19 (set/a var=%%b-var+1) else (set/a var=38-%%b-var+1)
- if "%%a" equ "pi" (if %%b lss 19 (set/a pos=var,poh=%%b-var+1) else (set/a poh=20-var,pos=%%b-19+var))
- if "%%a" equ "ni" (if %%b lss 19 (set/a pos=var,poh=19-%%b+var) else (set/a poh=var,pos=%%b-19+var))
- if not defined R!pos!R!poh!R set /a `+=1&set ram!`!=R!pos!R!poh!R&set R!pos!R!poh!R=1000000000
- set/a R!pos!R!poh!R+=%%5
- )
- )
- )
- )
- )
- set test=
- set rmk=0
- for /l %%a in (1,1,!`!) do (
- for %%b in (!ram%%a!) do (
- if "!%%b:~-4!" neq "0000" (
- rem 四,三,识别
- set test=!test! "!%%b!
- set /a xd=!%%b:~-1!,xc=!%%b:~-2,-1!,xb=!%%b:~-3,-2!,xa=!%%b:~-4,-3!
- set /a "%%b=%%b/10000+(xd+xc)/2*(xd*500+xc*1000) - (xd/2+xc/2) * 本方jing + (xb+xa)/2*(xb*500+xa*1000) - (xb/2+xa/2) * 对方jing"
- rem 四,三,识别
- set test=!test! %%b: !%%b!"
- ) else (
- set %%b=!%%b:~,-4!
- )
-
- for %%c in (!%%b!) do (
- if %%c gtr !rmk! set/a rmk=%%c,.=0
- if %%c equ !rmk! set rmz!.!=%%b&set/a .+=1
- )
- ) )
- rem if defined test start for %%a in (!test!) do @echo;%%a
-
- set jing=%.%
- set/a .=!random!%%.
- for /f "tokens=1,2 delims=R" %%a in ("!rmz%.%!") do (set/a pos=%%a,poh=%%b)
-
- rem start set r^&echo !.!^&pause^&exit
-
- endlocal&set/a pos=%pos%,poh=%poh%& set jing=%rmk%{%jing%}&set 禁手=%禁手%
- set say=say !z%pos%!!z%poh%!(%poh%)&set error=电脑最后下在:[!jing!]
- :getok
- set 下之前=
- set 下之后=
- set zhi=!%zhi%!&set win=!zhi!!zhi!!zhi!!zhi!!zhi!
- (set/a piph=poh+pos-1,lips=pos*2+1,niph=19+pos-poh,liph=poh*2-1
- if !piph! lss 19 (set/a pips=pos) else (set/a pips=20-poh)
- if !niph! lss 19 (set/a nips=pos) else (set/a nips=poh)
- for %%a in ("li!liph! !lips!" "he!poh! !pos!" "sh!pos! !poh!" "pi!piph! !pips!" "ni!niph! !nips!") do (
- for /f "tokens=1,2" %%b in (%%a) do (
- set/a .=%%c-1
- set 下之前=!下之前!!%%b!
- for %%d in (!.!) do (set %%b=!%%b:~0,%%d!%zhi%!%%b:~%%c!)
- set 下之后=!下之后!!%%b!
- )
- ))
- if "!下之后:%win%=!" neq "!下之后!" set win=y
- if defined 禁手 set win=y&set 禁手=玩家%禁手%
- set 下之前=!下之前:* =!
- set 下之后=!下之后:* =!
- (set/a asc%zhi%+=1
- set 悔= !z%pos%!!z%poh%!!悔!
- if !win! neq y goto :loop)
- for /l %%a in (0,1,39) do (echo !li%%a!)
- set/p= %禁手%!a%zhi%! %zhi%子 第!asc%zhi%!手 !z%pos%!!z%poh%!(%poh%) 胜出 <nul
- pause
- endlocal&goto :restart
- :悔
- if not defined 悔 goto :eof
- if "!悔:~6,1!" equ "" goto :eof
- for %%a in (!悔:~^,6!) do (set str=%%a
- set/a poh=!str:~-1!,pos=!str:~,1!
- set/a piph=poh+pos-1,niph=19+pos-poh,liph=poh*2-1,lips=pos*2+1
- if !piph! lss 19 (set/a pips=pos) else (set/a pips=20-poh)
- if !niph! lss 19 (set/a nips=pos) else (set/a nips=poh)
- for %%a in ( "he!poh! !pos!" "sh!pos! !poh!" "pi!piph! !pips!" "ni!niph! !nips!") do (
- for /f "tokens=1,2" %%b in (%%a) do (
- set/a .=%%c-1
- for %%d in (!.!) do (set %%b=!%%b:~0,%%d!#!%%b:~%%c!)
- )
- )
- for /f "tokens=1,2" %%b in ("li!liph! !lips!") do (
- set/a .=%%c-1
- for %%d in (!.!) do (set %%b=!%%b:~0,%%d!┼!%%b:~%%c!)
- ))
- set/a asc%zhi%-=1
- set 悔=!悔:~6!
- set error=你悔棋,耍赖皮!
- if not defined 悔 goto :eof
- set/a poh=!悔:~2,1!,pos=!悔:~1,1!,liph=poh*2-1,lips=pos*2+1
- set say=say !z%pos%!!z%poh%!(%poh%)
- goto :eof
- :quit
- taskkill /fi "WINDOWTITLE eq 批处理五子棋*" /im cmd.exe
- exit/b
- :禁手检查
- setlocal enabledelayedexpansion
- set 禁手=
- if "!下之后:○○○○○○=!" neq "!下之后!" set 禁手=长连禁手
-
- (
- for %%a in (#○○○## ##○○○# #○○#○# #○#○○#) do (
- set 下之后=!下之后:%%a=" " !
- set 下之前=!下之前:%%a=" " !
- )
- for %%a in (!下之后!) do (set /a 三后+=1)
- for %%a in (!下之前!) do (set /a 三前+=1)
- set/a 三=三后-三前
- set 下之前=%下之前%
- set 下之后=%下之后%
-
- for %%a in (#○○○○ ○#○○○ ○○#○○ ○○○#○ ○○○○#) do (
- set 下之后=!下之后:%%a=" " !
- set 下之前=!下之前:%%a=" " !
- )
- for %%a in ("!下之后!") do (set /a 四后+=1)
- for %%a in ("!下之前!") do (set /a 四前+=1)
- set/a 四=四后-四前
- )
- if !四! gtr 1 set 禁手=四四禁手
- if !三! gtr 1 set 禁手=三三禁手
- endlocal&set 禁手=%禁手%&exit/b
-
- :://2010-1-10 增加//
- :: 每种棋型串直接给出分值,甚至每个可下点给出分值,遇 vs 时如果有匹配,结束,
- :: 统计的内容:
- :: 一:必走棋;
- :: 二:分值相加:攻攻(4-3 3-3 4-4),攻防(不分),防防(4-3 3-3 4-4),同线不加,
- :: 三:布局
- :: 四:如何利用单三冲四
- ::
- :: 怎么计算禁手点,及对方是否下了禁手点
- :: 眠三/活二 在什么时候该冲,或是测试冲后是否可以杀棋,当冲了眠三后,对手只能下拦截点一点,而冲了活二后对手可以下的点有二个以上(两头,或冲四点)
- ::
- :://2010-1-10 增加//
- 流程:
- 开始:根据难度初始化回调层次 cengc(3)
-
- #开始分析
- 0 首先找出本方禁手点,可冲四点,可冲活三点,敌方冲四点,冲活三点
- 1 必下棋 (过滤长连禁手),退出(返回下点及禁手点及利弊值0-9)
- 1.9 冲5及活三冲四利为9,被逼下禁手利为0,
- 2 选下棋,对眠三,活二 进行模拟下子,对有可能一直冲到死棋的进行冲,(过虑禁手规则),退出(返回最优点及禁手点)
- 2.0 首先过虑自已方禁手,不要下,留着送返回
- 2.1 眠三冲四后 转到对方下,调用 [#开始分析],如果返回1的下点,在禁手点内,则就选该点,
- 否则摸拟走子一回合,再调用[#开始分析],如果返回最终结果对本方有利则选该点,否则放弃走该点
- 2.2 活二冲活三后 转到对方下,调用 [#开始分析],如果返回的下点,在禁手点内,则就选该点
- 2.9
- 3 对敌方的眠三,活二进行摸拟下子,对如果有可能一直冲到死棋的提前截掉,(过虑禁手规则),退出(返回最优点及下后敌方禁手点)
- 3.9
- 4 取一个分值高的点,若有多个随机取一个,层计数减1,退出
- 4.9
-
- 1 全盘扫描,记下规则串+棋盘串号 a4 b4 a3 A3 b3 B3 A2 a2 B2 b2 A1 B1
- 2 根据规则串+棋盘串号,统计所有可下点的影响力(比如:组成一个活三,组成一个活四,组成2个活三,等)
-
- 1,防止反攻
- 2,眠三冲四,无效的不冲(冲后,不能增加(活二,眠三,或者阻止对方的活二及眠三),
- 在冲活二时,选点考滤活一在先,眠一在后
- 本方4 3 则乘以3
- 4 4 如果是黑方*0,否则*3
- 3 3 如果是黑方*0,否则+30
- 对方4 3 则乘以2
- 4 4 如果是黑方*0,否则*2
- 3 3 如果是黑方*0,否则+20
- 双方4 3 ,4 4, 3 3 则仅仅相加
-
- ┼┼┼┼┼┼┼┼
- ┼★●●●●★┼ 活四点★
- ┼┼┼┼┼┼┼┼
- 1000 1000
-
- ┼┼┼┼┼┼┼┼
- ☆★●●●★☆┼ 活三冲 活四点★ 眠四点☆
- ┼┼┼┼┼┼┼┼
- 1599 9915
- ┼┼┼┼┼┼┼┼
- ┼☆●★●●☆┼ 活三冲 活四点★ 眠四点☆
- ┼┼┼┼┼┼┼┼
- 15 99 15
- ┼┼┼┼┼┼┼┼
- ┼○☆●●●★☆ 活三冲 活四点★ 眠四点☆
- ┼┼┼┼┼┼┼┼
- 15 9015
- ┼┼┼┼┼┼┼┼
- ┼┼●☆☆●●┼ 跨三冲 眠四点☆
- ┼┼┼┼┼┼┼┼
- 1515
-
- ┼┼┼┼┼┼┼┼
- ┼○●●●☆☆┼ 眠三冲 眠四点☆
- ┼┼┼┼┼┼┼┼
- 1515
- ┼┼┼┼┼┼┼┼
- ┼○●●☆●☆┼ 眠三冲 眠四点☆
- ┼┼┼┼┼┼┼┼
- 15 15
- ┼┼┼┼┼┼┼┼
- ┼○●☆●●☆┼ 眠三冲 眠四点☆
- ┼┼┼┼┼┼┼┼
- 15 15
- ┼┼┼┼┼┼┼┼
- ┼○●☆☆●●┼ 眠三冲 眠四点☆
- ┼┼┼┼┼┼┼┼
- 1515
- ┼┼┼┼┼┼┼┼
- ┼○●●☆☆●┼ 眠三冲 眠四点☆
- ┼┼┼┼┼┼┼┼
- 1515
- ┼┼┼┼┼┼┼┼
- ☆★★●●★★☆ 活二冲 活三点★ 眠三点☆
- ┼┼┼┼┼┼┼┼
- 122030 302012
-
- ┼┼┼┼┼┼┼┼
- ☆★●★●★☆┼ 跨二冲 活三点★ 眠三点☆
- ┼┼┼┼┼┼┼┼
- 1220 30 2012
- ┼┼┼┼┼┼┼┼
- ┼☆●★★●☆┼ 大跨二冲 活三点★ 眠三点☆
- ┼┼┼┼┼┼┼┼
- 12 2020 12
- ┼┼┼┼┼┼┼┼
- ┼○●●★★☆┼┼眠二冲 眠三点☆
- ┼┼┼┼┼┼┼┼
- 111110
- ┼┼┼┼┼┼┼┼
- ┼○●☆●☆☆┼ 眠二冲 眠三点☆
- ┼┼┼┼┼┼┼┼
- 10 1010
- ┼┼┼┼┼┼┼┼
- ┼○●☆☆●☆┼ 眠二冲 眠三点☆
- ┼┼┼┼┼┼┼┼
- 10 8 8
- ┼┼┼┼┼┼┼┼
- ┼○●☆☆☆●┼ 眠二冲 眠三点☆
- ┼┼┼┼┼┼┼┼
- 10 8 8
- ┼┼┼┼┼┼┼┼
- ┼○●●☆☆☆┼眠二冲 眠三点☆
- ┼┼┼┼┼┼┼┼
- 101112
- ┼┼┼┼┼┼┼┼┼┼
- ☆★★★●★★★☆┼ 活一 冲活二
- ┼┼┼┼┼┼┼┼┼┼
- 1 4 7 9 9 7 4 1
- ┼┼┼┼┼┼┼┼
- ○☆●★★★┼┼ 活一 冲活二
- ┼┼┼┼┼┼┼┼
- 1 4 6 5 2
- ┼┼┼┼┼┼┼┼
- ○☆★●★★★☆ 活一 冲活二
- ┼┼┼┼┼┼┼┼
- 1 4 8 7 4 3
- ┼┼┼┼┼┼┼┼
- ┼○●☆★★★┼ 眠一
- ┼┼┼┼┼┼┼┼
- 1 2 2 1
-
- 本方活三为个位,如1 00 01
- 本方四 为十位,如1 00 10
- 对方活三为百位,如1 01 00
- 对方四 为千位,如1 10 00
-
- 本方三、三 若是黑子则 -1000 白子则 +1000
- 本方三、四 不管白黑都 +15000
- 本方四、四 若是黑子则 -2000 白子则 +2000
-
- (个位+十位)/2*(个位*500+十位*1000)-!(个位/2+十位/2)* 本方jing +
- (百位+千位)/2*(百位*500+千位*1000)-!(百位/2+千位/2)* 对方jing
-
- 黑子:jing=-50000
- 白子:jing=0
-
- (个位大于2 or 十位大于2),否则为1
-
- 五子棋IQ
- ;冲五
- @@@@#.1:150000000 #@@@@.5:150000000 @#@@@.4:150000000 @@@#@.2:150000000 @@#@@.3:150000000
- ;长连禁手
- @@@@#@.2:本方jing
- @@@#@@.3:本方jing
- @@#@@@.4:本方jing
- @#@@@@.5:本方jing
- @@@@#@.6:本方jing
-
- vs0
- $$$$#.1:50000000 #$$$$.5:50000000 $$#$$.3:50000000 $#$$$.4:50000000 $$$#$.2:50000000
- vs1
- #@#@@#.4:15000000+~9
- #@@#@#.3:15000000+~9
- #@@@##.1:2000000-2:15000000-6:2000000-2:~9
- ##@@@#.1:2000000-5:15000000-6:2000000-5:~9
- vs3
- ##@@@.4:1000010-5:1000010 @@@##.2:1000010-1:1000010
- @##@@.4:1000010-3:1000010 @@##@.2:1000010-3:1000010
- #@#@@.3:1000010-5:1000010 @@#@#.1:1000010-3:1000010
- @#@@#.1:1000010-4:1000010 #@@#@.2:1000010-5:1000010
- @#@#@.2:1000010-4:1000010
- #@@@#.1:10-5:10
-
- vs4
- #$$#$#.3:15000000-6:401000-1:401000
- #$#$$#.4:15000000-1:401000-6:401000
- ##$$$#.5:15000000-1:400000
- #$$$##.2:15000000-1:400000
- vs5
- ###@@###.2:100000-3:550000+~0-6:550000+~0-7:100000
- ###@@##.2:100001-5:520000
- ##@@###.3:520000-6:100001
- ###@@#.4:100001-5:30001
- #@@###.3:100001-2:30001
- #@#@##.1:100000-2:100001-4:200000-6:100000
- ##@#@#.1:100000-3:200000-5:100001-6:100000
- #@#@#.3:1
- #@##@#.3:100001-4:100001-6:20000-1:20000
- @###@.2:20000-3:20000-4:20000
-
- #$$$#.1:41000-5:41000
- ##$$$##.2:~999-6:~999
- ##$$$.4:251000-5:251000 $$$##.2:251000-1:251000 $$##$.2:251000-3:251000 $##$$.3:251000-4:251000
- $#$$#.4:251000-1:251000 #$#$$.3:251000-5:251000
- $$#$#.1:251000-3:251000 #$$#$.5:251000-2:251000
- $#$#$.4:251000-2:251000
- ###$$###.2:100000-3:150000+~99-6:150000+~99-7:100000
- ###$$##.2:100100-6:100000
- ##$$###.2:100000-6:100100
-
- ;同一行上的四与活三,不算附加分
- $##$$##.5:~14999999
- ##$$##$.3:~14999999
- $#$$###.3:~14999999
- ###$$#$.5:~14999999
- @##@@##.5:~14999999
- ##@@##@.3:~14999999
- @#@@###.3:~14999999
- ###@@#@.5:~14999999
- #$$#$$#.4:~999
- ##$$##$$##.5:~14999999-6:~14999999
- #@@#@@#.4:~9
- ##@@##@@##.5:~14999999-6:~14999999
- ###$$#.4:200100-5:100100
- #$$###.3:200100-2:100100
- #$#$##.1:100000-2:100100-4:100100-6:100000
- ##$#$#.1:100000-3:100100-5:100100-6:100000
- ##$#$##.4:10000+~99-2:10000-6:10000
- #$##$#.3:100100-4:100100-6:50000-1:50000
- $###$.2:20000-3:20000-4:20000
- vs7
- @@###.1:10000-2:10000-3:10000 ###@@.3:10000-4:10000-5:10000
- ###@###.3:20000-5:20000-2:10000-6:10000
- #@####.1:10000-2:10000-3:10000-4:10000-6:10000
- ####@#.1:10000-3:10000-4:10000-5:10000-6:10000
- ##@###.1:10000-2:10000-3:10000-5:10000-6:10000
- ###@##.1:10000-2:10000-4:10000-5:10000-6:10000
- @#####.2:10000-3:10000-4:10000-5:10000
- #####@.2:10000-3:10000-4:10000-5:10000
- ##$###.1:10000-2:10000-3:10000-5:10000-6:10000
- ###$##.1:10000-2:10000-4:10000-5:10000-6:10000
- vs8
- ###$###.3:20000-5:20000-2:10000-6:10000
- $#####.2:10000-3:10000-4:10000-5:10000
- #####$.2:10000-3:10000-4:10000-5:10000
- #$####.1:10000-2:10000-3:10000-4:10000-6:10000
- ####$#.1:10000-3:10000-4:10000-5:10000-6:10000
- vs9
- @####.4:10000 ####@.2:10000 #$###.3:10000 ###$#.3:10000
- ###@#.3:10000 #@###.3:10000 $####.3:10000 ####$.3:10000 $$###.3:10000 ###$$.3:10000 $#$##.2:10000 ##$#$.4:10000 #$##$.3:10000 $##$#.3:10000 $###$.3:10000
- vs10
复制代码
[ 本帖最后由 netbenton 于 2011-1-21 10:43 编辑 ]
作者: BillGates 时间: 2011-1-21 11:24
netbenton兄,怎么才能让主板不响呢?
作者: netbenton 时间: 2011-1-21 23:57
你主板会响吗?
怎么个响法呀?没听说过~~
作者: caruko 时间: 2011-1-23 19:51
=.= 快过年了,忙的一段时间没来了,也没继续改脚本了..
果然还是版主高明,虽然代码看的稀里糊涂..
作者: caruko 时间: 2011-1-25 13:26
仔细看了下netbenton的代码,对五子棋规则了解很深,大大节省了代码提升了效率。
而且很多地方的字符串设计的很巧妙,集判断处理多种结果于一身。
最近我重新改写了五子棋核心代码,使用了别的算法;
返回最高评分坐标集合,判断棋型禁手布局,计算时间大约0.5-1秒,只是如果要完成计算3步棋,时间花费可能达到10秒,当然保存几个计算的走子结果,在电脑“意料中”的走棋将直接读取或者从布局查找,估计电脑“思考”时间将1-10秒不等。
只是我写的代码都有点其它语言的遗留传统,在BAT本身特性的了解方面,还差很远啊。
作者: BillGates 时间: 2011-1-25 13:56 标题: 回复 14楼 的帖子
嘻嘻,准确的说是蜂鸣器啦,别让蜂鸣器发出滴滴滴的声音,你那个五子棋哦,下一个子,会滴一声,我觉得这个似乎没必要吧。嘎嘎。
作者: caruko 时间: 2011-1-25 19:20
最近改写的程序如下,并没有多少特征字串,完全使用算法思考。
已经用它执白跟netbenton兄的程序对弈过,走了3次,都是20-30多步后不小心下错坐标罢手了,但至少一直防守没有错漏。
当前只有核心代码,很粗糙,界面,悔棋等都没有做,很多都处在调试阶段,但是已经可以下棋了。
以后将会更新:
1,动态调整k1,k2值,使得电脑在判断当前局面后不至于一味防守或者进攻,只是判断标准目前还没确定,简单的以当前最高得分的落子点分值判断,还是以 “二,三,四”的数量综合评分来判断。
2,禁手,查找分值串,可以很容易判断 多行交叉的禁手,只是长连禁手还得考虑下是否放入特征串。
3,开局棋谱,目前没有加入,所以测试都是用电脑做后手。如果要电脑先手,调整为k1=10,k2=7。
4,走棋预判,以目前的计算速度看,每一步评分的时间为0.5秒,那么考虑3步需要大量时间。代码框架已经完备,以后试着添加这个功能。
5,胜负判断还没做=。=- @echo off
- setlocal enabledelayedexpansion
- 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"
- 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"
- rem 默认走白棋,k1<k2侧重防守(后手),k1>k2侧重进攻(先手)。k1,k2值可在判断双方局面评分后动态调整。
- set /a k1=7,k2=10
- set error1=坐标应为“x,y”形式,并且1-x-15,1-y-15。
- set error2=x,y坐标越界。
- set error3=该坐标已有棋子,无法在指定坐标下子。
- :初始化棋盘
- for /l %%i in (1 1 15) do (
- set "Display_%%i=┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼"
- )
- for /l %%i in (1 1 15) do for /l %%j in (1 1 15) do set QP[%%i][%%j]=0
-
- :loop
- call :显示棋盘
- call :玩家走 ||(echo,!error%ERRORLEVEL%!&goto :loop)
- call :显示棋盘
- call :判断胜负
- call :电脑走
- call :显示棋盘
- call :判断胜负
- goto :loop
- :玩家走
- set /a zq=0
- set /p P_zb=请输入坐标{1-15,1-15}:
- for /f "tokens=1,2 delims=," %%a in ("!P_zb!") do (
- if %%a GTR 0 if %%a LSS 16 set /a zq+=1
- if %%b GTR 0 if %%b LSS 16 set /a zq+=1
- if "!QP[%%a][%%b]!"=="0" set /a zq+=1
- if "!zq!"=="3" call :设置坐标 %%a %%b 2
- )
- if "!P_zb!"=="exit" exit
- if !zq! EQU 0 exit /b 1
- if !zq! EQU 1 exit /b 2
- if !zq! EQU 2 exit /b 3
- exit /b 0
- goto :eof
-
- :电脑走
- set /a 最高分=0
- for /l %%x in (1 1 15) do (
- for /l %%y in (1 1 15) do (
- if defined C_soce[%%x][%%y] (
- set "m=!C_soce[%%x][%%y]!"
- set "n=!P_soce[%%x][%%y]!"
- set /a m=!m!,n=!n!,mn=m*!k1!+n*!k2!
- if !最高分! EQU !mn! set "坐标集=!坐标集! [%%x][%%y]"
- if !最高分! LSS !mn! (
- set /a 最高分=!mn!
- set "坐标集=[%%x][%%y]"
- )
- )
- )
- )
- rem 坐标集可能含有多个坐标,以后应用在αβ剪枝算法中,现在只取第一个。
- for /f "tokens=1,2 delims=[]" %%i in ("!坐标集!") do (
- call :设置坐标 %%i %%j 1
- )
- goto :eof
-
- :判断胜负
- rem 还没做。
- goto :eof
- :显示棋盘
- for /l %%i in (15 -1 1) do (
- echo,%%i !Display_%%i!
- )
- echo,Y↑X→ 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
- goto :eof
-
-
- :设置坐标 [X为90°,Y为0°,Y-X为45°,Y+X为135°]
- set /a QP[%1][%2]=%3,x=%1,y=%2,z=%3,cut1=x-1,cut2=x,最高分=0
- if !z! equ 1 (set "cr=●") else (set "cr=○")
- set "str1=!Display_%y%:~0,%cut1%!"
- set "str2=!Display_%y%:~%cut2%!"
- set "Display_!y!=!str1!!cr!!str2!"
- set "C_str[%1][%2]="
- set "C_soce[%1][%2]="
- set "P_soce[%1][%2]="
- set "P_str[%1][%2]="
-
- ::落子点估值
- for /l %%i in (1 1 4) do (
- for %%j in (%%i_0 %%i_-%%i 0_-%%i -%%i_-%%i -%%i_+0 -%%i_+%%i 0_%%i %%i_%%i) do (
- for /f "tokens=1,2 delims=_" %%x in ("%%j") do (
- set /a xx=x+%%x,yy=y+%%y
- for /f "tokens=1,2" %%a in ("!xx! !yy!") do (
- if defined QP[%%a][%%b] if !QP[%%a][%%b]! EQU 0 (
-
- rem 更新双方字串并评分,没有的则重新创建,只更新 x-4 => x+4 范围且在一条直线上的评分。
- set /a a=%%a,b=%%b,c=1
- if "!C_str[%%a][%%b]!"=="" (
- 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
- for /l %%I in (-1 -1 -4) do (
- set /a xxx=a+%%I,yyy=b+%%I,lj1=0
- if !xxx! LSS 1 (
- set /a lj1=1
- set "c_str1=x!c_str1!"
- set "p_str1=x!p_str1!"
- ) else (
- for /f "tokens=1,2" %%A in ("!xxx! !b!") do (
- set "c_str1=!QP[%%A][%%B]!!c_str1!"
- set "p_str1=!QP[%%A][%%B]!!p_str1!"
- )
- )
- if !yyy! LSS 1 (
- set /a lj1=1
- set "c_str2=x!c_str2!"
- set "p_str2=x!p_str2!"
- ) else (
- for /f "tokens=1,2" %%A in ("!a! !yyy!") do (
- set "c_str2=!QP[%%A][%%B]!!c_str2!"
- set "p_str2=!QP[%%A][%%B]!!p_str2!"
- )
- )
- if !lj1! EQU 1 (
- set "c_str3=x!c_str3!"
- set "p_str3=x!p_str3!"
- ) else (
- for /f "tokens=1,2" %%A in ("!xxx! !yyy!") do (
- set "c_str3=!QP[%%A][%%B]!!c_str3!"
- set "p_str3=!QP[%%A][%%B]!!p_str3!"
- )
- )
- set /a xxx=a+%%I,yyy=b-%%I,lj1=0
- if !xxx! LSS 1 set /a lj1=1
- if !yyy! GTR 15 set /a lj1=1
- if !lj1! EQU 1 (
- set "c_str4=x!c_str4!"
- set "p_str4=x!p_str4!"
- ) else (
- for /f "tokens=1,2" %%A in ("!xxx! !yyy!") do (
- set "c_str4=!QP[%%A][%%B]!!c_str4!"
- set "p_str4=!QP[%%A][%%B]!!p_str4!"
- )
- )
- )
- for /l %%I in (1 1 4) do (
- set /a xxx=a+%%I,yyy=b+%%I,lj1=0
- if !xxx! GTR 15 (
- set /a lj1=1
- set "c_str1=!c_str1!x"
- set "p_str1=!p_str1!x"
- ) else (
- for /f "tokens=1,2" %%A in ("!xxx! !b!") do (
- set "c_str1=!c_str1!!QP[%%A][%%B]!"
- set "p_str1=!p_str1!!QP[%%A][%%B]!"
- )
- )
- if !yyy! GTR 15 (
- set /a lj1=1
- set "c_str2=!c_str2!x"
- set "p_str2=!p_str2!x"
- ) else (
- for /f "tokens=1,2" %%A in ("!a! !yyy!") do (
- set "c_str2=!c_str2!!QP[%%A][%%B]!"
- set "p_str2=!p_str2!!QP[%%A][%%B]!"
- )
- )
- if !lj1! EQU 1 (
- set "c_str3=!c_str3!x"
- set "p_str3=!p_str3!x"
- ) else (
- for /f "tokens=1,2" %%A in ("!xxx! !yyy!") do (
- set "c_str3=!c_str3!!QP[%%A][%%B]!"
- set "p_str3=!p_str3!!QP[%%A][%%B]!"
- )
- )
- set /a xxx=a+%%I,yyy=b-%%I,lj1=0
- if !xxx! GTR 15 set /a lj1=1
- if !yyy! LSS 1 set /a lj1=1
- if !lj1! EQU 1 (
- set "c_str4=!c_str4!x"
- set "p_str4=!p_str4!x"
- ) else (
- for /f "tokens=1,2" %%A in ("!xxx! !yyy!") do (
- set "c_str4=!c_str4!!QP[%%A][%%B]!"
- set "p_str4=!p_str4!!QP[%%A][%%B]!"
- )
- )
- )
- set /a soce1=0,soce2=0,soce3=0,soce4=0
- for %%X in (!tzk!) do (
- for /f "tokens=1,2 delims=_" %%A in ("%%X") do (
- for /l %%W in (1 1 4) do (
- if not "!c_str%%W!"=="!c_str%%W:%%A=@!" if !soce%%W! LSS %%B set /a soce%%W=%%B
- )
- )
- )
- set "C_str[!a!][!b!]=!c_str1!,!c_str2!,!c_str3!,!c_str4!"
- set "C_soce[!a!][!b!]=!soce1!+!soce2!+!soce3!+!soce4!"
- set /a soce1=0,soce2=0,soce3=0,soce4=0
- for %%X in (!p_tzk!) do (
- for /f "tokens=1,2 delims=_" %%A in ("%%X") do (
- for /l %%W in (1 1 4) do (
- if not "!p_str%%W!"=="!p_str%%W:%%A=@!" if !soce%%W! LSS %%B set /a soce%%W=%%B
- )
- )
- )
- set "P_str[!a!][!b!]=!p_str1!,!p_str2!,!p_str3!,!p_str4!"
- set "P_soce[!a!][!b!]=!soce1!+!soce2!+!soce3!+!soce4!"
- rem end 创建。
- ) else (
- rem 更新字串及评分,已存在的点会加快效率。
- if %%x NEQ 0 (
- set /a cut1=5-%%x-1,cut2=5-%%x,tk=1,pd=%%x+%%y
- if !pd! EQU 0 (
- set /a cut1=cut1+30,cut2=cut2+30,tk=4
- )
- if %%x EQU %%y (
- set /a cut1=cut1+20,cut2=cut2+20,tk=3
- )
- ) else (
- set /a cut1=15-%%y-1,cut2=15-%%y,tk=2
- )
- for /f "tokens=1,2" %%X in ("!cut1! !cut2!") do (
- set "C_str[%%a][%%b]=!C_str[%%a][%%b]:~0,%%X!!z!!C_str[%%a][%%b]:~%%Y!"
- set "P_str[%%a][%%b]=!P_str[%%a][%%b]:~0,%%X!!z!!P_str[%%a][%%b]:~%%Y!"
- )
- for /f "tokens=1-4 delims=+" %%A in ("!C_soce[%%a][%%b]!") do (
- set /a soce1=%%A,soce2=%%B,soce3=%%C,soce4=%%D
- )
- set /a soce=0,ttk=tk*10-10
- for %%T in (!ttk!) do (
- set "t_str=!C_str[%%a][%%b]:~%%T,9!"
- )
- for %%Q in (!tzk!) do (
- for /f "tokens=1,2 delims=_" %%A in ("%%Q") do (
- if not "!t_str!"=="!t_str:%%A=@!" (
- if !soce! LSS %%B set /a soce=%%B
- )
- )
- )
- set /a soce!tk!=!soce!
- set "C_soce[%%a][%%b]=!soce1!+!soce2!+!soce3!+!soce4!"
- rem 更新player评分
- for /f "tokens=1-4 delims=+" %%A in ("!P_soce[%%a][%%b]!") do (
- set /a soce1=%%A,soce2=%%B,soce3=%%C,soce4=%%D
- )
- set /a soce=0
- for %%T in (!ttk!) do (
- set "t_str=!P_str[%%a][%%b]:~%%T,9!"
- )
- for %%Q in (!p_tzk!) do (
- for /f "tokens=1,2 delims=_" %%A in ("%%Q") do (
- if not "!t_str!"=="!t_str:%%A=@!" (
- if !soce! LSS %%B set /a soce=%%B
- )
- )
- )
- set /a soce!tk!=!soce!
- set "P_soce[%%a][%%b]=!soce1!+!soce2!+!soce3!+!soce4!"
- )
- rem end更新
-
-
- )
- )
- )
- )
- )
复制代码
[ 本帖最后由 caruko 于 2011-1-26 15:17 编辑 ]
作者: caruko 时间: 2011-1-25 21:55
=。= 做了测试,发现防守还可以,进攻却缺少章法,不够犀利。
只有想办法加入“定式”,完善预判来提高智能了。
作者: caruko 时间: 2011-1-26 20:37
重复了。。看楼下。
[ 本帖最后由 caruko 于 2011-1-26 21:11 编辑 ]
作者: caruko 时间: 2011-1-26 20:59
已经完善了禁手判断,胜负判断,增加选择先后手。
对于匹配“定式”,走棋预判,已经有了思路。
有空完善后参上。
- @echo off
- setlocal enabledelayedexpansion
- ::初始变量
- 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"
- 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"
- set "禁手=0011100_三 011010_三 010110_三 011100_#三 001110_@三 01111_四 11110_四 10111_四 11011_四 11101_四 11111_五 111111_长连 "
- set "error1=坐标应为“x,y”形式,并且1-x-15,0-y-15。"
- set "error2=x,y坐标越界。"
- set "error3=该坐标已有棋子,无法在指定坐标下子。"
- set /a 步=0
- ::初始化棋盘
- for /l %%i in (1 1 15) do (
- set "Display_%%i=┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼"
- )
- for /l %%i in (1 1 15) do for /l %%j in (1 1 15) do set QP[%%i][%%j]=0
- call :显示棋盘
- ::设置先手
- :xs
- set /p 先手=请选择先手(玩家Player:P,电脑Computer:C)
- if "!先手!"=="C" (set "行动方=Computerr" & set /a k1=10,k2=7 & set "先手=C" & set "qizi1=○" & set "qizi2=●")
- if "!先手!"=="c" (set "行动方=Computer" & set /a k1=10,k2=7 & set "先手=C" & set "qizi1=○" & set "qizi2=●")
- if "!先手!"=="p" (set "行动方=Player" & set /a k1=7,k2=10 & set "先手=P" & set "qizi1=●" & set "qizi2=○")
- if "!先手!"=="P" (set "行动方=Player" & set /a k1=7,k2=10 & set "先手=P" & set "qizi1=●" & set "qizi2=○")
- if not defined 先手 goto :xs
- if "!先手!"=="C" (call :设置坐标 8 8 1) else (call :设置坐标 8 8 2 &goto :loop2)
- :loop
- call :显示棋盘
- call :玩家走 ||(echo,!error%ERRORLEVEL%!&goto :loop)
- :loop2
- call :显示棋盘
- call :电脑走
- goto :loop
- :玩家走
- set "行动方=Player"
- set /a zq=0
- set /p P_zb=请输入坐标{1-15,1-15}:
- for /f "tokens=1,2 delims=," %%a in ("!P_zb!") do (
- if %%a GTR 0 if %%a LSS 16 set /a zq+=1
- if %%b GTR 0 if %%b LSS 16 set /a zq+=1
- if "!QP[%%a][%%b]!"=="0" set /a zq+=1
- if "!zq!"=="3" call :设置坐标 %%a %%b 2
- )
- if "!P_zb!"=="exit" exit
- if !zq! EQU 0 exit /b 1
- if !zq! EQU 1 exit /b 2
- if !zq! EQU 2 exit /b 3
- exit /b 0
-
- :电脑走
- set "行动方=Computer"
- set /a 最高分=0
- for /l %%x in (1 1 15) do (
- for /l %%y in (1 1 15) do (
- if defined C_soce[%%x][%%y] (
- set "m=!C_soce[%%x][%%y]!"
- set "n=!P_soce[%%x][%%y]!"
- set /a m=!m!,n=!n!,mn=m*!k1!+n*!k2!
- if !最高分! EQU !mn! set "坐标集=!坐标集! [%%x][%%y]"
- if !最高分! LSS !mn! (
- set /a 最高分=!mn!
- set "坐标集=[%%x][%%y]"
- )
- )
- )
- )
- rem 坐标集可能含有多个坐标,以后应用在αβ剪枝算法中,现在只取第一个。
- for /f "tokens=1,2 delims=[]" %%i in ("!坐标集!") do (
- call :设置坐标 %%i %%j 1
- )
- goto :eof
-
- :胜利
- call :显示棋盘
- if "%1"=="禁手" (
- echo !行动方!范"!禁!"禁手,该局判负!
- ) else (
- echo !行动方!五子连珠,赢得该局胜利!
- )
- set /p =按任意键结束游戏!<nul
- pause>nul
- exit
- goto :eof
-
- :显示棋盘
- for /l %%i in (15 -1 1) do (
- echo %%i !Display_%%i!
- )
- echo,Y↑X→ 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
- goto :eof
-
- :设置坐标 [x] [y] [1,2]
- set /a QP[%1][%2]=%3,x=%1,y=%2,z=%3,cut1=x-1,cut2=x,最高分=0,fens=0,步+=1
- set "cr=!qizi%3!"
- set "Display_!y!=!Display_%y%:~0,%cut1%!!cr!!Display_%y%:~%cut2%!"
- set "第!步!步=%1,%2"
- ::判断禁手,“三四” “成五” 不算禁手,@三#三看似不是活三,两个一起构不成活四,但是跟别的活三,四搭配仍然是活三。
- set "禁="
- if "!行动方:~0,1!"=="!先手!" (
- for %%D in (!禁手!) do (
- for /f "tokens=1,2 delims=_" %%E in ("%%D") do (
- if not "!%先手%_str[%1][%2]!"=="!%先手%_str[%1][%2]:%%E=@!" set "禁=!禁!%%F"
- )
- )
- )
- if "!禁!"=="三四" set "禁="
- if not "!禁!"=="!禁:#=!" if not "!禁!"=="!禁:@=!" set "禁="
- if not "!禁!"=="!禁:五=!" if "!禁!"=="!禁:长连=!" set "禁="
- if "!禁:~1,1!"=="" set "禁="
- if defined 禁 call :胜利 禁手
- ::判断是否5连,断定胜负
- if !步! GTR 1 if "!行动方!"=="Computer" (set /a fens=!C_soce[%1][%2]!) else (set /a fens=!P_soce[%1][%2]!)
- if !fens! GEQ 9999999 call :胜利
- set "C_str[%1][%2]="
- set "C_soce[%1][%2]="
- set "P_soce[%1][%2]="
- set "P_str[%1][%2]="
- ::落子点估值
- for /l %%i in (1 1 4) do (
- for %%j in (%%i_0 %%i_-%%i 0_-%%i -%%i_-%%i -%%i_+0 -%%i_+%%i 0_%%i %%i_%%i) do (
- for /f "tokens=1,2 delims=_" %%x in ("%%j") do (
- set /a xx=x+%%x,yy=y+%%y
- for /f "tokens=1,2" %%a in ("!xx! !yy!") do (
- if defined QP[%%a][%%b] if !QP[%%a][%%b]! EQU 0 (
-
- rem 更新双方字串并评分,没有的则重新创建,只更新 x-4 => x+4 范围且在一条直线上的评分。
- set /a a=%%a,b=%%b,c=1
- if "!C_str[%%a][%%b]!"=="" (
- 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
- for /l %%I in (-1 -1 -4) do (
- set /a xxx=a+%%I,yyy=b+%%I,lj1=0
- if !xxx! LSS 1 (
- set /a lj1=1
- set "c_str1=x!c_str1!"
- set "p_str1=x!p_str1!"
- ) else (
- for /f "tokens=1,2" %%A in ("!xxx! !b!") do (
- set "c_str1=!QP[%%A][%%B]!!c_str1!"
- set "p_str1=!QP[%%A][%%B]!!p_str1!"
- )
- )
- if !yyy! LSS 1 (
- set /a lj1=1
- set "c_str2=x!c_str2!"
- set "p_str2=x!p_str2!"
- ) else (
- for /f "tokens=1,2" %%A in ("!a! !yyy!") do (
- set "c_str2=!QP[%%A][%%B]!!c_str2!"
- set "p_str2=!QP[%%A][%%B]!!p_str2!"
- )
- )
- if !lj1! EQU 1 (
- set "c_str3=x!c_str3!"
- set "p_str3=x!p_str3!"
- ) else (
- for /f "tokens=1,2" %%A in ("!xxx! !yyy!") do (
- set "c_str3=!QP[%%A][%%B]!!c_str3!"
- set "p_str3=!QP[%%A][%%B]!!p_str3!"
- )
- )
- set /a xxx=a+%%I,yyy=b-%%I,lj1=0
- if !xxx! LSS 1 set /a lj1=1
- if !yyy! GTR 15 set /a lj1=1
- if !lj1! EQU 1 (
- set "c_str4=x!c_str4!"
- set "p_str4=x!p_str4!"
- ) else (
- for /f "tokens=1,2" %%A in ("!xxx! !yyy!") do (
- set "c_str4=!QP[%%A][%%B]!!c_str4!"
- set "p_str4=!QP[%%A][%%B]!!p_str4!"
- )
- )
- )
- for /l %%I in (1 1 4) do (
- set /a xxx=a+%%I,yyy=b+%%I,lj1=0
- if !xxx! GTR 15 (
- set /a lj1=1
- set "c_str1=!c_str1!x"
- set "p_str1=!p_str1!x"
- ) else (
- for /f "tokens=1,2" %%A in ("!xxx! !b!") do (
- set "c_str1=!c_str1!!QP[%%A][%%B]!"
- set "p_str1=!p_str1!!QP[%%A][%%B]!"
- )
- )
- if !yyy! GTR 15 (
- set /a lj1=1
- set "c_str2=!c_str2!x"
- set "p_str2=!p_str2!x"
- ) else (
- for /f "tokens=1,2" %%A in ("!a! !yyy!") do (
- set "c_str2=!c_str2!!QP[%%A][%%B]!"
- set "p_str2=!p_str2!!QP[%%A][%%B]!"
- )
- )
- if !lj1! EQU 1 (
- set "c_str3=!c_str3!x"
- set "p_str3=!p_str3!x"
- ) else (
- for /f "tokens=1,2" %%A in ("!xxx! !yyy!") do (
- set "c_str3=!c_str3!!QP[%%A][%%B]!"
- set "p_str3=!p_str3!!QP[%%A][%%B]!"
- )
- )
- set /a xxx=a+%%I,yyy=b-%%I,lj1=0
- if !xxx! GTR 15 set /a lj1=1
- if !yyy! LSS 1 set /a lj1=1
- if !lj1! EQU 1 (
- set "c_str4=!c_str4!x"
- set "p_str4=!p_str4!x"
- ) else (
- for /f "tokens=1,2" %%A in ("!xxx! !yyy!") do (
- set "c_str4=!c_str4!!QP[%%A][%%B]!"
- set "p_str4=!p_str4!!QP[%%A][%%B]!"
- )
- )
- )
- set /a soce1=0,soce2=0,soce3=0,soce4=0
- for %%X in (!tzk!) do (
- for /f "tokens=1,2 delims=_" %%A in ("%%X") do (
- for /l %%W in (1 1 4) do (
- if not "!c_str%%W!"=="!c_str%%W:%%A=@!" if !soce%%W! LSS %%B set /a soce%%W=%%B
- )
- )
- )
- set "C_str[!a!][!b!]=!c_str1!,!c_str2!,!c_str3!,!c_str4!"
- set "C_soce[!a!][!b!]=!soce1!+!soce2!+!soce3!+!soce4!"
- set /a soce1=0,soce2=0,soce3=0,soce4=0
- for %%X in (!p_tzk!) do (
- for /f "tokens=1,2 delims=_" %%A in ("%%X") do (
- for /l %%W in (1 1 4) do (
- if not "!p_str%%W!"=="!p_str%%W:%%A=@!" if !soce%%W! LSS %%B set /a soce%%W=%%B
- )
- )
- )
- set "P_str[!a!][!b!]=!p_str1!,!p_str2!,!p_str3!,!p_str4!"
- set "P_soce[!a!][!b!]=!soce1!+!soce2!+!soce3!+!soce4!"
- rem end 创建。
- ) else (
- rem 更新字串及评分,已存在的点会加快效率。
- if %%x NEQ 0 (
- set /a cut1=5-%%x-1,cut2=5-%%x,tk=1,pd=%%x+%%y
- if !pd! EQU 0 (
- set /a cut1=cut1+30,cut2=cut2+30,tk=4
- )
- if %%x EQU %%y (
- set /a cut1=cut1+20,cut2=cut2+20,tk=3
- )
- ) else (
- set /a cut1=15-%%y-1,cut2=15-%%y,tk=2
- )
- for /f "tokens=1,2" %%X in ("!cut1! !cut2!") do (
- set "C_str[%%a][%%b]=!C_str[%%a][%%b]:~0,%%X!!z!!C_str[%%a][%%b]:~%%Y!"
- set "P_str[%%a][%%b]=!P_str[%%a][%%b]:~0,%%X!!z!!P_str[%%a][%%b]:~%%Y!"
- )
- for /f "tokens=1-4 delims=+" %%A in ("!C_soce[%%a][%%b]!") do (
- set /a soce1=%%A,soce2=%%B,soce3=%%C,soce4=%%D
- )
- set /a soce=0,ttk=tk*10-10
- for %%T in (!ttk!) do (
- set "t_str=!C_str[%%a][%%b]:~%%T,9!"
- )
- for %%Q in (!tzk!) do (
- for /f "tokens=1,2 delims=_" %%A in ("%%Q") do (
- if not "!t_str!"=="!t_str:%%A=@!" (
- if !soce! LSS %%B set /a soce=%%B
- )
- )
- )
- set /a soce!tk!=!soce!
- set "C_soce[%%a][%%b]=!soce1!+!soce2!+!soce3!+!soce4!"
- rem 更新player评分
- for /f "tokens=1-4 delims=+" %%A in ("!P_soce[%%a][%%b]!") do (
- set /a soce1=%%A,soce2=%%B,soce3=%%C,soce4=%%D
- )
- set /a soce=0
- for %%T in (!ttk!) do (
- set "t_str=!P_str[%%a][%%b]:~%%T,9!"
- )
- for %%Q in (!p_tzk!) do (
- for /f "tokens=1,2 delims=_" %%A in ("%%Q") do (
- if not "!t_str!"=="!t_str:%%A=@!" (
- if !soce! LSS %%B set /a soce=%%B
- )
- )
- )
- set /a soce!tk!=!soce!
- set "P_soce[%%a][%%b]=!soce1!+!soce2!+!soce3!+!soce4!"
- )
- rem end更新
-
-
- )
- )
- )
- )
- )
复制代码
[ 本帖最后由 caruko 于 2011-1-27 20:53 编辑 ]
作者: netbenton 时间: 2011-1-27 19:01
21楼,一开始就提示,找不到操作数,
下子无法对齐,请检查下看
才一个四,就提示四四禁手
就这样了
作者: caruko 时间: 2011-1-27 20:49
=.= 检查了一下, 操作数那个错误是下面这句
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 编辑 ]
作者: caruko 时间: 2011-1-27 21:43
还考虑过用相对坐标设计定式 =。= 如 set "定式=[-1][1][-2][-1][-2][-2]"
具体还要测试了。。
作者: ShenMian 时间: 2017-11-12 11:22
回复 12# netbenton
我觉得这所谓的智能好像还有点问题,三子一线都不理,自己在一边乱下。不管各种技巧,这应该是基本吧。
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |