[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[游戏娱乐] 批处理井字棋(三子棋)

又称三子棋。当然玩法可能有多种多样。
搜索了一下,发现小竹兄已经发过一个了。再发个纯当娱乐。

玩法:下子位置对应小键盘。
   子数不定,下满为止;
   三子连一线取先为胜,横竖斜均可;
   下满未有胜者为平局。

批处理简介:
   人机对弈,随机选择谁先下;
   下完自动进入新一局。
   电脑水平一般,因此你可以找到胜的方法;
   若选手下错位置电脑也可能赢。

刚发时系统自动把 “<nul” 截掉了,已修正。
  1. ::又叫井字棋
  2. ::当然玩法上可能会有差别
  3. ::CODE BY wxcute AT BBS.bathome.net
  4. @echo off
  5. mode con lines=12 cols=37
  6. setlocal enabledelayedexpansion
  7. for /l %%s in (1,1,7) do set SP= !sp!
  8. title .%SP%三子棋
  9. goto :start
  10. ::变量说明
  11. argument是否显示为提示棋盘的指针
  12. fate下子总计数
  13. special是否进行总计数
  14. Turn更换选手指针
  15. sub_flag选手指针
  16. input输入
  17. record下子记录
  18. remain剩下的位置
  19. winflag胜利标记
  20. ::标签说明
  21. start进入
  22. newGame新游戏
  23. begin循环开始
  24. Machine电脑下子
  25. T_flash下子棋盘更新
  26. :start
  27. ::设置棋盘棋子
  28. set chs1=●
  29. set chs0=×
  30. set L7=┏━┳━┳━┓
  31. set L6=┃7┃8┃9┃
  32. set L5=┣━╋━╋━┫
  33. set L4=┃4┃5┃6┃
  34. set L3=┣━╋━╋━┫
  35. set L2=┃1┃2┃3┃
  36. set L1=┗━┻━┻━┛
  37. ::============================================================
  38. ::开始
  39. :newGame
  40. color 72
  41. setlocal
  42. set argument=1
  43. set/a whoFirst=%random%%%2
  44. set "remain= 1 2 3 4 5 6 7 8 9"
  45. ::----------------------------------------
  46. :begin
  47. cls
  48. call :show
  49. ::调用胜负判断
  50. if "%fate%" geq "5" call :judgeVic
  51. if defined winflag goto :end
  52. if "%fate%" geq "9" goto :end
  53. ::计算下子数与判断下子方
  54. if not defined special (
  55.  set/a fate+=1,Turn="(whoFirst+fate+1)%%2"
  56. ) else set special=
  57. if %Turn% equ 0 goto :Machine
  58. ::下子
  59. set sub_flag=%Turn%
  60. set input=
  61. set/p input=%SP:~3%等待您的选择:
  62. if not defined input goto :judgeIn
  63. if %input% lss 1 goto :judgeIn
  64. if %input% gtr 9 goto :judgeIn
  65. if defined _%input% (
  66. :judgeIn
  67.  call :err
  68.  set special=1
  69.  goto :begin
  70. )
  71. goto :T_flash
  72. ::电脑下子
  73. :Machine
  74. set sub_flag=%Turn%
  75. if %fate% gtr 1 call :PCI
  76. ::电脑随机下子
  77. :PCR
  78. set Rc=
  79. if defined bN (set/a Rc=%random%%%bN) else set/a Rc="%random%%%(9-fate)"
  80. if not defined Best set Best=%remain: =%
  81. set input=!Best:~%Rc%,1!
  82. set/p=%SP:~3%电脑正在思考 <nul
  83. set "cir=/-\|"
  84. set CN=&set cirN=
  85. :lp
  86. if "%cirN%" geq "4" set/a cirN=0,CN+=1
  87. set/p=!cir:~%cirN%,1!<nul
  88. set/a cirN+=1
  89. ping -n 1 127.1>nul
  90. if "%CN%" leq "3" goto :lp
  91. ::下子后棋盘更新
  92. :T_flash
  93. set _%input%=%sub_flag%
  94. set record=%record%%input%
  95. set remain=!remain:%input%=!
  96. set/a m=(input-1)/3+1,n=(input-1)%%3+1
  97. set/a m2=m*2,n2=n*2,ln=n2-1
  98. set LL=!L%m2%!
  99. set/a pie="(sub_flag+whoFirst)%%2"
  100. set L%m2%=!LL:~,%ln%!!chs%pie%!!LL:~%n2%!
  101. goto :begin
  102. ::----------------------------------------
  103. ::结果显示
  104. :end
  105. set player1=你&set color1=color 3a
  106. set player0=电脑&set color0=color 7e
  107. if defined winflag (echo.%SP:~1%!player%sub_flag%!赢了。&!color%sub_flag%!) else echo.%SP%平局。
  108. set/p=%sp:~3%按任意键重来……<nul
  109. pause>nul
  110. endlocal
  111. goto :newGame
  112. ::============================================================
  113. ::调用标签
  114. ::显示棋盘
  115. :show
  116. echo+
  117. for /l %%i in (7 -1 1) do echo %SP:~2%!L%%i!
  118. if defined argument (
  119.  set argument=
  120.  set L=%L2:~,1%
  121.  set L2=!L! !L! !L! !L!
  122.  set L4=!L2!
  123.  set L6=!L2!
  124. )
  125. goto :eof
  126. ::错误
  127. :err
  128. echo 输入错误,或该位置上已有棋子。请重新输入……
  129. ping -n 2 127.1>nul
  130. goto :eof
  131. ::结束判断,胜负平
  132. ::最笨的列举法
  133. :judgeVic
  134. for %%i in (123 456 789 147 258 369 159 357) do (
  135.  set had=%%i
  136.  set had=!had:~,1! !had:~1,1! !had:~-1!
  137.  for /f "tokens=1-3" %%j in ("!had!") do (
  138.   if "!_%%j!!_%%k!!_%%l!"=="%sub_flag%%sub_flag%%sub_flag%" set winflag=%sub_flag%
  139.  )
  140. )
  141. goto :eof
  142. ::电脑智能下子
  143. :PCI
  144. ::echo Remain%remain%
  145. set/a _subFlag=(sub_flag+1)%%2
  146. set bN=
  147. set ept=&set Epx=
  148. set Best=
  149. set input=
  150. set d_3flag=
  151. for %%c in (%remain%) do (
  152.  set d1=&set d2=&set d3=
  153.  set d_1=&set d_2=&set d_3=
  154.  for %%i in ("1 2 3" "4 5 6" "7 8 9" "1 4 7" "2 5 8" "3 6 9" "1 5 9" "3 5 7") do (
  155.   set isFlag=
  156.   set noFlag=&set _noFlag=
  157.   set/a baseN=1,_baseN=1
  158.   for %%j in (%%~i) do (
  159.    if "%%j"=="%%c" set isFlag=1
  160.    if "!_%%j!"=="%_subFlag%" set/a noFlag=1,_baseN+=1
  161.    if "!_%%j!"=="%sub_flag%" set/a baseN+=1,_noFlag=1
  162.   )
  163.   if defined isFlag (
  164.    if not defined noFlag set/a d!baseN!+=1
  165.    if not defined _noFlag set/a d_!_baseN!+=1
  166.   )
  167.   if defined d3 set Best=%%c&set bN=1&goto :eof
  168.   if defined d_3 set d_3flag=%%c
  169.  )
  170.  set/a ept=baseN+d!baseN!+_baseN+d_!_baseN!
  171.  if "!Epx!" equ "!ept!" set Best=%%c!Best!&set/a bN+=1
  172.  if "!Epx!" lss "!ept!" set Epx=!ept!&set Best=%%c&set bN=1
  173. )
  174. if defined d_3flag set Best=%d_3flag%&set bN=1
  175. goto :eof
复制代码
1

评分人数

代码智能下子部分故意留了个小漏洞
合作事宜困难重重。

TOP

返回列表