中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
« [1] [2] [3] [4] [5] »
作者:
标题: [原创]推箱子批处理游戏 上一主题 | 下一主题
netbenton
银牌会员

批处理编程迷


积分 1916
发帖 752
注册 2008-12-28
来自 广西
状态 离线
『第 31 楼』:  2009-09-10 更新

1、增加到支持使用超大地图,指一屏以上的

2、增加压缩转换程序对地图的较验功能,出现地图以外的字符时提示

3、开发出地图编辑程序hdt.bat,    用这个程序可以快速的编辑出全角字符地图,用于走迷宫,推箱子等

**请看一楼附件增强版**

[ Last edited by netbenton on 2009-9-16 at 09:47 ]



精简
[你的+我的+他的]=>[大家的]    个人网志   
2009-9-10 12:37
查看资料  发送邮件  发短消息 网志  OICQ (37659560)  编辑帖子  回复  引用回复
netbenton
银牌会员

批处理编程迷


积分 1916
发帖 752
注册 2008-12-28
来自 广西
状态 离线
『第 32 楼』:  

推箱子游戏增加12关(较容易的)
把下面代码增加到批处理推箱子程序后面的关级数据里面即可,
建议插入到关级数据的第三行中
:囧g4a7 g3a2b2abfa g3ab3ab2a g3acbcbcba g3abca2b2a ga3bcbaba2 gad5b2a ga9
:囧g3a6 ga3b4a a2dbca2ba2 ad2cbcb2fa ad2bcbcba2 a5b3a g4a5
:囧a6 abfb2a abcaba abcb2a abcba2 a3ba4 gab2ab2a gad3b2a gab5a ga7
:囧a9a3 ab9ba aba7bfa2 abab9a abab2cb3ab2a abc2ba5b2a a3b2agabd3a g2a4gab4a g7a6
:囧ga9 gab2a2b3a gab3cb3a gacba3bca gabad3aba a2bad3aba2 abcb2cb2cba ab5ab2fa a9a2
:囧g2a5 g2ab3a a3cdca5 ab3dbcb3a aba2ca2bfba ab3dba5 a3bdba g2ab3a g2a5
:囧ga4g2a5 a2b2ag2ab3a abcba4cb2a ab2cd4bcba a2b4abfba2 ga9a
:囧a9a ad2b6a ad2cb2ab2a ab2aca2ba2 abcb5a a5baba g2abcbfba g2ab5a g2a7
:囧a6ga5 ab4a3b3a abc2b5afa abcbad3b3a ab3a8 a5
:囧ga5 gab3a a2bcbag2a4 ab4a4b2a abcb6cda ab3a5cda a5g3abfa g8a4
:囧g7a5 g7adb2a g7adaba a8daba abfbcbcb2cba abababab2a3 ab8a a9a
:囧a5 ab3a4 abababda ab4cba3 a3bacdb2a ab3afb3a ababa6 ab3a a5




精简
[你的+我的+他的]=>[大家的]    个人网志   
2009-9-16 11:51
查看资料  发送邮件  发短消息 网志  OICQ (37659560)  编辑帖子  回复  引用回复
zzybq
初级用户





积分 36
发帖 22
注册 2009-9-12
来自 厦门
状态 离线
『第 33 楼』:  

好东西哦

2009-9-17 00:13
查看资料  发送邮件  访问主页  发短消息 网志   编辑帖子  回复  引用回复
plp626
银牌会员

钻石会员


积分 2278
发帖 1020
注册 2007-11-19
状态 离线
『第 34 楼』:  

很不错,对汇编很在行,学习了。。。



山外有山,人外有人;低调做人,努力做事。

进入网盘(各种工具)~~ 空间~~cmd学习
2009-9-19 12:40
查看资料  发短消息 网志   编辑帖子  回复  引用回复
netbenton
银牌会员

批处理编程迷


积分 1916
发帖 752
注册 2008-12-28
来自 广西
状态 离线
『第 35 楼』:  

原来已经发重了,算了,把一些错别字改改。。。

批处理推箱子源码解释:

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%扩展后就是源值为坑“☆”的所有二维变量的实时的值了;只要%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   被执行了,还原了m,n,即不能动


3、关级数据压缩与还原
   1).压缩,因全角为双字节,用单字转换后可以少一半,如果 ▓=a,zf=▓,则:set zf=!%af%! 就可转过来了
   如果不只一个,有连续的则在字母后跟个数字表示个数,如:a4,超过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 来替了,但这个是通常系统都会自带的,所以。。三方。。。
   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命令可以写打开的文件
  并且批处理程序在执行过程中,是可以修改自身的

[ Last edited by netbenton on 2009-10-5 at 15:46 ]



精简
[你的+我的+他的]=>[大家的]    个人网志   
2009-9-30 00:24
查看资料  发送邮件  发短消息 网志  OICQ (37659560)  编辑帖子  回复  引用回复
sl543001
中级用户




积分 499
发帖 225
注册 2008-12-30
状态 离线
『第 36 楼』:  

强人强帖,小弟受教了!
脚本中有好多好东东可以学习,
例如choice一直是个大麻烦,居然被楼主搞定了!
谁把这些好东东来个总结,俺还在开楼主的代码,研究中!

2009-10-1 17:17
查看资料  发送邮件  发短消息 网志  OICQ (354324773)  编辑帖子  回复  引用回复
nerfg002
初级用户





积分 24
发帖 24
注册 2009-9-21
状态 离线
『第 37 楼』:  

牛牛的 没办法形容

2009-10-1 20:59
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
xdjxondaojune
新手上路





积分 1
发帖 1
注册 2009-8-17
状态 离线
『第 38 楼』:  

第二关是死关,过不了,第三关就是多,容易过。总的写的不错,佩服

2009-10-2 22:07
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
shenlong
新手上路





积分 3
发帖 3
注册 2009-9-30
状态 离线
『第 39 楼』:  

我靠,这水平也太高了...................

2009-10-3 20:29
查看资料  发短消息 网志   编辑帖子  回复  引用回复
livesweet
初级用户





积分 86
发帖 45
注册 2007-7-27
状态 离线
『第 40 楼』:  

我的天,批处理也能编出这么复杂的游戏!楼主厉害,我支持你!

2009-10-5 12:27
查看资料  发短消息 网志   编辑帖子  回复  引用回复
voiL
中级用户





积分 384
发帖 189
注册 2005-10-19
状态 离线
『第 41 楼』:  



  Quote:
Originally posted by xdjxondaojune at 2009-10-2 22:07:
第二关是死关,过不了,第三关就是多,容易过。总的写的不错,佩服

第二关不可能是死关,兄弟多考虑一下吧,我1分钟不到就到第三关了。

2009-10-10 07:27
查看资料  发短消息 网志   编辑帖子  回复  引用回复
523066680
银牌会员

SuperCleaner


积分 2362
发帖 1133
注册 2008-2-2
状态 离线
『第 42 楼』:  

41楼说的对。

话说那位同学怎么能轻易说那是死关……



综合型编程论坛

我的作品索引
  
2009-10-10 08:29
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (523066680)  编辑帖子  回复  引用回复
herohdl
初级用户





积分 36
发帖 15
注册 2008-5-7
状态 离线
『第 43 楼』:  

有意思!!

2009-10-12 18:38
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
RuiIsRui
新手上路




积分 14
发帖 13
注册 2009-7-6
状态 离线
『第 44 楼』:  

厉害,牛,好玩



天行健  君子以自强不息
2009-10-23 22:22
查看资料  发短消息 网志   编辑帖子  回复  引用回复
zhxy9804
中级用户





积分 208
发帖 97
注册 2006-12-28
状态 离线
『第 45 楼』:  

那个俄罗斯方块就很拽,这个更拽了,是所谓大师的著作

2009-10-28 20:31
查看资料  发短消息 网志   编辑帖子  回复  引用回复
« [1] [2] [3] [4] [5] »
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: