Board logo

标题: 批处理挑战智能五子棋 [打印本页]

作者: foxJL    时间: 2007-12-16 03:01     标题: 批处理挑战智能五子棋

很早以前曾经帮百度贴吧一位朋友写了个五子棋的界面,可以自己和自己对战.
可是我到目前为止还没有想到更好的算法能计算出胜负.
虽说做好了也不一定有人会真的去拿这个游戏,但是我们应该勇于挑战.
这个难题,大家共同解决.

  1. @echo off && setlocal enabledelayedexpansion
  2. color 27 & mode con cols=35 lines=20
  3. set BQ=●&set HQ=○&set KB=┼&set xz=0&set yx=1
  4. del bq.wzq,hq.wzq>nul 2>nul
  5. :home
  6. for %%i in (a b c d e f g h i j k l m) do (
  7. for %%j in (1 2 3 4 5 6 7 8 9 10 11 12 13)do (
  8. set %%i%%j=%KB%))
  9. for /f %%k in (bq.wzq) do (set %%k=%bq%)
  10. for /f %%k in (hq.wzq) do (set %%k=%hq%)
  11. cls
  12. echo\
  13. echo      ABCDEFGHIJKLM
  14. echo    ┌┬┬┬┬┬┬┬┬┬┬┬┬┬┐
  15. echo   1├%a1%%b1%%c1%%d1%%e1%%f1%%g1%%h1%%i1%%j1%%k1%%l1%%m1%┤
  16. echo   2├%a2%%b2%%c2%%d2%%e2%%f2%%g2%%h2%%i2%%j2%%k2%%l2%%m2%┤
  17. echo   3├%a3%%b3%%c3%%d3%%e3%%f3%%g3%%h3%%i3%%j3%%k3%%l3%%m3%┤
  18. echo   4├%a4%%b4%%c4%%d4%%e4%%f4%%g4%%h4%%i4%%j4%%k4%%l4%%m4%┤
  19. echo   5├%a5%%b5%%c5%%d5%%e5%%f5%%g5%%h5%%i5%%j5%%k5%%l5%%m5%┤
  20. echo   6├%a6%%b6%%c6%%d6%%e6%%f6%%g6%%h6%%i6%%j6%%k6%%l6%%m6%┤
  21. echo   7├%a7%%b7%%c7%%d7%%e7%%f7%%g7%%h7%%i7%%j7%%k7%%l7%%m7%┤
  22. echo   8├%a8%%b8%%c8%%d8%%e8%%f8%%g8%%h8%%i8%%j8%%k8%%l8%%m8%┤
  23. echo   9├%a9%%b9%%c9%%d9%%e9%%f9%%g9%%h9%%i9%%j9%%k9%%l9%%m9%┤
  24. echo  10├%a10%%b10%%c10%%d10%%e10%%f10%%g10%%h10%%i10%%j10%%k10%%l10%%m10%┤
  25. echo  11├%a11%%b11%%c11%%d11%%e11%%f11%%g11%%h11%%i11%%j11%%k11%%l11%%m11%┤
  26. echo  12├%a12%%b12%%c12%%d12%%e12%%f12%%g12%%h12%%i12%%j12%%k12%%l12%%m12%┤
  27. echo  13├%a13%%b13%%c13%%d13%%e13%%f13%%g13%%h13%%i13%%j13%%k13%%l13%%m13%┤
  28. echo    └┴┴┴┴┴┴┴┴┴┴┴┴┴┘
  29. if %yx% equ 1 (
  30. echo.&set /p xz=现在是[●],请下子:
  31. echo !xz!>>bq.wzq
  32. set yx=0) else (
  33. echo.&set /p xz2=现在是[○],请下子:
  34. echo !xz2!>>hq.wzq
  35. set yx=1)
  36. goto :home
复制代码

作者: 随风    时间: 2007-12-16 05:42

先帮你简化一下棋盘吧。
那么多 echo
:
  1. @echo off && setlocal enabledelayedexpansion
  2. color 27 & mode con cols=35 lines=20
  3. set BQ=●&set HQ=○&set KB=┼&set xz=0&set yx=1
  4. del bq.wzq,hq.wzq>nul 2>nul
  5. :home
  6. for %%i in (a b c d e f g h i j k l m) do (
  7. for %%j in (1 2 3 4 5 6 7 8 9 10 11 12 13)do (
  8. set %%i%%j=%KB%))
  9. for /f %%k in (bq.wzq) do (set %%k=%bq%)
  10. for /f %%k in (hq.wzq) do (set %%k=%hq%)
  11. cls&echo\&echo      ABCDEFGHIJKLM
  12. echo    ┌┬┬┬┬┬┬┬┬┬┬┬┬┬┐
  13. for /l %%i in (1 1 10) do (
  14. if %%i equ 10 (set /p= %%i├<nul) else set/p=  %%i├<nul
  15.    for %%z in (a b c d e f g h i j k l m) do set/p=!%%z%%i!<nul
  16.     set/p=┤<nul&echo.
  17. )
  18. echo    └┴┴┴┴┴┴┴┴┴┴┴┴┴┘
  19. if %yx% equ 1 (
  20. echo.&set /p xz=现在是[●],请下子:
  21. echo !xz!>>bq.wzq
  22. set yx=0) else (
  23. echo.&set /p xz2=现在是[○],请下子:
  24. echo !xz2!>>hq.wzq
  25. set yx=1)
  26. goto :home
复制代码

作者: ieutk    时间: 2007-12-16 09:40

不知道set xz=0这个有什么用?

黑子输入a1后,白子也可以输入a1,那就覆盖了原来的,这个也要解决
作者: ranon    时间: 2007-12-22 12:45

怎么玩?..........................
作者: xxx3212    时间: 2008-1-17 19:04

生成的临时文件太多了
作者: 随风    时间: 2008-4-5 09:56

看看这个如何
http://bbs.bathome.net/viewthread.php?tid=820&extra=page%3D1
作者: 小竹    时间: 2008-4-6 14:10

这个http://bbs.verybat.org/viewthrea ... ge=1&amp;extra=
作者: 随风    时间: 2008-4-6 15:14     标题: 回复 7楼 的帖子

呵呵。。。。
作者: ak42d    时间: 2008-5-2 13:12

写的是不错   可是有个bug 不知道有没有发现啊


不整齐啊   一开始  和最后几行 请看一下啊
作者: batman    时间: 2008-7-19 13:15     标题: 也发一个刚写的

就是不能实现电脑智能和人机对栾(情况过于复杂,批处理难以胜任):
  1. @echo off&setlocal enabledelayedexpansion
  2. rem 设置窗口大小及色彩----------------------------------------------------------------------
  3. color 1f&mode con cols=55 lines=27
  4. title 五子棋 by zw19750516 thanks for namejm
  5. echo.&echo.&echo.&echo.&echo  程序载入中...
  6. set "codes=A B C D E F G H I J K L M N O P Q R S"
  7. set "code= %codes: =%"&set /a n=-1,m=0
  8. rem ----------------------------------------------------------------------------------------
  9. rem 获取电脑随机步数并乱序------------------------------------------------------------------
  10. for /l %%a in (1,1,19) do (
  11.     for /l %%i in (1,1,19) do (
  12.         set "a=!code:~%%i,1!"&set /a num+=1
  13.         set ".!num!=%%a!a!"
  14. ))
  15. for /l %%i in (1,1,361) do (
  16.     set /a a=!random!%%361+1
  17.     call,set "b=%%.!a!%%"
  18.     set ".!a!=!.%%i!"
  19.     set ".%%i=!b!"
  20.     set "a="&set "b="
  21. )
  22. rem ----------------------------------------------------------------------------------------
  23. rem 走子大循环(输出棋盘)--------------------------------------------------------------------
  24. :begin
  25. set "num=%m%"
  26. set /a n+=1,m+=1&if !m! equ 2 set m=0
  27. if %m% equ 0 (set "zi=●"&set "vins=●●●●●") else (set "zi=○"&set "vins=○○○○○")
  28. if defined vin set "zi=胜"
  29. if defined auto (set "_!.%n%!=%zi%") else (set "_%a%%b%=%zi%")
  30. echo.>temp.txt
  31. echo ┌───────────────────┐>>temp.txt
  32. for /l %%a in (1,1,19) do (
  33.     for /l %%i in (1,1,19) do (
  34.         if %%a equ 1 (
  35.            if %%i equ 1 (
  36.               set "_p=│┌"
  37.               ) else (
  38.               if %%i equ 19 (
  39.                  set "_p=┐│"
  40.                  ) else (
  41.                  set "_p=┬"
  42.            ))) else (
  43.            if %%a equ 19 (
  44.               if %%i equ 1 (
  45.                  set "_p=│└"
  46.                  ) else (
  47.                  if %%i equ 19 (
  48.                     set "_p=┘│"
  49.                     ) else (
  50.                     set "_p=┴"
  51.               ))) else (
  52.               if %%i equ 1 (
  53.                  set "_p=│├"
  54.                  ) else (
  55.                  if %%i equ 19 (
  56.                     set "_p=┤│"
  57.                     ) else (
  58.                     set "_p=┼"
  59.         ))))  
  60.         set str=!code:~%%i,1!
  61.         if defined _%%a!str! (
  62.            call :lop %%a %%i
  63.            ) else (
  64.            if %%i equ 19 (
  65.               set /p=!_p!%%a<nul>>temp.txt
  66.               ) else (
  67.               set /p=!_p!<nul>>temp.txt
  68.     )))
  69.     echo.>>temp.txt
  70. )
  71. echo └───────────────────┘>>temp.txt
  72. echo    %codes%>>temp.txt
  73. cls&type temp.txt
  74. rem ----------------------------------------------------------------------------------------
  75. rem 选择走棋方式----------------------------------------------------------------------------
  76. if defined hand goto step
  77. if defined auto goto next
  78. :choice
  79. set /p select=请选择(1.人下 2.电脑下):
  80. if %select% equ 2 set "auto=a"&goto begin
  81. if %select% equ 1 set "hand=a"&set /a n-=1&goto begin
  82. goto wrong
  83. :step
  84. if defined vin goto next
  85. if defined step (
  86.    if %m% equ 0 (set /p=黑子下,<nul) else (set /p=白子下,<nul)
  87.    echo 对手上一步走的:%step%<nul
  88.    ) else (
  89.    set /p=黑子先,<nul
  90. )
  91. set "ab="&set /p ab=请按纵、横顺序输入坐标(如:4h):
  92. rem ----------------------------------------------------------------------------------------
  93. rem 判断人工输入是否正确-------------------------------------------------------------------
  94. if not defined ab goto wrong
  95. if "%ab:~1%" equ "" goto wrong
  96. if "%ab:~3%" neq "" goto wrong
  97. if "%ab:~2%" equ "" (set "a=%ab:~,1%"&set "b=%ab:~1%") else (set "a=%ab:~,2%"&set "b=%ab:~2,1%")
  98. if "%a:~,1%" equ "0" goto wrong
  99. echo %a%|findstr "[^0-9]">nul&&goto wrong
  100. echo %b%|findstr "[0-9]">nul&&goto wrong
  101. if %a% lss 1 goto wrong
  102. if %a% gtr 19 goto wrong
  103. if "!codes:%b%=!" equ "%codes%" goto wrong
  104. if defined _%a%%b% goto wrong
  105. set "step=%ab%"
  106. rem ----------------------------------------------------------------------------------------
  107. rem 输出结果--------------------------------------------------------------------------------
  108. :next
  109. del /q temp.txt
  110. if defined vin (
  111.    if %m% equ 0 (set /p=白子胜,<nul) else (set /p=黑子胜,<nul)
  112.    echo 最后落子为:%a%%b%。
  113.    pause>nul&exit
  114. )
  115. if %n% neq 361 (goto begin) else (echo 结果不分胜负!&pause>nul&exit)
  116. rem ----------------------------------------------------------------------------------------
  117. rem 判断是否胜出----------------------------------------------------------------------------
  118. :lop
  119. if %2 equ 1 (set "ll=set /p=│<nul>>temp.txt&") else (set "ll=")
  120. if %2 equ 19 (set "rr=&set /p=│%1<nul>>temp.txt") else (set "rr=")
  121. %ll%set /p=!_%1%str%!<nul>>temp.txt%rr%
  122. if "%1%str%" equ "!.%n%!" set "a=%1"&set "b=%str%"&goto judge
  123. if /i "%1%str%"=="%step%" goto judge
  124. goto :eof
  125. :judge
  126. set "hang="&set "lie="&set "ls="&set "rs="&set "ss="&set "x=0"&set "y=0"&set "z=0"
  127. set /a x1=%2-4,x2=%2+4,y1=%1+4,y2=%1-4
  128. if %x1% lss 0 set "x1=0"
  129. if %y2% lss 0 set "y2=0"
  130. if %x2% gtr 19 set "x2=19"
  131. if %y1% gtr 19 set "y1=19"
  132. for /l %%i in (%x1%,1,%x2%) do set "ss=!ss! !code:~%%i,1!"
  133. for %%i in (%ss%) do if defined _%1%%i (set "hang=!hang!!_%1%%i!") else (set "hang=!hang!#")
  134. for /l %%i in (%y2%,1,%y1%) do if defined _%%i%str% (set "lie=!lie!!_%%i%str%!") else (set "lie=!lie!#")
  135. for %%a in (%ss%) do (
  136.     set /a x+=1,y=0,z=0
  137.     for /l %%b in (%y1%,-1,%y2%) do (
  138.         set /a y+=1
  139.         if !x! equ !y! (
  140.            if defined _%%b%%a (
  141.               set "ls=!ls!!_%%b%%a!"
  142.               ) else (
  143.               set "ls=!ls!#"
  144.     )))
  145.     for /l %%c in (%y2%,1,%y1%) do (
  146.         set /a z+=1
  147.         if !x! equ !z! (
  148.            if defined _%%c%%a (
  149.               set "rs=!rs!!_%%c%%a!"
  150.               ) else (
  151.               set "rs=!rs!#"
  152. ))))
  153. for %%i in (%hang% %lie% %ls% %rs%) do (
  154.     set var=%%i
  155.     if defined var if "!var:%vins%=!" neq "!var!" set /a n-=1&set "vin=a"&set "m=%num%"&goto begin
  156. )
  157. goto :eof
  158. rem ----------------------------------------------------------------------------------------
  159. rem 报错-----------------------------------------------------------------------------------
  160. :wrong
  161. set /p=错误,请正确输入。<nul&set "m=%num%"
  162. ping /n 2 127.1>nul&set "a="&set "b="&set /a n-=1&goto begin
  163. rem ----------------------------------------------------------------------------------------
复制代码


[ 本帖最后由 zw19750516 于 2008-7-19 13:23 编辑 ]
作者: 骚鸡    时间: 2008-7-19 13:53     标题: 回复 10楼 的帖子

现在的这个不错了~~好像比随风的要好
作者: tjtchly    时间: 2008-8-14 20:33

10楼的太牛了。佩服。
作者: benjaminchiang1    时间: 2008-11-8 19:36

提示: 该帖被管理员或版主屏蔽
作者: gbw911    时间: 2009-11-29 10:55

很好啊,就是少了点rem,这样才能让everyone看懂
作者: zonixkula    时间: 2009-11-29 11:44     标题: 批处理竟然能如此强悍!!!

太好了,上课时拿来解解闷。
作者: caruko    时间: 2009-12-2 15:54

想起我高三的时候用QBASIC在电子词典上写的五子棋程序..
胜负,棋盘都没问题...
但是为了写智能,写到了1000行,还是错漏很多..
走个10多步,就开始非常缓慢,而且明显电脑开始乱走棋了..
那时候还是自己琢磨的非智能算法....
作者: netbenton    时间: 2009-12-2 20:14

此贴如果还有人感兴趣挑战,可先看看这个,可能可以少走一些弯路:

http://bbs.bathome.net/thread-4423-1-1.html
作者: todayambition    时间: 2010-4-11 17:05

看了下高手的作品,确实不错,只是电脑下棋好笨了,可不可以提高下电脑的智商啊  呵呵
作者: rogue_1983    时间: 2010-6-25 15:43     标题: 程序复杂

正所谓高手中的高手,强中只有强中手




欢迎光临 批处理之家 (http://bathome.net./) Powered by Discuz! 7.2