标题: [游戏娱乐] 批处理迷宫,采用截取字符的方法 [打印本页]
作者: raymai97 时间: 2011-10-22 08:40 标题: 批处理迷宫,采用截取字符的方法
最近沉默了一段时间,昨天就绞尽脑汁写了一个批处理迷宫,代码就是长了些,乱了些,毕竟首次尝试制作,要参考前辈的又看不懂……
爱用call的坏习惯依然改不了(当你看到你的代码变成一个一个模块,可以一call就调用时,你会爱上call……虽然效率低)
不知各位前辈们是否也用类似方法,即以截取字符来完成这个任务~- @echo off
- setlocal enabledelayedexpansion
- set char=o
- :head
- cls
- set menu=
- set /p menu=Select map (1-3):
- if not "!menu!"=="1" if not "!menu!"=="2" if not "!menu!"=="3" goto head
- call :loadlevel!menu!
-
- :gamedisp
- cls
- for /l %%i in (1 1 !numline!) do (
- echo !line%%i! )
- ckey 38 40 37 39
- call :checkinput
- goto gamedisp
-
- :loadlevel1
- set line1=::::::::::::::::::::::
- set line2=:[o]:x ::
- set line3=:: :::::::::: ::
- set line4=:: ::
- set line5=::::::::::::::::::::::
- set oldy=2
- set oldx=2
- set numline=5
- exit /b
-
- :loadlevel2
- set line1=::::::::::::::
- set line2=:: [o] ::
- set line3=:: ::
- set line4=:: :::::::::::
- set line5=:: ::
- set line6=::::::::::: ::
- set line7=::x ::
- set line8=::::::::::::::
- set oldx=2
- set oldy=7
- set numline=8
- exit /b
-
- :loadlevel3
- set line1=:::::::::::::::::
- set line2=:[o]: :: ::
- set line3=:: :: :: :: :: ::
- set line4=:: :: :: :: :: ::
- set line5=:: :: :: :: ::
- set line6=:::::::: :: :: ::
- set line7=:: :: :: ::
- set line8=:: :::::::: :: ::
- set line9=:: ::x::
- set line10=:::::::::::::::::
- set oldx=2
- set oldy=2
- set numline=10
- exit /b
-
- :win
- cls
- echo Map !menu! completed..
- echo You Win.
- pause>nul
- goto head
-
- :checkinput
- if errorlevel 4 (call :right) else (
- if errorlevel 3 (call :left) else (
- if errorlevel 2 (call :down) else (
- if errorlevel 1 (call :up))))
- exit /b
-
- :up
- set /a newx=!oldx!-1
- set /a tempy=!oldy!+1
- if "!line%newx%:~%oldy%,1!"==":" exit /b
- if "!line%newx%:~%oldy%,1!"=="]" exit /b
- if "!line%newx%:~%oldy%,1!"=="[" exit /b
- if "!line%newx%:~%oldy%,1!"=="x" goto win
- set line%oldx%=!line%oldx%:~0,%oldy%! !line%oldx%:~%tempy%!
- set line%newx%=!line%newx%:~0,%oldy%!!char!!line%newx%:~%tempy%!
- set oldx=!newx!
- exit /b
-
- :right
- set /a tempy=!oldy!+1
- if "!line%oldx%:~%tempy%,1!"==":" exit /b
- if "!line%oldx%:~%tempy%,1!"=="]" exit /b
- if "!line%oldx%:~%tempy%,1!"=="[" exit /b
- if "!line%oldx%:~%tempy%,1!"=="x" goto win
- set line%oldx%=!line%oldx%:~0,%oldy%! !line%oldx%:~%tempy%!
- set /a oldy+=1
- set /a newy=!oldy!+1
- set line%oldx%=!line%oldx%:~0,%oldy%!!char!!line%oldx%:~%newy%!
- exit /b
-
- :left
- set /a tempy=!oldy!+1
- set /a tempy2=!oldy!-1
- if "!line%oldx%:~%tempy2%,1!"==":" exit /b
- if "!line%oldx%:~%tempy2%,1!"=="]" exit /b
- if "!line%oldx%:~%tempy2%,1!"=="[" exit /b
- if "!line%oldx%:~%tempy2%,1!"=="x" goto win
- set line%oldx%=!line%oldx%:~0,%oldy%! !line%oldx%:~%tempy%!
- set /a oldy-=1
- set /a newy=!oldy!+1
- set line%oldx%=!line%oldx%:~0,%oldy%!!char!!line%oldx%:~%newy%!
- exit /b
-
- :down
- set /a newx=!oldx!+1
- set /a tempy=!oldy!+1
- if "!line%newx%:~%oldy%,1!"==":" exit /b
- if "!line%newx%:~%oldy%,1!"=="]" exit /b
- if "!line%newx%:~%oldy%,1!"=="[" exit /b
- if "!line%newx%:~%oldy%,1!"=="x" goto win
- set line%oldx%=!line%oldx%:~0,%oldy%! !line%oldx%:~%tempy%!
- set line%newx%=!line%newx%:~0,%oldy%!!char!!line%newx%:~%tempy%!
- set oldx=!newx!
- 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 - @echo off
- set "Data_Level_1=22050201:::::::::::::::::::::::[ ]:x :::: :::::::::: :::: ::::::::::::::::::::::::"
- set "Data_Level_2=14080701:::::::::::::::: [ ] :::: :::: ::::::::::::: ::::::::::::: ::::x ::::::::::::::::"
- set "Data_Level_3=17100201::::::::::::::::::[ ]: :: :::: :: :: :: :: :::: :: :: :: :: :::: :: :: :: :::::::::: :: :: :::: :: :: :::: :::::::: :: :::: ::x:::::::::::::::::::"
- 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"
- 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!))"
- setlocal enabledelayedexpansion
- :Main
- cls&set /p p=Choice Map (1-3) :
- if not defined Data_Level_!p! goto Main
- set "Data_Map=!Data_Level_%p%!"
- %LoadMap%
- :Refresh
- %DrawMap%
- CKey 37 38 39 40
- 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
- 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)
- 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://bathome.net./) |
Powered by Discuz! 7.2 |