[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
长玩的游戏 !  貌似 还有个是  贪吃蛇!

TOP

推箱子源码解释

批处理推箱子源码解释:

1、数据定义的紧凑格式的使用
先把变量定义集放到变量:(要注意分隔符是唯一的,这里用“;”号)
set a=a=i75;b=i79;str=abc
这样变量a的值为:a=i75;b=i79;str=abc
利用预处理时变量值替换:
set %a:;=&set %
相当于以下语句被执行:
set a=i75&set b=i79&set str=abc
或者:
set a=i75
set b=i79
set str=abc
如果要定义的变量很多,综合从占用空间和可读性上看,此法有明显的优势。


2、推条子程序实现算法
1). 读取关级数据放到数组:lev(n)
   改变n的值,即为改变关级,这里 n=%lev%
2). 把当前关地图数据还原并存到二维数组:r(n).(m),
   (一) 把值为坑“☆”的变量名r(n).(m),集放到变量ke,并把“☆”的个数存到变量ji,同时转为“★”;
   %ke%扩展后就是源值为坑“☆”的所有二维变量的实时的值了;只要%ke% 等于 !ji! 表明过关了
   (二) 按行把二维变量名存为数组:r(n)
   %r(n)%扩展后即为第n行的所有二维数组的实时值
  
3). 变量ebuf作为显示缓存,所有要显示的内容全部存到ebuf,一次性用echo !ebuf!全部显示完成。
   
   因为for 变更 %%a 在扩展后,会再次扩展!号变量,所以:
   for /l %%a in (1,1,!r!) do for %%b in ("!r%%a!") do set ebuf=!ebuf!   %%~b!cr!
   上面依次把:1到!r!行的变量名数组r(n)扩展后的值,全部存到显示缓存ebuf内,并且加上了换行符!cr!
4).首先定义好按上下左右所进行的操作:
   "c1=n-;c2=m-;c3=n+;c4=m+"
   这样就可以通过下面代码:
   set/a sm=m,sn=n,!c%in%!=1,bm=m,bn=n,!c%in%!=1
   分别取得按了 上/下/左/右 后,源点:sm.sn,步进一:bm.bn,步进二:m.n,三个坐标的值
   
   for /f "tokens=1,2" %%a in ("!r%bn%.%bm%! !r%bn%.%bm%!!r%n%.%m%!") do (
   取出三个坐标的值并摆开为:(步进一 => %%a) (步进一+步进二 =>%%b)  例如:%%a=▓ %%b=▓∷
   
   for %%c in ("!%%a!!%%b!") do (
   %%a %%b 经再扩展后,组后到%%c, 接上例:!▓! =>空, !▓∷! =>▓-∷
   则: ▓-∷ => %%c
   
   for /f "tokens=1,2 delims=-" %%1 in (%%c) do (
   摆开为:%%1=▓,%%2=∷
   接下来就 if 判断了,根据各种情况把三个点和一个“大”站的!源!点的值重新调整
   
   注意:有一点,如果%%c的值为空,如 %%b=▓■ 为时,则这个for将是空转,即连里面的if语句也不会被执行,
   使得后面的    set/a m=sm,n=sn   被执行了


3、关级数据压缩与还原
   1).压缩,因全角为双字节,用单字转换后可以少一半,如果 ▓=a,zf=▓,则:set zf=!%af%! 就可转过来了
   如果不只一个连续的则在字母后跟个数字表示个数,超过9则另起一组,如:a11,则拆为a9a2
   
   2).还原,引用:囧开头的好处,
   
   for /f "tokens=2* delims=囧" %%a in (%~nx0) do (set lev!n!=%%a&set/a n+=1)
   这样在读取时可以减去了对其它非数据行的读取,加快了速度
      同样的方法把字符转换回来,再把搂字作为for /l 计数重复即可全部转换
   if "!tn:%%2=!" neq "!tn!" (set k=%%2) else (set k=1)
            for /l %%k in (1,1,!k!) do (
   上面的!k!即为字符个数
   
   
4、摆脱choice.exe 和 刷屏不闪

   就是用debug.exe 来替了,但是这个是通常所有dos系统都会自带的,所以。。三方。。。
   debug <%~nx0>nul
   调用自身作为管道输入,第一行是出错的,真正有用的只有两行
   e 100 cd 16 86 c4 b4 02 cd 10 b4 4C CD 21   写入代码
   g                                           执行
   这里面进行了键读取,把当前光标位置设为第一行,第一列,并把按键数据作为返回码到:%errorlevel%
   定义:"a=i83=10;i1=7;i72=1;i80=3;i75=2;i77=4;i73=8;i81=9;i57=5;i79=6"
   执行:set in=!i%errorlevel%!
   就根据定义得到按键情况,如果示定义的则为空
   
   平时写批处理要回到第一行显示时,只有用cls,然后再显示,显然速度也很快,还是觉得有点闪。
   直接把光标重置到第一行,第一列,并没有清屏,再次显示时是在原来的基础上的,所以少了闪的感觉
   如果看汇编源码,很简单,把debug <%~nx0>nul后面的>nul去掉,再在e 行和g 行间加入一行u 就可以了
   

5、玩家记录保存,与读取
  这里是把记录存在批处理的第一行,
  
  1).读取
  set/p yg=< %~nx0 >nul
  取第一行到变量 yg
  set yg=!yg:~13,52!
  set lev=%yg=&rem %
  因为当前关记录和已过关的记录是以@为分隔的,这样可以只所@前面的给lev,@后面的被rem 掉了
  set yg= !yg:* =!
  只取已过关的数据,并且保持前后必须有空格
  这样已经所当前关,及已过经过了的关的数据全部读取到变量了
  2).保存
  
  set a=a 10d`db "!lev!@!yg! "``w`q
  (echo %a:`=&echo;%)|debug %~nx0 >nul
  经扩展为:
  (echo a 10d&echo;db "!lev!@!yg! "&echo;&echo;w&echo;q)|debug %~nx0 >nul
  实际上是把以下命令行递给debug 去执行:
  
  a 10d
  db "!lev!@!yg! "
  
  w
  q
  
  利用了debug 的a命令输入汇编指令时,可以用db 定义字符串,然后直接用W命令可以写打开的文件
  并且批处理程序在执行过程中,是可以修改自身的

TOP

增加了记录功能,存到数据文件
(已经在顶楼更新)

TOP

我感觉很好。额,这个,打不打算记录关卡啊。
下次打开才能继续玩。

这样的话,记得上次搞两个批处理对话的时候 net 有个很好的记录方式的不用临时文件。

我那次用任务计划记录字符了,简直浪费系统资源。

先看看你咋弄,我有很恶搞的方法。

TOP

改进了,不需要choice.exe 了,关级文件也集成到程序内了,而且只有3K多一点,呵呵,这次没有尾巴给抓咯!

TOP

修正了一些BUG,并改了一点算法,精简了代码,一大堆if用for代替了,此方法应该算是查表转换法吧

回:yslyxqysl
6楼的那个是从你的 [走迷宫] 那里盗版的,呵呵,被你抓着了... 呵呵!!

[ 本帖最后由 netbenton 于 2009-8-26 20:42 编辑 ]

TOP

啊啊啊..啊..

高手啊..我什么时候才能有这点啊.

TOP

本游戏需要三方工具choice.exe的支持
Choice在Windows 2003或以上的系统中自带。
如无此工具,可以到
http://bbs.bathome.net/thread-1726-1-1.html
下载。

感觉很熟悉...

TOP

Bug:
wasd移动,b后退一步,r重新开始,
g下一关,q退出。
第6关 不存在。。。
请按任意键继续. . .
第7关 不存在。。。
请按任意键继续. . .
第8关 不存在。。。
请按任意键继续. . .
第9关 不存在。。。
请按任意键继续. . .
第10关 不存在。。。
请按任意键继续. . .
第11关 不存在。。。
请按任意键继续. . .
第12关 不存在。。。
请按任意键继续. . .

TOP

看得不太舒服 空的地方就不需要字了吧

TOP

啊啊啊啊啊啊啊啊啊、、我家Choice命令怎么用不了

TOP

太强了,看别人的C语言推箱子我都看了n久才看懂,哎高手就是不一样 沙发

TOP

返回列表