找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 9110|回复: 2

[游戏娱乐]批处理汉诺塔

[复制链接]
发表于 2021-6-15 00:20:56 | 显示全部楼层 |阅读模式
本帖最后由 路过 于 2021-6-15 00:24 编辑

模型设计参考http://www.bathome.net/thread-4892-1-1.html并作出如下改进:
    1.图案可自定义;
    2.支持更多移动指令;
    3.支持更多盘数[默认最小2最多13];
    4.支持任意合法状态的汉诺塔求解;
    5.内置作弊指令[修改步数,强制移动等]。
  1. @echo off
  2. title 汉诺塔V1.2
  3. color 0f
  4. set #=3
  5. set #q=%path%
  6. for /f "delims== eol=#" %%z in ('set ') do (set "%%z=")
  7. set path=%#q%
  8. setlocal enabledelayedexpansion

  9. ::自定义图标序列C、最少盘数Mi和最多盘数Ma、柱子名称[#x、#y、#z皆1个字符].
  10. ::忽略ping时的最小盘数#p,注意图标序列中不能出现柱子名称
  11. set C=_1234567890JQK
  12. set/a Ma=13,Mi=2,#q=0
  13. set #x=a
  14. set #y=b
  15. set #z=c
  16. set #p=8
  17. call :Help %#%

  18. :Wait 等待用户输入
  19. cls&echo;当前盘子数:%#%
  20. set /p Sz=s开始游戏,[%Mi%-%Ma%]重定义盘子数
  21. for /l %%a in (%Mi%,1,%Ma%) do (if !Sz!==%%a (call :Win %%a))
  22. if /i !Sz!==s (goto :Init)
  23. goto :Wait

  24. :Init 游戏初始化
  25. set "Sz="
  26. for /l %%a in (1,1,%#%) do (set _!C:~%%a,1!=%#x%)
  27. set $=%#x% %#y% %#z%
  28. for /f "delims==" %%z in ('set .') do (set "%%z=")
  29. for %%b in (%$%) do (set $w=!$:%%b =!
  30. for %%c in (!$w!) do (set .%%b%%c=3))
  31. for /l %%a in (1,1,%#%) do (
  32.         for %%b in (%$%) do (set .!C:~%%a,1!%%b=1
  33.         set .!C:~%%a,1!%%b#=4)
  34. )
  35. for /l %%a in (1,1,%#%) do (for %%b in (%$%) do (set $w=!$:%%b =!
  36. for %%c in (!$w!) do (set .!C:~%%a,1!%%b%%c=2)))
  37. set/a Sp=0,lin=0
  38. if !#q!==1 (set/a .1152=5)

  39. ::绘图常量初始化
  40. for /f "delims==" %%z in ('set $') do (set "%%z=")
  41. for %%b in (%#x% %#y% %#z%) do (
  42.         for /l %%a in (1,1,%#%) do (set "$%%b=!$%%b! ")
  43.         set $%%b=!$%%b!%%b!$%%b!
  44. )
  45. for /l %%a in (1,1,%#%) do (set $w=!$w!%C:~0,1%
  46.         for /l %%b in (%%a,1,%#%) do (set w=!C:~%%b,1!
  47.                 set $%%b=!$%%b!!w!
  48.         )
  49.         set w=!C:~%%a,1!
  50.         set $%%a=!$%%a:~0,-1!!w!!$%%a:~0,-1!
  51.         for /l %%b in (%%a,1,%#%) do (set "$%%a= !$%%a! ")
  52. )
  53. set $w=!$w!!$w!%C:~0,1%
  54. set $=!$1:1= !

  55. :Loop 显示游戏
  56. call :Move_Draw !Sz!
  57. set/a Sz=1,St=0
  58. for /l %%a in (1,1,%#%) do (for /f %%b in ("!C:~%%a,1!") do (if !_%%b!==%#z% (set/a St+=1)))
  59. if !St!==%#% (
  60.         set/a "St=(1<<%#%)-1"
  61.         if !Sp! lss !St! (echo;最少步数!St!,开了是吧!)
  62.         if !Sp! equ !St! (echo;方法最便捷,太厉害了!)
  63.         if !Sp! gtr !St! (echo;最少步数!St!,继续努力!)
  64.         pause & goto :Wait
  65. )
  66. echo;b返回 s求解 r重玩 q作弊开关
  67. if !#q!==1 (echo;1152直接过关 +/-增减1步,++/--增减10步,+++/---增减100步)
  68. set /p Sz=请输入移动指令或命令:
  69. if /i !Sz!==b (goto :Wait)
  70. if /i !Sz!==q (if !#q! neq 1 (set #q=1) else (set #q=0))
  71. if /i !Sz!==s (Call :Solute %#z%)
  72. if /i !Sz!==r (
  73.         for /l %%a in (1,1,%#%) do (set _!C:~%%a,1!=%#x%)
  74.         set/a Sp=0,lin=0
  75. )
  76. if !#q!==1 (
  77.         for %%a in (+ -) do (
  78.                 if !Sz!==%%a (set/a Sp%%a=1)
  79.                 if !Sz!==%%a%%a (set/a Sp%%a=10)
  80.                 if !Sz!==%%a%%a%%a (set/a Sp%%a=100)
  81.         )
  82.         if !Sp! lss 0 (set Sp=0)
  83. )
  84. goto :Loop

  85. :Solute 任意状态求解
  86. set/a lin=0
  87. set lst=%1
  88. set all=%#x%%#y%%#z%
  89. for /l %%a in (%#%,-1,1) do (set/a nxt=%%a-1
  90.         for /f %%b in ("!C:~%%a,1!") do (
  91.                 if !_%%b! neq !lst! (
  92.                         for /f "tokens=1-2" %%c in ("!lst! !_%%b!") do (
  93.                                 set be=!all:%%c=!
  94.                                 set be=!be:%%d=!
  95.                                 set ".cm!lin!=call :Best_Solute !nxt! !be! %%c %%d"
  96.                                 set/a lin+=1
  97.                                 set ".cm!lin!=call :Move_Draw %%b%%c#"
  98.                                 set/a lin+=1
  99.                                 set lst=!be!
  100.                         )
  101.                 )
  102.         )
  103. )
  104. (set #q=1
  105.         for /l %%z in (!lin!,-1,0) do (!.cm%%z!)
  106. set #q=%#q%)
  107. set "Sz="
  108. goto :eof

  109. :Best_Solute 获取最优解
  110. if %1 equ 0 goto :eof
  111. set/a n=%1-1
  112. call :Best_Solute %n% %2 %4 %3
  113. set w=!C:~%1,1!
  114. call :Move_Draw !w!%3#
  115. set/a n=%1-1
  116. call :Best_Solute %n% %4 %3 %2
  117. goto :eof

  118. :Move_Draw 绘图与移动检测
  119. set qq=0
  120. if defined .%1 (
  121.         set qq=!.%1!
  122.         set Sz=%1
  123.         set/a M1=0,D1=0,M2=0,D2=0
  124.         set End=!Sz:~-1!
  125. )
  126. if !qq!==1 (::1b型
  127.         for /f %%a in ("!Sz:~0,1!") do (set Sz=%%a!_%%a!!End!
  128.         if !_%%a! neq !End! (set/a qq+=1))
  129. )
  130. if !qq!==2 (::1ab型
  131.         set M1=!Sz:~1,1!&set M2=!Sz:~0,1!
  132.         for /l %%a in (%#%,-1,1) do (for /f %%b in ("!C:~%%a,1!") do (if !_%%b!==!M1! (set D1=%%b)))
  133.         if !D1!==!M2! (set Sz=!Sz:~1,2!&set/a qq+=1)
  134. )
  135. if !qq!==3 (::ab型
  136.         set qq=!Sz:~0,1!
  137.         set/a M1=0,D1=0,M2=0,D2=0
  138.         for /l %%a in (%#%,-1,1) do (for /f %%b in ("!C:~%%a,1!") do (if !_%%b!==!qq! (set M1=%%a&set D1=%%b)
  139.         if !_%%b!==!End! (set M2=%%a&set D2=%%b)))
  140.         if !M1! neq 0 (if !M2!==0 (set _!D1!=!End!&set/a Sp+=1) else (if !M2! gtr !M1! (set _!D1!=!End!&set/a Sp+=1)))
  141. )
  142. if !#q!!qq!==14 (::1b#型
  143.         set D1=!Sz:~0,1!
  144.         set D2=!Sz:~1,1!
  145.         set _!D1!=!D2!
  146.         if !lin! neq 0 (if %#% lss %#p% (ping/n 2 127.0>nul))
  147.         set/a Sp+=1
  148. )
  149. if !qq!==5 (for /l %%a in (1,1,%#%) do (set _!C:~%%a,1!=%#z%))

  150. ::绘图
  151. for /l %%a in (1,1,%#%) do (for %%b in (%#x% %#y% %#z%) do (set k%%b%%a=%$%))
  152. set/a _%#x%_=#,_%#y%_=#,_%#z%_=#
  153. for /l %%a in (%#%,-1,1) do (
  154.         for /f %%b in ("!C:~%%a,1!") do (
  155.                 for /f %%c in ("!_%%b!") do (set k%%c!_%%c_!=!$%%a!
  156.                 set/a _%%c_-=1)
  157.         )
  158. )
  159. (cls&echo;
  160.         for /l %%a in (1,1,%#%) do (echo;  !k%#x%%%a!    !k%#y%%%a!    !k%#z%%%a!)
  161.         echo;  %$w%    %$w%    %$w%
  162.         echo;  !$%#x%!    !$%#y%!    !$%#z%!
  163. echo;已用步数%Sp%)
  164. goto :eof

  165. :Help 帮助
  166. mode con cols=80 lines=25
  167. (echo;
  168. echo;                  批处理汉诺塔V1.2      Made By 路过 ^& 1152
  169. echo;
  170. echo;    有三根柱子,从左到右命名为%#x%%#y%%#z%。最初所有的圆盘都位于第一根柱子%#x%上,将所有
  171. echo;的圆盘移动到第三根柱子%#z%上则通关。有两个限制:①在小圆盘上不能放大圆盘②一次只
  172. echo;能移动一个圆盘。以3个圆盘为例,左边是游戏刚开始的状态,右边为通关时的状态。
  173. echo;
  174. echo;     %C:~1,1%                            ^|                           %C:~1,1%
  175. echo;    %C:~2,1%%C:~2,1%%C:~2,1%                           ^|                          %C:~2,1%%C:~2,1%%C:~2,1%
  176. echo;   %C:~3,1%%C:~3,1%%C:~3,1%%C:~3,1%%C:~3,1%                          ^|                         %C:~3,1%%C:~3,1%%C:~3,1%%C:~3,1%%C:~3,1%
  177. echo;  %C:~0,1%%C:~0,1%%C:~0,1%%C:~0,1%%C:~0,1%%C:~0,1%%C:~0,1%    %C:~0,1%%C:~0,1%%C:~0,1%%C:~0,1%%C:~0,1%%C:~0,1%%C:~0,1%    %C:~0,1%%C:~0,1%%C:~0,1%%C:~0,1%%C:~0,1%%C:~0,1%%C:~0,1%   ^|  %C:~0,1%%C:~0,1%%C:~0,1%%C:~0,1%%C:~0,1%%C:~0,1%%C:~0,1%    %C:~0,1%%C:~0,1%%C:~0,1%%C:~0,1%%C:~0,1%%C:~0,1%%C:~0,1%    %C:~0,1%%C:~0,1%%C:~0,1%%C:~0,1%%C:~0,1%%C:~0,1%%C:~0,1%
  178. echo;     %#x%          %#y%          %#z%      ^|     %#x%          %#y%          %#z%
  179. echo;
  180. echo;    字符串“%C:~1%”中每个字符代表不同圆盘,字符重复的次数代表大小。提供以下移动指令
  181. echo;
  182. echo;      ①输入移动圆盘和目的地,如“%C:~1,1%%#y%”代表将圆盘%C:~1,1%移到%#y%柱上。
  183. echo;      ②输入圆盘所在柱和目的地,如“%#x%%#y%”代表将%#x%柱最上面的圆盘移到%#y%柱上。
  184. echo;      ③输入圆盘^|所在柱^|目的地,如“%C:~1,1%%#x%%#y%”代表将%#x%柱上的圆盘%C:~1,1%移到%#y%柱上。
  185. echo;      ④输入圆盘^|目的地^|#,如“%C:~1,1%%#y%#”代表将圆盘%C:~1,1%强制移到%#y%柱上【需开启作弊】。
  186. echo;
  187. echo;    移动指令和命令需完整输入并回车,只有正确的指令才会被执行,错误的须重新输入
  188. echo;&pause)

  189. :Win 加载窗口
  190. set/a #=%1,wx=6*%1+18,wy=%1+10
  191. mode con cols=%wx% lines=%wy%
  192. goto :eof
复制代码

评分

参与人数 2PB +6 技术 +1 收起 理由
老刘1号 + 6 感谢分享
Zhangjianxiong + 1 感谢分享

查看全部评分

发表于 2021-6-15 10:55:29 | 显示全部楼层
牛啊,点赞
发表于 2021-6-27 11:05:35 | 显示全部楼层
大佬牛皮啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-16 21:42 , Processed in 0.019936 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表