Board logo

标题: [游戏娱乐] 批处理迷宫,采用截取字符的方法 [打印本页]

作者: raymai97    时间: 2011-10-22 08:40     标题: 批处理迷宫,采用截取字符的方法

最近沉默了一段时间,昨天就绞尽脑汁写了一个批处理迷宫,代码就是长了些,乱了些,毕竟首次尝试制作,要参考前辈的又看不懂……
爱用call的坏习惯依然改不了(当你看到你的代码变成一个一个模块,可以一call就调用时,你会爱上call……虽然效率低)
不知各位前辈们是否也用类似方法,即以截取字符来完成这个任务~
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set char=o
  4. :head
  5. cls
  6. set menu=
  7. set /p menu=Select map (1-3):
  8. if not "!menu!"=="1" if not "!menu!"=="2" if not "!menu!"=="3" goto head
  9. call :loadlevel!menu!
  10. :gamedisp
  11. cls
  12. for /l %%i in (1 1 !numline!) do (
  13. echo !line%%i! )
  14. ckey 38 40 37 39
  15. call :checkinput
  16. goto gamedisp
  17. :loadlevel1
  18. set line1=::::::::::::::::::::::
  19. set line2=:[o]:x              ::
  20. set line3=:: ::::::::::       ::
  21. set line4=::                  ::
  22. set line5=::::::::::::::::::::::
  23. set oldy=2
  24. set oldx=2
  25. set numline=5
  26. exit /b
  27. :loadlevel2
  28. set line1=::::::::::::::
  29. set line2=::    [o]   ::
  30. set line3=::          ::
  31. set line4=:: :::::::::::
  32. set line5=::          ::
  33. set line6=::::::::::: ::
  34. set line7=::x         ::
  35. set line8=::::::::::::::
  36. set oldx=2
  37. set oldy=7
  38. set numline=8
  39. exit /b
  40. :loadlevel3
  41. set line1=:::::::::::::::::
  42. set line2=:[o]:    ::    ::
  43. set line3=:: :: :: :: :: ::
  44. set line4=:: :: :: :: :: ::
  45. set line5=::    :: :: :: ::
  46. set line6=:::::::: :: :: ::
  47. set line7=::       :: :: ::
  48. set line8=:: :::::::: :: ::
  49. set line9=::          ::x::
  50. set line10=:::::::::::::::::
  51. set oldx=2
  52. set oldy=2
  53. set numline=10
  54. exit /b
  55. :win
  56. cls
  57. echo Map !menu! completed..
  58. echo You Win.
  59. pause>nul
  60. goto head
  61. :checkinput
  62. if errorlevel 4 (call :right) else (
  63. if errorlevel 3 (call :left) else (
  64. if errorlevel 2 (call :down) else (
  65. if errorlevel 1 (call :up))))
  66. exit /b
  67. :up
  68. set /a newx=!oldx!-1
  69. set /a tempy=!oldy!+1
  70. if "!line%newx%:~%oldy%,1!"==":" exit /b
  71. if "!line%newx%:~%oldy%,1!"=="]" exit /b
  72. if "!line%newx%:~%oldy%,1!"=="[" exit /b
  73. if "!line%newx%:~%oldy%,1!"=="x" goto win
  74. set line%oldx%=!line%oldx%:~0,%oldy%! !line%oldx%:~%tempy%!
  75. set line%newx%=!line%newx%:~0,%oldy%!!char!!line%newx%:~%tempy%!
  76. set oldx=!newx!
  77. exit /b
  78. :right
  79. set /a tempy=!oldy!+1
  80. if "!line%oldx%:~%tempy%,1!"==":" exit /b
  81. if "!line%oldx%:~%tempy%,1!"=="]" exit /b
  82. if "!line%oldx%:~%tempy%,1!"=="[" exit /b
  83. if "!line%oldx%:~%tempy%,1!"=="x" goto win
  84. set line%oldx%=!line%oldx%:~0,%oldy%! !line%oldx%:~%tempy%!
  85. set /a oldy+=1
  86. set /a newy=!oldy!+1
  87. set line%oldx%=!line%oldx%:~0,%oldy%!!char!!line%oldx%:~%newy%!
  88. exit /b
  89. :left
  90. set /a tempy=!oldy!+1
  91. set /a tempy2=!oldy!-1
  92. if "!line%oldx%:~%tempy2%,1!"==":" exit /b
  93. if "!line%oldx%:~%tempy2%,1!"=="]" exit /b
  94. if "!line%oldx%:~%tempy2%,1!"=="[" exit /b
  95. if "!line%oldx%:~%tempy2%,1!"=="x" goto win
  96. set line%oldx%=!line%oldx%:~0,%oldy%! !line%oldx%:~%tempy%!
  97. set /a oldy-=1
  98. set /a newy=!oldy!+1
  99. set line%oldx%=!line%oldx%:~0,%oldy%!!char!!line%oldx%:~%newy%!
  100. exit /b
  101. :down
  102. set /a newx=!oldx!+1
  103. set /a tempy=!oldy!+1
  104. if "!line%newx%:~%oldy%,1!"==":" exit /b
  105. if "!line%newx%:~%oldy%,1!"=="]" exit /b
  106. if "!line%newx%:~%oldy%,1!"=="[" exit /b
  107. if "!line%newx%:~%oldy%,1!"=="x" goto win
  108. set line%oldx%=!line%oldx%:~0,%oldy%! !line%oldx%:~%tempy%!
  109. set line%newx%=!line%newx%:~0,%oldy%!!char!!line%newx%:~%tempy%!
  110. set oldx=!newx!
  111. exit /b
复制代码

作者: raymai97    时间: 2011-10-22 08:43

这次我花了很多心血,望别再像上次那样来“打击”我啦~
如果对代码有意见可以回复给意见
如果对“此类代码”有意见的请绕道了……

还有这次的需要一个附件,CKey
链接: https://pan.baidu.com/s/1y1KOPcYVwytg1ZE_l5bGuQ?pwd=5wwx
作者: sxw    时间: 2011-10-22 09:26

顶一个先,楼主怎么不配上说明呢,方便学习。哈哈
作者: raymai97    时间: 2011-10-22 09:50

回复 3# sxw


其实这个批处理大概是这样子的:
先设置line1、line2等的资料先
然后设置一个变量,以知道有多少行(后面echo那部分用for /l 时需要用到)
再设置变量oldx为“o”的x-axis
和设置变量oldy为“o”的y-axis-1(因为最主要是为了知道line要摄取多少个字符放在前面)……

之后的很乱,不懂要怎么说……
作者: raymai97    时间: 2011-10-24 00:28

这个论坛是没有人了吗?还是强烈排斥这类的代码?
算了~ 我的游戏引擎看来也不用发了……
作者: HAT    时间: 2011-10-24 09:39

回复 5# raymai97


贴吧不是几个小盆友比较喜欢此类代码么,可以到那里找一些志同道合的人。
作者: defanive    时间: 2011-10-24 09:43

回复 5# raymai97
  1. @echo off
  2. set "Data_Level_1=22050201:::::::::::::::::::::::[ ]:x              :::: ::::::::::       ::::                  ::::::::::::::::::::::::"
  3. set "Data_Level_2=14080701::::::::::::::::    [ ]   ::::          :::: :::::::::::::          ::::::::::::: ::::x         ::::::::::::::::"
  4. set "Data_Level_3=17100201::::::::::::::::::[ ]:    ::    :::: :: :: :: :: :::: :: :: :: :: ::::    :: :: :: :::::::::: :: :: ::::       :: :: :::: :::::::: :: ::::          ::x:::::::::::::::::::"
  5. set "LoadMap=set /a W=1!Data_Map:~0,2!-100,H=1!Data_Map:~2,2!-100,X=1!Data_Map:~4,2!-100,Y=1!Data_Map:~6,2!-100,Size=(H-1)*W"
  6. set "DrawMap=set /a l1=Y*W+X,l2=l1+9&(for /f "tokens=1,2" %%a in ("!l1! !l2!") do set "ScreenMap=!Data_Map:~8,%%a!o!Data_Map:~%%b!")&(for %%a in (!W!) do (cls&for /l %%b in (0,!W!,!Size!) do echo !ScreenMap:~%%b,%%a!))"
  7. setlocal enabledelayedexpansion
  8. :Main
  9. cls&set /p p=Choice Map (1-3) :
  10. if not defined Data_Level_!p! goto Main
  11. set "Data_Map=!Data_Level_%p%!"
  12. %LoadMap%
  13. :Refresh
  14. %DrawMap%
  15. CKey 37 38 39 40
  16. set /a e=%errorlevel%,New_X=X+(e%%2)*(e-2),New_Y=Y+((e+1)%%2)*(e-3),l=New_Y*W+New_X+8
  17. if "!Data_Map:~%l%,1!"==" " (set /a X=New_X,Y=New_Y) else (if "!Data_Map:~%l%,1!"=="x" cls&echo YOU WIN&pause&goto Main)
  18. goto Refresh
复制代码
我也写了一个和楼主一模一样的,里面用到的一些技巧可以借鉴一下
call还是不宜多用,尤其是在按键循环里面,降低速度很严重
我也经常关注界面游戏一类的代码,只是比较少发言而已
论坛大家对这类代码热衷度不够高,实际上技巧也不亚于其他代码
LZ不必放弃,好代码始终会发光的
作者: raymai97    时间: 2011-10-24 10:26

本帖最后由 raymai97 于 2011-10-24 10:29 编辑

回复 7# defanive


发现你们这些前辈很会压缩代码啊~ 真佩服啊~ 只是你写的代码我很难明白咯~ 加载data那边“22050201”是神马?截取字符的次数么?
loadmap那边是设置后面会用到的w,x,y和data_map变量吧~ 单单这里我都看了很久才明白一点的说~

对了,你们有开发过一个类似游戏引擎的东西么?我开发了一个,技术和这个差不多的~ 名称为2D-A~
调用非常简单,只需"start /b /wait 2d-a 地图名称.dat"就行了……
效率和直接内嵌在批处理没神马两样~
我开发的目的是为了方便自己和别人制作地图~
作者: defanive    时间: 2011-10-24 10:47

本帖最后由 defanive 于 2011-10-24 10:48 编辑

回复 8# raymai97
我不算前辈,深度潜水党而已。。数据里面开头的数字是地图大小和起始坐标
对比一下两个代码,其实可以看到你的代码在数据加载和移动处理的时候比较繁杂
我的移动处理可以借鉴一下,新坐标的计算和合法移动的判断都只用了一行
至于引擎,方便自己使用倒是挺好,就我感觉的话,我喜欢自己写




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