一个能玩的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 编辑 ] |