Board logo

标题: 批处理游戏:华容道 [打印本页]

作者: HAT    时间: 2009-9-13 21:24     标题: 批处理游戏:华容道

为了简化代码,本游戏代码多次使用call :标签的形式,使效率稍低了些...但是这样却使代码的使用率提高了很多...
  1. @echo off
  2. rem code by cn-dos moniuming
  3. title 华容道...
  4. echo.
  5. echo.        欢迎使用本绿色无毒无任何插件的"华容道"小游戏,使用方法如下:
  6. echo.    1.游戏目的:把标记为"0"(曹操)的方块移动到最下面的缺口处即算胜利.
  7. echo.    2.如果要移动某个方块,输入其序号和方向,然后回车即可,如要把下图中的8往右移动
  8. echo.     一格,输入"8d"(不含引号)然后回车即可.
  9. echo.    3.本游戏支持一个方块连续的移动,如要把下图中的6移动到9的旁边(下==^>右),
  10. echo.      输入"6sd"(不含引号)然后回车即可.
  11. echo.    4.在游戏过程中如果直接回车会退回主菜单.
  12. echo.    5.在游戏过程中如果输入"h"(不含引号)会看到游戏的演示.
  13. echo.    6.本游戏说明只在运行开始时出现一次.
  14. echo.    7.表示方向的字母分别为:(w↑,a←,s↓,d→).
  15. echo.    8.游戏过程中(包括演示过程)在标题栏会显示已经走的步数和走法.
  16. echo.    请按任意键开始游戏...        祝你玩得愉快!!!
  17. echo.
  18. echo.    ┏━┳━━━━┳━┓
  19. echo.    ┃ ┃    ┃ ┃
  20. echo.    ┃2┃ 0  ┃3┃
  21. echo.    ┃ ┃    ┃ ┃
  22. echo.    ┃ ┃    ┃ ┃
  23. echo.    ┣━╋━━━━╋━┫
  24. echo.    ┃4┃ 1  ┃5┃
  25. echo.    ┃ ┣━━┳━┫ ┃
  26. echo.    ┃ ┃6 ┃7┃ ┃
  27. echo.    ┣━╋━━┻━╋━┫
  28. echo.    ┃8┃    ┃9┃
  29. set/p=    ┗━┛    ┗━┛<nul&pause>nul
  30. :bgn
  31. setlocal enabledelayedexpansion
  32. set "state1=8d 4s 1a 7s 5a 9w 7d 5s 1dd 6wa 8ww 5a 9as 1s 8dd 6dd 4w 5w 9aa 7aa 1s 6sd 5d 4d 2ss 0a 3a 8ww 6ww 5d 3ss 0d 2ww 4a 7ww 9dw 1aa 3s 5s 7dd 0s 8aa 6wa 7ww 5ww 3d 9ds 0s 8sd 2d 4ww 0a 8ss 6s 7a 5w 3w 9d 8s 0d 4ss 2a 7a 6a 5a 3ww 0d 6ss 7ss 2d 4ww 6aw 1w 8aa 9aa 0s 7dd 6dd 1w 9wa 0a"
  33. set "state2=4s 8sa 9as 2dd 3w 4a 9s 8d 3d 1ss 0a 7aw 2w 8w 9w 5w 4dd 1s 3s 0s 7aa 6aa 2w 5w 9d 8s 0d 1ww 3a 4a 9s 8d 0s 6sd 7ds 1w 3w 2a 4a 5w 9a 8s 0d 3d 1s 2a 6w 7d 3w 4w 9aa 8aa 0s 5s 7s 6s 2dd 1w 3w 4w 8wa 0a"
  34. set /a least1=81,least2=62
  35. :bgn
  36. cls
  37. echo.
  38. echo.    ┏━━┓┏━━━━━━┓┏━━┓    ┏━━┓┏━━━━━━┓┏━━┓
  39. echo.    ┃  ┃┃      ┃┃  ┃    ┃  ┃┃      ┃┃6兵┃
  40. echo.    ┃2 ┃┃      ┃┃3 ┃    ┃1 ┃┃      ┃┃  ┃
  41. echo.    ┃  ┃┃ 0 曹操 ┃┃  ┃    ┃  ┃┃ 0 曹操 ┃┗━━┛
  42. echo.    ┃黄 ┃┃      ┃┃马 ┃    ┃赵 ┃┃      ┃┏━━┓
  43. echo.    ┃忠 ┃┃      ┃┃超 ┃    ┃云 ┃┃      ┃┃7卒┃
  44. echo.    ┃  ┃┃      ┃┃  ┃    ┃  ┃┃      ┃┃  ┃
  45. echo.    ┗━━┛┗━━━━━━┛┗━━┛    ┗━━┛┗━━━━━━┛┗━━┛
  46. echo.    ┏━━┓┏━━━━━━┓┏━━┓    ┏━━━━━━┓┏━━┓┏━━┓
  47. echo.    ┃  ┃┃ 1 关羽 ┃┃  ┃    ┃ 2 关羽 ┃┃8勇┃┃9士┃
  48. echo.    ┃4 ┃┃      ┃┃5 ┃    ┃      ┃┃  ┃┃  ┃
  49. echo.    ┃  ┃┗━━━━━━┛┃  ┃    ┗━━━━━━┛┗━━┛┗━━┛
  50. echo.    ┃赵 ┃┏━━┓┏━━┓┃张 ┃    ┏━━┓┏━━━━━━┓┏━━┓
  51. echo.    ┃云 ┃┃6兵┃┃7卒┃┃飞 ┃    ┃  ┃┃ 4 张飞 ┃┃  ┃
  52. echo.    ┃  ┃┃  ┃┃  ┃┃  ┃    ┃3 ┃┃      ┃┃5 ┃
  53. echo.    ┗━━┛┗━━┛┗━━┛┗━━┛    ┃  ┃┗━━━━━━┛┃  ┃
  54. echo.    ┏━━┓        ┏━━┓    ┃黄 ┃        ┃马 ┃
  55. echo.    ┃8勇┃        ┃9士┃    ┃忠 ┃        ┃超 ┃
  56. echo.    ┃  ┃        ┃  ┃    ┃  ┃        ┃  ┃
  57. echo.    ┗━━┛        ┗━━┛    ┗━━┛        ┗━━┛
  58. echo.
  59. echo.          第 1 关:横刀立马             第 2 关:插翅难飞
  60. echo.
  61. set in=&set /p in=   请选择(1,2或者回车退出):
  62. if not defined in exit
  63. if %in% lss 1 (
  64.    goto :bgn
  65. ) else (
  66.    if %in% gtr 2 (
  67.       goto :bgn
  68.    )
  69. )
  70. set "movie="
  71. call :state%in%
  72. call :reset%in%
  73. call :show
  74. :agn
  75. set input=&set /p input=请输入:
  76. if not defined input goto :bgn
  77. if /i "%input%"=="h" (
  78.    set "movie=ok"
  79.    call :state%in%
  80.    call :reset%in%
  81.    for %%a in (!state%in%!) do (
  82.       set "input=%%a"
  83.       call :continue
  84.    )
  85. )
  86. rem 判断第一位是否为数字
  87. echo.%input:~,1%|findstr /i "[^0-9]" >nul&&(echo.输入错误...&goto :agn)
  88. rem 判断第一位以后的输入是否为表示方向的字母
  89. echo.%input:~1%|findstr /i "[^wasd]" >nul&&(echo.输入错误...&goto :agn)
  90. :continue
  91. rem 判断目的地是否为空地,如果是则移动方块
  92. if /i "%input:~1,1%"=="w" (
  93.    call :w
  94. ) else (
  95.    if /i "%input:~1,1%"=="a" (
  96.       call :a
  97.    ) else (
  98.       if /i "%input:~1,1%"=="s" (
  99.          call :s
  100.       ) else (
  101.          if /i "%input:~1,1%"=="d" call :d
  102.       )
  103.    )
  104. )
  105. if defined err (
  106.    set "err="
  107.    echo.非法位置...
  108.    goto :agn
  109. )
  110. rem 如果多次移动一块方块,步数不累加
  111. if not "%block%"=="%input:~,1%" (
  112.    set "block=%input:~,1%"
  113.    set /a step+=1
  114. )
  115. title 华容道...%step%----%input%
  116. rem 判断是否已经到达目的地
  117. if "!down0!"=="20" (
  118.    if "!right0!"=="12" (
  119.       title %step%
  120.       if not defined movie (
  121.          echo.恭喜你,过关啦...
  122.          echo.你一共用了%step%步...
  123.          if "%step%"=="!least%in%!" (echo.你用的步数和我的一样少耶,知音啊...)
  124.          set /p=请按任意键重新开始游戏...<nul
  125.       ) else (
  126.          set/p=演示完毕,请按任意键退回主菜单...<nul
  127.       )
  128.       pause>nul
  129.       echo.
  130.       goto :bgn
  131.    )
  132. )
  133. rem 判断是否连续移动方块
  134. if not "%input:~2%"=="" (
  135.    set "input=%input:~,1%%input:~2,1%"
  136.    if not defined movie (ping -n 2 127.1>nul)
  137.    goto :continue
  138. )
  139. if not defined movie (goto :agn) else (goto :eof)
  140. :w      //上移
  141. set /a point=!y%input:~,1%!-4
  142. for %%a in (!point!) do (
  143.    for /l %%b in (!x%input:~,1%! 1 !right%input:~,1%!) do (
  144.       if not "!line%%acol%%b!"==" " (
  145.          set err=err&goto :eof
  146.       )
  147.    )
  148. )
  149. rem 设置移动后的位置为空地
  150. set /a pos=!down%input:~,1%!-3
  151. for /l %%a in (!pos! 1 !down%input:~,1%!) do (
  152.    for /l %%b in (!x%input:~,1%! 1 !right%input:~,1%!) do (
  153.       set "line%%acol%%b= "
  154.   )
  155. )
  156. rem 调整方块移动后的位置
  157. set /a y%input:~,1%-=4,down%input:~,1%-=4
  158. call :setting "%input:~,1%" "!area%input:~,1%!"
  159. call :show
  160. goto :eof
  161. :a      //左移
  162. set /a point=!x%input:~,1%!-4
  163. for %%a in (!point!) do (
  164.    for /l %%b in (!y%input:~,1%! 1 !down%input:~,1%!) do (
  165.       if not "!line%%bcol%%a!"==" " (
  166.          set err=err&goto :eof
  167.       )
  168.    )
  169. )
  170. set /a pos=!right%input:~,1%!-3
  171. for /l %%a in (!y%input:~,1%! 1 !down%input:~,1%!) do (
  172.    for /l %%b in (!pos! 1 !right%input:~,1%!) do (
  173.       set "line%%acol%%b= "
  174.    )
  175. )
  176. set /a x%input:~,1%-=4,right%input:~,1%-=4
  177. call :setting "%input:~,1%" "!area%input:~,1%!"
  178. call :show
  179. goto :eof
  180. :s      //下移
  181. set /a point=!down%input:~,1%!+4
  182. for %%a in (!point!) do (
  183.    for /l %%b in (!x%input:~,1%! 1 !right%input:~,1%!) do (
  184.       if not "!line%%acol%%b!"==" " (
  185.          set err=err&goto :eof
  186.       )
  187.    )
  188. )
  189. set /a pos=!y%input:~,1%!+3
  190. for /l %%a in (!y%input:~,1%! 1 !pos!) do (
  191.    for /l %%b in (!x%input:~,1%! 1 !right%input:~,1%!) do (
  192.       set "line%%acol%%b= "
  193.    )
  194. )
  195. set /a y%input:~,1%+=4,down%input:~,1%+=4
  196. call :setting "%input:~,1%" "!area%input:~,1%!"
  197. call :show
  198. goto :eof
  199. :d      //右移
  200. set /a point=!right%input:~,1%!+4
  201. for %%a in (!point!) do (
  202.    for /l %%b in (!y%input:~,1%! 1 !down%input:~,1%!) do (
  203.       if not "!line%%bcol%%a!"==" " (
  204.          set err=err&goto :eof
  205.       )
  206.    )
  207. )
  208. set /a pos=!x%input:~,1%!+3
  209. for /l %%a in (!y%input:~,1%! 1 !down%input:~,1%!) do (
  210.    for /l %%b in (!x%input:~,1%! 1 !pos!) do (
  211.       set "line%%acol%%b= "
  212.    )
  213. )
  214. set /a x%input:~,1%+=4,right%input:~,1%+=4
  215. call :setting "%input:~,1%" "!area%input:~,1%!"
  216. call :show
  217. goto :eof
  218. :setting     //设置各个图形位置的函数
  219. set n=0
  220. set "str=%~2"&set "var=%~1"
  221. for /l %%a in (!y%var%! 1 !down%var%!) do (
  222.    for /l %%b in (!x%var%! 1 !right%var%!) do (
  223.       for %%i in (!n!) do (
  224.          set "line%%acol%%b=!str:~%%i,1!"
  225.       )
  226.       set /a n+=1
  227.    )
  228. )
  229. goto :eof
  230. :show     //显示图形的函数
  231. for /l %%a in (1 1 20) do (set "row%%a=")
  232. for /l %%a in (1 1 20) do (
  233.    for /l %%b in (1 1 16) do (
  234.       set "row%%a=!row%%a!!line%%acol%%b!"
  235.    )
  236. )
  237. if defined movie (ping -n 2 127.1>nul)
  238. cls
  239. for /l %%a in (1 1 20) do echo.!row%%a!
  240. goto :eof
  241. :state1      //第一关
  242. set "area0=┏━━━━━━┓┃      ┃┃      ┃┃ 0 曹操 ┃┃      ┃┃      ┃┃      ┃┗━━━━━━┛"
  243. set /a x0=5,y0=1,down0=y0+7,right0=x0+7
  244. set "area1=┏━━━━━━┓┃ 1 关羽 ┃┃      ┃┗━━━━━━┛"
  245. set /a x1=5,y1=9,down1=y1+3,right1=x1+7
  246. set "area2=┏━━┓┃  ┃┃2 ┃┃  ┃┃黄 ┃┃忠 ┃┃  ┃┗━━┛"
  247. set /a x2=1,y2=1,down2=y2+7,right2=x2+3
  248. set "area3=┏━━┓┃  ┃┃3 ┃┃  ┃┃马 ┃┃超 ┃┃  ┃┗━━┛"
  249. set /a x3=13,y3=1,down3=y3+7,right3=x3+3
  250. set "area4=┏━━┓┃  ┃┃4 ┃┃  ┃┃赵 ┃┃云 ┃┃  ┃┗━━┛"
  251. set /a x4=1,y4=9,down4=y4+7,right4=x4+3
  252. set "area5=┏━━┓┃  ┃┃5 ┃┃  ┃┃张 ┃┃飞 ┃┃  ┃┗━━┛"
  253. set /a x5=13,y5=9,down5=y5+7,right5=x5+3
  254. set "area6=┏━━┓┃6兵┃┃  ┃┗━━┛"
  255. set /a x6=5,y6=13,down6=y6+3,right6=x6+3
  256. set "area7=┏━━┓┃7卒┃┃  ┃┗━━┛"
  257. set /a x7=9,y7=13,down7=y7+3,right7=x7+3
  258. set "area8=┏━━┓┃8勇┃┃  ┃┗━━┛"
  259. set /a x8=1,y8=17,down8=y8+3,right8=x8+3
  260. set "area9=┏━━┓┃9士┃┃  ┃┗━━┛"
  261. set /a x9=13,y9=17,down9=y9+3,right9=x9+3
  262. set /a step=0,block=0
  263. goto :eof
  264. :reset1      //初始化第一关各个图形的位置
  265. for /l %%a in (0 1 9) do (
  266.    call :setting "%%a" "!area%%a!"
  267. )
  268. for /l %%a in (17 1 20) do (
  269.    for /l %%b in (5 1 12) do (
  270.       set "line%%acol%%b= "
  271.    )
  272. )
  273. goto :eof
  274. :state2      //第二关
  275. set "area0=┏━━━━━━┓┃      ┃┃      ┃┃ 0 曹操 ┃┃      ┃┃      ┃┃      ┃┗━━━━━━┛"
  276. set /a x0=5,y0=1,down0=y0+7,right0=x0+7
  277. set "area1=┏━━┓┃  ┃┃1 ┃┃  ┃┃赵 ┃┃云 ┃┃  ┃┗━━┛"
  278. set /a x1=1,y1=1,down1=y1+7,right1=x1+3
  279. set "area2=┏━━━━━━┓┃ 2 关羽 ┃┃      ┃┗━━━━━━┛"
  280. set /a x2=1,y2=9,down2=y2+3,right2=x2+7
  281. set "area3=┏━━┓┃  ┃┃3 ┃┃  ┃┃黄 ┃┃忠 ┃┃  ┃┗━━┛"
  282. set /a x3=1,y3=13,down3=y3+7,right3=x3+3
  283. set "area4=┏━━━━━━┓┃ 4 张飞 ┃┃      ┃┗━━━━━━┛"
  284. set /a x4=5,y4=13,down4=y4+3,right4=x4+7
  285. set "area5=┏━━┓┃  ┃┃5 ┃┃  ┃┃马 ┃┃超 ┃┃  ┃┗━━┛"
  286. set /a x5=13,y5=13,down5=y5+7,right5=x5+3
  287. set "area6=┏━━┓┃6兵┃┃  ┃┗━━┛"
  288. set /a x6=13,y6=1,down6=y6+3,right6=x6+3
  289. set "area7=┏━━┓┃7卒┃┃  ┃┗━━┛"
  290. set /a x7=13,y7=5,down7=y7+3,right7=x7+3
  291. set "area8=┏━━┓┃8勇┃┃  ┃┗━━┛"
  292. set /a x8=9,y8=9,down8=y8+3,right8=x8+3
  293. set "area9=┏━━┓┃9士┃┃  ┃┗━━┛"
  294. set /a x9=13,y9=9,down9=y9+3,right9=x9+3
  295. set /a step=0,block=0
  296. goto :eof
  297. :reset2
  298. for /l %%a in (0 1 9) do (
  299.    call :setting "%%a" "!area%%a!"
  300. )
  301. for /l %%a in (17 1 20) do (
  302.    for /l %%b in (5 1 12) do (
  303.       set "line%%acol%%b= "
  304.    )
  305. )
  306. goto :eof
复制代码
转自:http://www.cn-dos.net/forum/viewthread.php?tid=48776
作者: jacky_nt    时间: 2009-9-23 15:20

就是DOS版推箱子游戏
作者: 狱渊    时间: 2013-4-29 08:52

回复 1# HAT
貌似不错啊
作者: 凡凡之呗    时间: 2015-2-7 15:19

回复 1# HAT


    这个游戏本来就很难,这样的话就更有挑战性了




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