Board logo

标题: [游戏娱乐] 批处理版汉诺塔游戏 [打印本页]

作者: more    时间: 2009-6-11 23:21     标题: 批处理版汉诺塔游戏

  1. @echo off
  2. :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  3. ::
  4. ::本汉诺塔游戏的规则如下:
  5. ::    把a上的盘子(从上到下依次为1.2.3...大于1的数字为多个重复只是为了直观的显示盘子的大小,
  6. ::并无其它意义)借住b逐个全部移到c上,在移动的过程中,不能把大的盘子放在小盘子上面.
  7. ::    输入的规则为:第一个字符为要移动的盘子的编号,第二个字符为要移动的盘子所在的位置,
  8. ::第三个字符为盘子移动后的位置.如下所示:
  9. ::     1
  10. ::    222
  11. ::   33333
  12. ::  _______    _______    _______
  13. ::     a          b          c
  14. ::要把编号为1的盘子移动到c上,输入"1ac"回车即可.
  15. ::
  16. ::以下为最终的目的:
  17. ::                           1
  18. ::                          222
  19. ::                         33333
  20. ::  _______    _______    _______
  21. ::     a          b          c
  22. ::
  23. ::在提示输入盘子个数时可以输入"h"观看游戏演示
  24. ::本游戏由于要考虑效率的关系,并没做太多错误输入的判断,所以请严格按要求输入...
  25. :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  26. :bgn
  27. echo.
  28. setlocal enabledelayedexpansion
  29. set "ttl=9"
  30. :agn
  31. set input=&set /p input=请输入盘子的个数(2~7)(h游戏演示,回车退出):
  32. if not defined input goto :eof
  33. if /i "%input%"=="h" (
  34.    set "movie=movie"
  35.    set "input=5"
  36.    goto :skp
  37. )
  38. if %input% lss 2 (echo.别那么弱智好不好...&goto :agn)
  39. if %input% gtr %ttl% (echo.太多了,你想玩到猴年马月呀...&goto :agn)
  40. :skp
  41. cls
  42. set /a a=1,all=1
  43. for /l %%a in (%input% -1 1) do (
  44.    set /a n+=1,m=n*2-1,all*=2
  45.    set "space="
  46.    for /l %%i in (1 1 %%a) do (set "space=!space! ")
  47.    for /l %%x in (1 1 !m!) do (call set "code!n!=%%code!n!%%!n!")
  48.    call set "col_a!n!=!space!%%code!n!%%!space!"
  49.    call echo.%%col_a!n!%%
  50. )
  51. set /a m+=2,all-=1&set "space="&set "kong=    "
  52. for /l %%a in (1 1 %m%) do (
  53.    set "line=!line!_"
  54.    set "empty=!empty! "
  55. )
  56. set "line=!line!!kong!!line!!kong!!line!"
  57. echo.!line!
  58. set /a "tmp_=%m%/2"
  59. for /l %%a in (1 1 %tmp_%) do (set "space=!space! ")
  60. set "line2=!space!a!space!!kong!!space!b!space!!kong!!space!c"
  61. echo.!line2!
  62. for /l %%i in (1 1 %input%) do (
  63.    set "a%%i=ok"
  64.    set "col_b%%i=%empty%"
  65.    set "col_c%%i=%empty%"
  66. )
  67. if defined movie (goto :movie)
  68. :game
  69. echo.&set in=&set /p in=请输入(回车开始新游戏):
  70. if not defined in (endlocal&goto :bgn)
  71. if "%in:~-2,1%"=="%in:~-1%" (
  72.    echo.请别开这种玩笑好不好^^^!^^^!^^^!
  73.    goto :game
  74. )
  75. if %in:~0,-2% gtr !input! (
  76.    echo.盘子的编号超出范围了^^^!^^^!^^^!
  77.    goto :game
  78. )
  79. if %in:~0,-2% lss 1 (
  80.    echo.盘子的编号超出范围了^^^!^^^!^^^!
  81.    goto :game
  82. )
  83. set /a "tmp_=%in:~0,-2%-1"&set "tmp_1=!in:~-1!"&set "tmp_2=!in:~-2,1!"
  84. if %tmp_% gtr 0 (
  85.    for /l %%a in (1 1 !tmp_!) do (
  86.       if defined !tmp_2!%%a (
  87.          echo.请先把上面的小盘子移走...
  88.          goto :game
  89.       )
  90.       if defined !tmp_1!%%a (
  91.          echo.大盘子不能放在小盘子的上面^^^!^^^!^^^!
  92.          goto :game
  93.       )
  94.    )
  95. )
  96. set /a "times+=1"
  97. set "%in:~-2,1%%in:~0,-2%="
  98. set "%in:~-1%%in:~0,-2%=ok"
  99. call set "var=%%col_!in:~-2,1!!%in:~-2,1%!%%"
  100. call :set_ %in:~-1% "!var!"
  101. set "col_%in:~-2,1%!%in:~-2,1%!=%empty%"
  102. set /a %in:~-2,1%+=1
  103. cls
  104. set n=0
  105. for /l %%i in (1 1 %input%) do (
  106.    echo.!col_a%%i!!kong!!col_b%%i!!kong!!col_c%%i!
  107.    if defined c%%i (set /a n+=1)
  108. )
  109. echo.!line!&echo.!line2!
  110. if "%n%"=="%input%" (
  111.    echo.&echo.恭喜你,完全正确,你用%times%步完成了这次游戏...&echo.
  112.    if "%times%"=="%all%" (
  113.       echo.你的方法是最便捷的,太厉害了^^^!^^^!^^^!
  114.    ) else (
  115.       echo.最便捷的方法只用%all%步就可以完成哦,继续努力^^^!^^^!^^^!
  116.    )
  117.    endlocal
  118.    goto :bgn
  119. )
  120. goto :game
  121. :set_
  122. for /l %%a in (%input% -1 1) do (
  123.    if "!col_%1%%a: =!"=="" (
  124.       set "col_%1%%a=%~2"
  125.       set "%1=%%a"
  126.       goto :eof
  127.    )
  128. )
  129. goto :eof
  130. :movie
  131. type nul>"%temp%\ans_hanoi.txt"
  132. call :show !input! a b c
  133. for /f "delims=" %%i in ('type "%temp%\ans_hanoi.txt"') do (
  134.    set "in=%%i"
  135.    call call set "var=%%%%col_!in:~-2,1!%%!in:~-2,1!%%%%%%"
  136.    call :set_ !in:~-1! "!var!"
  137.    call set "col_!in:~-2,1!%%!in:~-2,1!%%=!empty!"
  138.    set /a "!in:~-2,1!+=1"
  139.    ping -n 2 127.1 >nul
  140.    cls
  141.    for /l %%m in (1 1 !input!) do (
  142.       echo.!col_a%%m!!kong!!col_b%%m!!kong!!col_c%%m!
  143.    )
  144.    echo.!line!&echo.!line2!
  145. )
  146. echo.&echo.演示完毕...&endlocal&goto :bgn
  147. :show
  148. if "%1"=="1" (
  149.    >>"%temp%\ans_hanoi.txt" echo.%1%2%4
  150. ) else (
  151.    set /a "var=%1-1"
  152.    call :show !var! %2 %4 %3
  153.    >>"%temp%\ans_hanoi.txt" echo.%1%2%4
  154.    set /a "var=%1-1"
  155.    call :show !var! %3 %2 %4
  156. )
  157. goto :eof
复制代码

作者: pusofalse    时间: 2009-6-12 14:45

请问是原创吗?如果是,这样的代码放在原创版块比较好。
作者: more    时间: 2009-6-12 17:07

回版主,这是本人原创的.
如果版主觉得有必要的话,就请把帖子移到原创代码区吧.
下面的代码是对顶楼的一些小小的修改,修改的主要内容有:
    1.演示的盘子个数为随机的3~7个.
    2.由于担心代码会被使用者修改引起变量长度超出范围从而导致演示过程出现错误,所以演示的过程产生了一个临时文件,如果不修改的话是可以不产生临时文件的,如下面的代码.
    3.增加了一个对输入错误的判断.
  1. @echo off
  2. :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  3. ::
  4. ::本汉诺塔游戏的规则如下:
  5. ::    把a上的盘子(从上到下依次为1.2.3...大于1的数字为多个重复只是为了直观的显示盘子的大小,
  6. ::并无其它意义)借住b逐个全部移到c上,在移动的过程中,不能把大的盘子放在小盘子上面.
  7. ::    输入的规则为:第一个字符为要移动的盘子的编号,第二个字符为要移动的盘子所在的位置,
  8. ::第三个字符为盘子移动后的位置.如下所示:
  9. ::     1
  10. ::    222
  11. ::   33333
  12. ::  _______    _______    _______
  13. ::     a          b          c
  14. ::要把编号为1的盘子移动到c上,输入"1ac"回车即可.
  15. ::
  16. ::以下为最终的目的:
  17. ::                           1
  18. ::                          222
  19. ::                         33333
  20. ::  _______    _______    _______
  21. ::     a          b          c
  22. ::
  23. ::在提示输入盘子个数时可以输入"h"观看游戏演示
  24. ::本游戏由于要考虑效率的关系,并没做太多错误输入的判断,所以请严格按要求输入...
  25. :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  26. :bgn
  27. echo.
  28. setlocal enabledelayedexpansion
  29. set "ttl=9"
  30. :agn
  31. set input=&set /p input=请输入盘子的个数(2~7)(h游戏演示,回车退出):
  32. if not defined input goto :eof
  33. if /i "%input%"=="h" (
  34.    set "movie=movie"
  35.    set /a "input=!random!%%5+3"
  36.    goto :skp
  37. )
  38. if %input% lss 2 (echo.别那么弱智好不好...&goto :agn)
  39. if %input% gtr %ttl% (echo.太多了,你想玩到猴年马月呀...&goto :agn)
  40. :skp
  41. cls
  42. set /a a=1,all=1
  43. for /l %%a in (%input% -1 1) do (
  44.    set /a n+=1,m=n*2-1,all*=2
  45.    set "space="
  46.    for /l %%i in (1 1 %%a) do (set "space=!space! ")
  47.    for /l %%x in (1 1 !m!) do (call set "code!n!=%%code!n!%%!n!")
  48.    call set "col_a!n!=!space!%%code!n!%%!space!"
  49.    call echo.%%col_a!n!%%
  50. )
  51. set /a m+=2,all-=1&set "space="&set "kong=    "
  52. for /l %%a in (1 1 %m%) do (
  53.    set "line=!line!_"
  54.    set "empty=!empty! "
  55. )
  56. set "line=!line!!kong!!line!!kong!!line!"
  57. echo.!line!
  58. set /a "tmp_=%m%/2"
  59. for /l %%a in (1 1 %tmp_%) do (set "space=!space! ")
  60. set "line2=!space!a!space!!kong!!space!b!space!!kong!!space!c"
  61. echo.!line2!
  62. for /l %%i in (1 1 %input%) do (
  63.    set "a%%i=ok"
  64.    set "col_b%%i=%empty%"
  65.    set "col_c%%i=%empty%"
  66. )
  67. if defined movie (goto :movie)
  68. :game
  69. echo.&set in=&set /p in=请输入(回车开始新游戏):
  70. if not defined in (endlocal&goto :bgn)
  71. echo.%in:~-2%|findstr /i /v "^[abc]*$" >nul
  72. if "%errorlevel%"=="0" (
  73.    echo.目标位置不正确^^^!^^^!^^^!
  74.    goto :game
  75. )
  76. if "%in:~-2,1%"=="%in:~-1%" (
  77.    echo.请别开这种玩笑好不好^^^!^^^!^^^!
  78.    goto :game
  79. )
  80. if %in:~0,-2% gtr !input! (
  81.    echo.盘子的编号超出范围了^^^!^^^!^^^!
  82.    goto :game
  83. )
  84. if %in:~0,-2% lss 1 (
  85.    echo.盘子的编号超出范围了^^^!^^^!^^^!
  86.    goto :game
  87. )
  88. set /a "tmp_=%in:~0,-2%-1"&set "tmp_1=!in:~-1!"&set "tmp_2=!in:~-2,1!"
  89. if %tmp_% gtr 0 (
  90.    for /l %%a in (1 1 !tmp_!) do (
  91.       if defined !tmp_2!%%a (
  92.          echo.请先把上面的小盘子移走...
  93.          goto :game
  94.       )
  95.       if defined !tmp_1!%%a (
  96.          echo.大盘子不能放在小盘子的上面^^^!^^^!^^^!
  97.          goto :game
  98.       )
  99.    )
  100. )
  101. set /a "times+=1"
  102. set "%in:~-2,1%%in:~0,-2%="
  103. set "%in:~-1%%in:~0,-2%=ok"
  104. call set "var=%%col_!in:~-2,1!!%in:~-2,1%!%%"
  105. call :set_ %in:~-1% "!var!"
  106. set "col_%in:~-2,1%!%in:~-2,1%!=%empty%"
  107. set /a %in:~-2,1%+=1
  108. cls
  109. set n=0
  110. for /l %%i in (1 1 %input%) do (
  111.    echo.!col_a%%i!!kong!!col_b%%i!!kong!!col_c%%i!
  112.    if defined c%%i (set /a n+=1)
  113. )
  114. echo.!line!&echo.!line2!
  115. if "%n%"=="%input%" (
  116.    echo.&echo.恭喜你,完全正确,你用%times%步完成了这次游戏...&echo.
  117.    if "%times%"=="%all%" (
  118.       echo.你的方法是最便捷的,太厉害了^^^!^^^!^^^!
  119.    ) else (
  120.       echo.最便捷的方法只用%all%步就可以完成哦,继续努力^^^!^^^!^^^!
  121.    )
  122.    endlocal
  123.    goto :bgn
  124. )
  125. goto :game
  126. :set_
  127. for /l %%a in (%input% -1 1) do (
  128.    if "!col_%1%%a: =!"=="" (
  129.       set "col_%1%%a=%~2"
  130.       set "%1=%%a"
  131.       goto :eof
  132.    )
  133. )
  134. goto :eof
  135. :movie
  136. set "str="
  137. call :show !input! a b c
  138. for %%i in (!str!) do (
  139.    set "in=%%i"
  140.    call call set "var=%%%%col_!in:~-2,1!%%!in:~-2,1!%%%%%%"
  141.    call :set_ !in:~-1! "!var!"
  142.    call set "col_!in:~-2,1!%%!in:~-2,1!%%=!empty!"
  143.    set /a "!in:~-2,1!+=1"
  144.    ping -n 2 127.1 >nul
  145.    cls
  146.    for /l %%m in (1 1 !input!) do (
  147.       echo.!col_a%%m!!kong!!col_b%%m!!kong!!col_c%%m!
  148.    )
  149.    echo.!line!&echo.!line2!
  150. )
  151. echo.&echo.演示完毕...&endlocal&goto :bgn
  152. :show
  153. if "%1"=="1" (
  154.    set "str=!str!%1%2%4 "
  155. ) else (
  156.    set /a "var=%1-1"
  157.    call :show !var! %2 %4 %3
  158.    set "str=!str!%1%2%4 "
  159.    set /a "var=%1-1"
  160.    call :show !var! %3 %2 %4
  161. )
  162. goto :eof
复制代码

作者: PakTC    时间: 2009-6-14 15:02

直接仿照c 的汉诺塔解法, 换成批处理的
  1. @echo off
  2. set /p inp="1-7: "
  3. call :next %inp% a c b
  4. pause
  5. :next
  6. if %1 equ 0 goto :eof
  7. set /a now=%1-1
  8. call :next %now% %2 %4 %3
  9. echo,%1 from  %2  to  %3
  10. set /a now=%1-1
  11. call :next %now% %4 %3 %2
复制代码
刚刚做了一个无聊举动,把上面显示答案部分 改成  %1%2%3直接显示
然后复制一整列,在游戏上粘贴…… 自移动速度好快。

[ 本帖最后由 PakTC 于 2009-6-14 15:13 编辑 ]
作者: garyng    时间: 2011-9-1 20:48

7个盘很多了也~
2^7-1=127
最少要127步勒~




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