中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [源码解释][10-1-25更新]全彩迷宫 真正彩色的批处理游戏
« [1] [2] »
作者:
标题: [源码解释][10-1-25更新]全彩迷宫 真正彩色的批处理游戏 上一主题 | 下一主题
sl543001
中级用户




积分 499
发帖 225
注册 2008-12-30
状态 离线
『楼 主』:  [源码解释][10-1-25更新]全彩迷宫 真正彩色的批处理游戏

一个基于微型外部命令[使用汇编编写大小仅240B]的彩色批处理脚本,基础部分已经基本完成!全部代码[包含sybc.com的生成代码,一张游戏地图],控制在10KB以内.
当前为基础测试版,日后会添加更多有创意的游戏模式,欢迎大家提供意见和建议!

新动向:正在开发新的外部命令,以提高开发速度!
以使用新的外部命令SYBN dll [SD.bat]完成对个演示文件
http://www.cn-dos.net/forum/viewthread.php?tid=50188&fpage=1

-------------------------------------------------------------------------------------
咱这是技术贴,自然要有货才行,俺会不定期添加和修改代码解释!
『第 3 楼』:  解释:sybc命令的彩色输出
『第 4 楼』:  解释:sybc的键盘输入与DEBUG调用2进制程序
『第 5 楼』:  解释:地图压缩
『第 6 楼』:  解释:地图验证
『第 7 楼』:  解释:随机地图生成
『第 11 楼』:  解释:不兼容2K3的原因[未证实]
『第 12 楼』:  解释:关于DEBUD
......等待日后,添加更多解释......
后面会慢慢附上其他代码解释,有疑问请回帖!
近期动向:近期忙着期末考试,正准备把基础功能单独分离出来搞成一个类库的样子,以后写其他脚本时一口气插进去就能用.
另外的心情:俺发现写解释比写代码轻松得多,头疼几个小时也不见得能憋出几行代码,最后一优化可能更没几行了- -!写代码解释就轻松得多,几分钟就出来了!
当然,俺的代码第一优先减小体积[主要减少字数和行数],并没有考虑可读性,所以不包含任何注释,看起来可能比较费劲,有问题就回帖,没问题也请回帖顶一下,嘻嘻!

[ Last edited by sl543001 on 2010-2-5 at 16:29 ]

   此帖被 +70 点积分         点击查看详情   
评分人:【 moniuming 分数: +15  时间:2010-1-16 21:42
评分人:【 netbenton 分数: +15  时间:2010-1-18 23:09
评分人:【 ccwan 分数: +20  时间:2010-1-21 18:10
评分人:【 zh159 分数: +20  时间:2010-1-29 15:58


附件 1: mgtm.rar (2010-1-15 22:53, 4.01 K,下载次数: 88)
附件 2: mg.GIF (2010-1-15 22:54, 13.51 K,下载次数: 19)


附件 3: mgsy.GIF (2010-1-15 22:54, 25.02 K,下载次数: 3)


附件 4: mgtm.GIF (2010-1-15 22:54, 23.05 K,下载次数: 2)


附件 5: yzsb.GIF (2010-1-15 22:54, 26.25 K,下载次数: 2)


2010-1-15 22:53
查看资料  发送邮件  发短消息 网志  OICQ (354324773)  编辑帖子  回复  引用回复
clamber
初级用户





积分 46
发帖 39
注册 2008-11-2
状态 离线
『第 2 楼』:  

不错!看起来很复杂啊,高级命令。

2010-1-16 13:49
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
sl543001
中级用户




积分 499
发帖 225
注册 2008-12-30
状态 离线
『第 3 楼』:  解释:sybc的彩色输出

sybc.com大小仅240B,集成在脚本中,随脚本执行时生成,它源于修改过的tit.com输出彩色字符,依赖于16位子系统"command"
和基于相同命令的:bk子程序结合,可以使用较少的代码实现漂亮的效果:
只需要以下代码既可以实现顶楼的"图1",的选关画面.
::":bk"用于画出彩色的的矩形或直线,以及通过自定义样式画出一些有意思的形状
::画一条竖线 起始位置10008[第0行第8列] 25行 1列 颜色f1[白底蓝字] 样式2[粗体边框]
call :bk 10008 25 1 f1 2
::画一条横线 起始位置12000[第20行第0列] 1行 40列 颜色f1[白底蓝字] 样式2[粗体边框]
call :bk 12000 1 40 f1 2
::在两条线的交点,画出图形
sybc 11908f1╬
sybc 12006f1╬╬╬
sybc 12108f1╬
sybc 12108f1╬
::在屏幕上显示选关信息
sybc 10322f1%JBM% {20100115A 测试版}
sybc 10622f2按上键 $f0上 一 关 $f8[当前版本只有一关]
sybc 10722f2按下键 $f0下 一 关 $f8[第二关为空白关卡]
sybc 10822f2按左键 $f0同步地图 $f8[地图开发协助]
sybc 10922f2按右键 $f0修改验证 $f8[验证的图是否可用]
sybc 11022f2按回车 $f0打开回显 $f8[调试BUG时使用]
sybc 11222f2空格键 $f0随机地图游戏
sybc 11322f2字母键 $f0自带地图游戏
==========================================
SYBC的参数格式如下 [除命令与参数之间的空格外,各参数之间无需空格]
sybc [位置,5个数字][颜色2个16进制数][要显示的文字][符号"$"结束][颜色2个16进制数][要显示的文字][符号"$"结束]...
[位置] 5个数字,第一个是占位数字,大小无所谓,[建议使用1-9],因为脚本对0开头数字可能出错,所以加上个数字凑成5位数,避过0开头,节约脚本的代码
[颜色] 和color的参数一样
[文字] 要显示的文字,不能含有符号"$",因为后边要用
[结束符号] 使用符号"$"结束一个彩色字符串的输出,这样就可以继续写下一个彩色字符串,从而连续输出多种颜色的字符而无需多次调用sybc,节约代码,提高速度.最后一个结束符可以省略
注意:以后版本的sybc参数格式可能有改变!

[ Last edited by sl543001 on 2010-1-18 at 20:53 ]

2010-1-17 16:03
查看资料  发送邮件  发短消息 网志  OICQ (354324773)  编辑帖子  回复  引用回复
sl543001
中级用户




积分 499
发帖 225
注册 2008-12-30
状态 离线
『第 4 楼』:  解释:sybc的键盘输入与DEBUG调用2进制程序

sybc命令还集成了类似choice的截取键盘输入功能,但是它不支持延时.
它支持2种返回值[键盘码和可以获取字符内码]
使用"sybc"命令不加参数可以获取键盘码[对方向键等功能键也有返回值]
使用"sybn a"命令可以获取可以获取字符内码[对方向键等功能键没有返回值]

附上sybc的debug代码:
set a=A100;E8A 80 CD89 C581 81 F980 7F06 CD09 8016 1F9 687F 64EB 83BE E800 65 5AE3 73E8;3C00 7F18 8853 E8C6 57 4CE3 65E8 3C00 7F4F 8845 B0C2 F602 50E2 A0B0 E6F6 15F;E8C7 3D 32E3 C387 393C 27E 904 FB80 7E39 8003 9C3 F24 E380 C00F 4E0 D808;B850 B800 750 295A 89F5 EBE9 AC46 ACAC ACAC F7E2 4CB4 21CD FAEB E088 4CB4;21CD ACAC 203C 475 F9E2 9EB C388 3CAC 7520 E202 C3F9 C387 302C EB80 B430;F60A E4 C3D8 5953 4E42 DED0 C4B8 3032 3930 3231 3631 AC24 243C A74 88AA AAD0;F5E2 B4EB B2EB E349 49AF ACE3 B6E8 E3FF 87A7 3CC3 7E39 402 8009 39FB 37E;C380 2409 800F FE3 10B2 E2F6 D800 C288 C7E2 86EB
set b=;RCX;F0;N SYBC.COM;W;Q;
(ECHO.%a:;=&ECHO.DW %&ECHO.%b:;=&ECHO.%)|DEBUG
使用debug可以吧2进制程序添加的脚本中,但要付出超过2.5倍的文件体积为代价
以下的代码经过了专门的优化,暂时还没有找到更省代码的方式,这使得我们不能方便的在脚本中集成较大的2进制程序
另外这里使用的是额外生成后再调用的方式使用2进制程序.
对于不常用或不方便额外生成文件等情况可以改用"set b=;RCX;F0;G;Q;"直接运行而无需生成文件.[注意:F0是2进制文件的长度]
而这样不能添加参数,不过还可以改用"set b=A80;DB 03 00 54 30 01;RCX;F0;G;Q;"[其中03是要使用参数的长度54 30 01是参数,注意他们都是16进制]
=============================================
注意:SYBC.com是基于tit.com通过反汇编后修改合成的16位程序,它继承了原tit.com的一些BUG和不足.
虽然俺很努力要消除这些BUG和不足,但至今效果有限,只得暂时绕过,但不排除日后这些BUG和不足再次作怪!
已知的BUG的和不足体现如下:
1.乱码,部分情况下中文字符发生局部乱码,无太大影响.[没有规律,只出现在中文字符之间]
2.无显示,部分情况下该被覆盖显示的内容未被覆盖,无太大影响.[大多不定期出现在自下向上显示内容时]
3.不支持windows 2003,由于兼容性问题sybc不支持等部分操作系统,体现为啥也不显示,影响较大,暂未找到解决办法!

[ Last edited by sl543001 on 2010-1-20 at 21:31 ]

2010-1-17 16:15
查看资料  发送邮件  发短消息 网志  OICQ (354324773)  编辑帖子  回复  引用回复
sl543001
中级用户




积分 499
发帖 225
注册 2008-12-30
状态 离线
『第 5 楼』:  解释:地图压缩

一张完整的地图要包含21*40个方格的信息,每个方格格式大体为"f1■$",由此可以算出地图大小=21*40*5=4200B大约为4KB
对于脚本来说执行效率与文件大小成反比,大于10kb的脚本如果有很多跳转的话,可能慢如蜗牛.
很不巧,游戏类的脚本基本上大多含有大量的跳转,所以控制文件大小就必需了!
解决办法有两方面,一,优化压缩代码;二,拆分为多个文件;两手都要抓,两手都要硬!
由于当前只有一张地图,勉强还不用拆分文件,所以我们先对地图代码进行压缩!
压缩算法如下:
===============================================
1.把每个地图格子用一个字母代替 如"f1■$"用字母D代替,为了区分,我们使用变量DKD来代替f1■$",而在地图中则直接使用字母D
变量DK*在脚本的开头定义:DKA=F2∷$;DKB=F4·$;DKD=F1■$;DKE=F0¤$;DKQ=F0■$;DKV=F5∷$;DKW=F5:D$;DKX=F2☆$
另外,在游戏的地图模块或地图文件中还可以添加或是修改以上定义
===============================================
2.利用脚本推箱子的方法http://www.cn-dos.net/forum/viewthread.php?tid=48603&fpage=1
把重复地块用数字替换,如把"AAAAAAA"替换为""A7,这样可以立刻再节约很多地图代码
===============================================
3.由于以上2步后地图文件减小了10倍但仍然大于400B,单张地图自然无所谓,但考虑到将来可能有很多张的图,所以需要进一步压缩代码.
为了进一步减小代码,继续使用地图中未使用的字母替代在不同位置重复的部分,将替代列表保存到额外的变量[DTMY]中
===============================================
最后单张地图大小控制在300B以内,完全可以在当前脚本中添加几张地图而不太大的增加文件体积.
当然这并不是最优的方法,也许以后能找到更好的方法替代它!
最终的地图格式如下:
SET DTM1=AMHE8AHHMK8O5QEME5ADKOEN2PO2DE6MQON9PN3QN2QEJONHAOEN2O2N3PEJONO7A2PNON2QOEJONHAP2NDE8AEJ3N9PQNKEMOE4DKP3ONHEMOK4NOE5ANQO4EMHE4AN9IO2OEMK4ODE8AIE4AEME3AHAN3QOI6AM3P9IPIE4AEJODKOE3AOIOAOEJOKAQQPP4EJHE6AE5APE6JK6O7PE$
SET DTS1=DTBH=7;DTBL=29;DTMY=-AMDANEAOOOPO3QE9HNPIMPJ9AK
当前版本的地图解压代码如下:
SET TC=ABCDEFGHIJKLMNOPQRSTUVWXYZ
SET DTMY=
SET /A TN=123456789,N=1,M=1,DTMYC=10,WZH=1,WZL=1
::::::::::::::::::::::::::::::::::::::::::::
::再此加入或读取地图信息存储到相应的变量中,例如把上面的代码插入到这里
::::::::::::::::::::::::::::::::::::::::::::
SET A=!DTS%GS%:;=$!
SET %A:$=&SET %
FOR /L %%A IN (1,1,%DTMYC%) DO SET /A LSBL1=%%A*3-3 &&SET /A LSBL2=%%A*3-1 &&(FOR /F "TOKENS=1,2" %%B IN ("!LSBL1! !LSBL2!") DO IF NOT "%%C" == "" SET dtJ%%A=!DTMY:~%%B,2! && SET DTY%%A=!DTMY:~%%C,1!)
for /l %%A in (%DTMYC%,-1,1) do for /f "tokens=1,2" %%B in ("!DTY%%A! !DTJ%%A!") DO SET DTM%GS%=!DTM%GS%:%%B=%%C!
ECHO %DTM1% >DTM1.TXT
FOR /L %%A IN (0,1,999) DO (SET /A T=%%A+1
FOR %%B IN (!T!) DO (FOR /F "TOKENS=1-3 DELIMS=/" %%1 IN ("!DTM%GS%:~%%A,1!/!DTM%GS%:~%%B,1!/!N!") DO (
IF "!TC:%%1=!" NEQ "!TC!" (IF "!TN:%%2=!" NEQ "!TN!" (SET K=%%2) ELSE (SET K=1)
FOR /L %%K IN (1,1,!K!) DO SET DT!N!.!M!=!DK%%1!&&SET /A M+=1
) ELSE (IF "%%1" EQU "-" SET /A N+=1,M=1)&&IF "!TN:%%2=!" == "$" GOTO ZRDTW)))
: ZRDTW
SET DT%DTBH%.%DTBL%=%DKX%
[ Last edited by sl543001 on 2010-1-20 at 21:06 ]

2010-1-18 19:55
查看资料  发送邮件  发短消息 网志  OICQ (354324773)  编辑帖子  回复  引用回复
sl543001
中级用户




积分 499
发帖 225
注册 2008-12-30
状态 离线
『第 6 楼』:  解释:地图验证

在截图4中,我们看到了验证失败的提示框,它使用的自认也是sybc+:BK组合,代码如下[没错,就3行代码]:
call :BK 10824 15 4 81 3
SYBC 10926CF×$85  验证失败!$87[难度:%NANDU%]
SYBC 1102680地图不可用,正在重制地图!
他是脚本对随机的图可用性验证失败后的提示,也就是出现永远也走不通时才出现.
其算法比较简陋,遇到如下左边情况时,将把地图替换为右边情况,循环重复直至无法改变或遇到地图出口为止.
■■■■■■■■■  ■■■■■■■■■  ■■■■■■■■■
■○∷∷∷∷∷∷■  ■○○∷∷∷∷∷■  ■○○○∷∷∷∷■
■∷■■■■■∷■  ■○■■■■■∷■  ■○■■■■■∷■
■∷■∷∷∷■∷■  ■∷■∷∷∷■∷■  ■○■∷∷∷■∷■
■∷■∷■■■∷■  ■∷■∷■■■∷■  ■∷■∷■■■∷■
■∷■∷∷∷∷∷■  ■∷■∷∷∷∷∷■  ■∷■∷∷∷∷∷■
■■■■■■■■■  ■■■■■■■■■  ■■■■■■■■■
由图可知检查○周围是否有∷,有则替换为○[实际脚本中使用的是小点·由于论坛字体的原因为了美观改用圆圈○代替]
从左上第一个格子开始,一行一行检查直至右下方最终结果会是下图
■■■■■■■■■
■○○○○○○○■
■○■■■■■○■  
■○■∷∷∷■○■
■○■∷■■■○■  
■○■∷∷∷○○■  
■■■■■■■■■
由图可知,执行一遍后会漏掉好多方块,于是需要再检查一遍
为了防止出现极端情况例如类似如下左图,我们不能一直由左上至右下检查,而需要不断改变方向,脚本中就是使用4个方向轮流检查.
■■■■■■■■■ ■■■■■■■■■ ■■■■■■■■■
■○■∷∷∷■∷■ ■○■∷∷∷■∷■ ■○■∷∷∷■∷■
■○■∷■∷■∷■ ■○■∷■∷■∷■ ■○■∷■∷■∷■  
■○■∷■∷■∷■ ■○■∷■∷■∷■ ■○■○■∷■∷■  
■○■∷■∷■∷■ ■○■○■∷■∷■ ■○■○■∷■∷■  
■○○○■∷∷∷■ ■○○○■∷∷∷■ ■○○○■∷∷∷■
■■■■■■■■■ ■■■■■■■■■ ■■■■■■■■■
[上图中由于出现自下向上的情况,如果一直由左上至右下检查,每检查一个大循环才改变一个格子,效率相当低下]
===================================
附:验证部分代码:
: YZDT
IF %YZMS% == %YzM2% GOTO OK
IF %YZMS% == %YzM1% IF %SJDT% == 0 GOTO OK
TITLE %JBM% 验证地图[%LSBLL%.%LSBLM%]
IF "%LSBLL%" == "180" GOTO NN
SET YZTG=NO
SET A=DT1.1=%DKB%;LSBLN=%LSBLM%;YZA5=^^^!YZA4^^^!;YZA4=^^^!YZA3^^^!;YZA3=^^^!YZA2^^^!;YZA2=^^^!YZA1^^^!;YZA1=^^^!YZA5^^^!;YZB5=^^^!YZB4^^^!;YZB4=^^^!YZB3^^^!;YZB3=^^^!YZB2^^^!;YZB2=^^^!YZB1^^^!;YZB1=^^^!YZB5^^^!
SET %A:;=&SET %
FOR /L %%A IN (%YZA2%) DO FOR /L %%B IN (%YZB2%) DO IF !DT%%A.%%B! == %DKB% (
SET /A YZH=%%A-1,YZL=%%B
FOR /F %%C IN ("^!DT!YZH!.!YZL!^!") DO SET B=%%C
IF !B! == %DKA% SET DT!YZH!.!YZL!=%DKB%&SET /A LSBLM+=1
IF !B! == %DKX% GOTO OK
SET /A YZH=%%A,YZL=%%B-1
FOR /F %%C IN ("^!DT!YZH!.!YZL!^!") DO SET B=%%C
IF !B! == %DKA% SET DT!YZH!.!YZL!=%DKB%&SET /A LSBLM+=1
IF !B! == %DKX% GOTO OK
SET /A YZL=%%B+1
FOR /F %%C IN ("^!DT!YZH!.!YZL!^!") DO SET B=%%C
IF !B! == %DKA% SET DT!YZH!.!YZL!=%DKB%&SET /A LSBLM+=1
IF !B! == %DKX% GOTO OK
SET /A YZH=%%A+1,YZL=%%B
FOR /F %%C IN ("^!DT!YZH!.!YZL!^!") DO SET B=%%C
IF !B! == %DKA% SET DT!YZH!.!YZL!=%DKB%&SET /A LSBLM+=1
IF !B! == %DKX% GOTO OK
)
SET /A LSBLL=LSBLL+1
IF "%LSBLM%" == "%LSBLN%" GOTO NN
GOTO YZDT
: OK
TITLE %JBM% 迷宫探秘
SET /A WZH=1,WZL=1,YZTG=0
FOR /L %%A IN (1,1,20) DO FOR /L %%B IN (1,1,39) DO IF !DT%%A.%%B! == %DKB% SET DT%%A.%%B=%DKA%
goto :eof
: NN
CALL :XS
call :BK 10824 15 4 81 3
SYBC 10926CF×$85  验证失败!$87[难度:%NANDU%]
SYBC 1102680地图不可用,正在重制地图!
SET /A NANDU-=10,YZTG=1
IF %NANDU% LSS 10 SET NANDU=20
goto :eof
[ Last edited by sl543001 on 2010-1-19 at 23:41 ]

2010-1-19 22:56
查看资料  发送邮件  发短消息 网志  OICQ (354324773)  编辑帖子  回复  引用回复
sl543001
中级用户




积分 499
发帖 225
注册 2008-12-30
状态 离线
『第 7 楼』:  解释:随机地图生成

在没有大量自带地图的情况下,使用随机地图是唯一的出路!
最初使用的随机地图是完全无规律的随机布点,最终地图很难看.
后来在同学HEXIN.的建议下改用1/4永久墙,1/4永久空,1/2随机的方式生成出看起来比较整齐的随机地图.
==============================================
当前的随机地图生成算法一样很简陋,分为3个步骤:
1.制作地图边框,生成类似如下的图:
■■■■■■■■■■■
■∷∷∷∷∷∷∷∷∷■
■∷∷∷∷∷∷∷∷∷■
■∷∷∷∷∷∷∷∷∷■
■∷∷∷∷∷∷∷∷∷■
■∷∷∷∷∷∷∷∷∷■
■∷∷∷∷∷∷∷∷∷■
■∷∷∷∷∷∷∷∷∷■
■■■■■■■■■■■
2.在偶数行偶数列添加■,生成类似如下的图:[注意:最左上角的坐标为0,0]
■■■■■■■■■■■
■∷∷∷∷∷∷∷∷∷■
■∷■∷■∷■∷■∷■
■∷∷∷∷∷∷∷∷∷■
■∷■∷■∷■∷■∷■
■∷∷∷∷∷∷∷∷∷■
■∷■∷■∷■∷■∷■
■∷∷∷∷∷∷∷∷∷■
■■■■■■■■■■■
3.如果是奇数行在偶数列随机生成,如果是偶数行在奇数列随机生成■
■■■■■■■■■■■
■∷○∷○∷○∷○∷■    ○为奇数行的偶数列的位置
■◎■◎■◎■◎■◎■    ◎为偶数行的奇数列的位置
■∷○∷○∷○∷○∷■
■◎■◎■◎■◎■◎■    反复随机在以上位置生成■
■∷○∷○∷○∷○∷■    随机的数量有变量NANDU控制
■◎■◎■◎■◎■◎■
■∷○∷○∷○∷○∷■
■■■■■■■■■■■
加上随机生成的出口,最终生成的地图类似下图:
■■■■■■■■■■■
■∷∷∷■∷■∷∷∷■
■∷■■■∷■■■∷■
■∷∷∷■∷∷∷∷∷■
■■■∷■∷■∷■■■
■∷■∷∷∷■∷■∷■
■■■■■☆■∷■■■
■∷■∷∷∷■∷∷∷■
■■■■■■■■■■■
然后就交给楼上的地图验证模块验证了!
=========================
附地图生成部分代码:
:SJ
SET /A SJDT=1,LSBL=1
FOR /L %%A IN (2,2,19) DO FOR /L %%B IN (2,2,38) DO SET DT%%A.%%B=%DKE%
: SJ1
SET /A LSBL+=1,sjh=%random%%%19+1,sjl=%random%%%19*2+2,sjhj=sjh/2,sjho=(sjh+1)/2        
if %sjhj% == %sjho% set /a sjl-=1
SET DT%SJH%.%SJL%=%DKE%
IF %LSBL% LSS %NANDU% GOTO SJ1
: SJ2
SET /A sjh=%random%%%19+1,sjl=%random%%%19*2+2,A=(SJL+4)*(SJH+4)
IF %A% LSS 100 GOTO SJ2
SET A=DT1.2=%DKA%;DT2.1=%DKA%;DT2.3=%DKA%;DT3.2=%DKA%;DT4.3=%DKA%;DT3.4=%DKA%;DT%SJH%.%SJL%=%DKX%
SET %A:;=&SET %
GOTO :EOF
[ Last edited by sl543001 on 2010-1-20 at 21:16 ]

2010-1-20 20:41
查看资料  发送邮件  发短消息 网志  OICQ (354324773)  编辑帖子  回复  引用回复
cxchcq
新手上路





积分 16
发帖 12
注册 2010-1-19
状态 离线
『第 8 楼』:  

顶下。。很强大

2010-1-21 17:33
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
ccwan
金牌会员




积分 2725
发帖 1160
注册 2006-9-23
来自 河北廊坊
状态 离线
『第 9 楼』:  

强人!



三人行,必有吾师焉。   学然后知不足,教然后知困,然后能自强也。
2010-1-21 18:09
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
Jays
新手上路





积分 10
发帖 7
注册 2006-10-31
状态 离线
『第 10 楼』:  

怎么不兼容2K3呢?

2010-1-22 10:31
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
sl543001
中级用户




积分 499
发帖 225
注册 2008-12-30
状态 离线
『第 11 楼』:  解释:不兼容2K3的原因[未证实]

脚本彩色输出使用的com程序是16位DOS程序,
要在非DOS系统下运行,需要模拟系统.
windows 98/2000/XP/2003......等系统使用command.exe[16位子系统]运行16位DOS程序.
从windows 2000起默认shell改用基于32位的cmd.exe,从此脚本的扩展名也从bat改为cmd.
在windows 2000/XP中,一旦使用16位DOS程序.系统将自动从cmd.exe切换到command.exe,并不在自动切回.
而windows 2003中使用16位DOS程序.系统将自动从cmd.exe切换到command.exe,完成后自动切回cmd.exe.
==========================================
为啥呢?因为command.exe默认不支持中文哦,要不然咱干嘛在脚本开头加上chcp 437 graftabl 936 强制改为中文显示.
微软正在有计划的淘汰16位程序,这只是第一步!
当然微软有他的理由,他可能会说:"你瞧!你的cmd窗口宽度最多80,但是脱离[不兼容]16位dos程序后,你的cmd窗口可以拉长哦!"
当然,暗地里的原因他是不会告诉你的!推荐大家了解一下"WINter"联盟.

[ Last edited by sl543001 on 2010-1-23 at 18:17 ]

2010-1-23 18:10
查看资料  发送邮件  发短消息 网志  OICQ (354324773)  编辑帖子  回复  引用回复
sl543001
中级用户




积分 499
发帖 225
注册 2008-12-30
状态 离线
『第 12 楼』:  解释:关于DEBUD

windows系列中DEBUG是16位子系统的调试工具,也就是说它只针对16位子系统[也就是你打开的cmd窗口]有效.貌似不同cmd窗口运行同时DEBUG相互之间没有关联.这样的话,DEBUG这个在DOS时代超级牛X的大神在2000以后的系统中用途就有限了.不过我们仍然可以利用它发挥余热,为本们贡献力量.
===============================================
DUGUG在脚本中目前比较常用的功能就是输出com程序.
我们使用a+db[单字节]或a+dw[双字节]或e等指令吧汇编源代码或16进制代码输入到DEBUG.然后使用W指令输出的文件,然后运行文件.这个过程可以制造出"假单文件"的脚本,当然,把W改为G可以跳过生成文件的步骤,制造出"真单文件"的脚本.另外DEBUG还可以用来进行简单的16进制编辑和文本修改.
当然,还有很多方式有待我们去发掘!
===============================================
首先解释一下a dw db e等DEBUG指令
[例1.1]:a指令可以让我们在制定位置向内存写汇编指令
-----------------------------------------------
a 100
mov ah,4c
int 21

-----------------------------------------------
[例1.2]:a+db指令单字节写16进制数据到内存
-----------------------------------------------
a 100
db b4 4c cd 21

-----------------------------------------------
[例1.3]:a+dw指令双字节写16进制数据到内存[注意dw的数据顺序不同于db哦]
-----------------------------------------------
a 100
dw 4cb4 21cd

-----------------------------------------------
[例1.4]:e指令单字节写16进制数据到内存
-----------------------------------------------
e 100 b4 4c cd 21
-----------------------------------------------
注意1:以上四个例子最终效果是一样的哦!
注意2:前3个例子最后有一个空行,不能省哦!

发现:貌似e指令最省代码,然后是a+dw.不过如果代码比较多的话,貌似有变化.dw每4个16进制数一个空格,而db和e是2个16进制数一个空格.稍微多一点的代码db就会超过e哦!所以代码较少e好用一些较多时dw更省代码.
===============================================
上面介绍了输入到内存,再解释一下输出到文件的N W R
N是指定最后输出的文件名,例如:sybc.com,注意使用8.3规则,部分情况下可能大小写敏感.
R CX用于制定文件大小,很重要,注意使用16进制在后一行写
W 就是保存了,不需要参数
[例2.1]:保存示例
-----------------------------------------------
a 100
db b4 4c cd 21

r cx
4
n sybc.com
w

-----------------------------------------------
另外,不想输出文件直接运行要使用G指令
[例2.2]:G运行
-----------------------------------------------
a 100
db b4 4c cd 21

r cx
4
g

-----------------------------------------------
===============================================
其他常用的DEBUG指令
F 批量写入重复内容
L 读取文件到内存[事先用n指定文件名]
这些东西大家自己去看帮助文档或去百度了解吧,就不详细介绍了
===============================================
最后这么多行东西怎么搞到cmd里去呢?只要全部echo然后搞到括号里最后使用管道符搞进DEBUG就行.
[例3.1]:插入到cmd
-----------------------------------------------
(echo a 100&echo db b4 4c cd 21&echo.&echo r cx&echo 4&echo g&echo.)|DEBUG
-----------------------------------------------
另外还有不在成熟的半成品方案,效果也不错,就是必须放在开头.
[例3.2]:插入到cmd的半成品方案
-----------------------------------------------
@echo off&color f2&title ...&goto begain
a 100
db b4 4c cd 21

r cx
4
g

:begain
debug <%0 >nul
-----------------------------------------------
===============================================
最终的优化:一些小技巧可以进一步优化代码
a 100可以用a100
e 100可以用e100
r cx可以用rcx
也就是可以省aer等指令后的空格,但也仅限于此
db,dw之类的空格是不可以省的.
利用预处理吧重复的代码简化
例如:
(echo a 100&echo db b4 4c cd 21&echo.&echo r cx&echo 4&echo g&echo.)|DEBUG
可以简化为
set a=a 100;db b4 4c cd 21;;rcx;4; g;
(ECHO.%a:;=&ECHO. %)|debug
当然相信大家可以找到更多更好的办法继续优化.

[ Last edited by sl543001 on 2010-1-25 at 19:32 ]

2010-1-25 19:30
查看资料  发送邮件  发短消息 网志  OICQ (354324773)  编辑帖子  回复  引用回复
ldr2zjj
初级用户





积分 167
发帖 95
注册 2007-5-6
状态 离线
『第 13 楼』:  

太牛了~~~~~~~~

2010-1-28 14:29
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
ldr2zjj
初级用户





积分 167
发帖 95
注册 2007-5-6
状态 离线
『第 14 楼』:  

先试试~~~看起来非常牛,我的WIN7系统玩不了~~~

2010-1-29 13:05
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
sysplay
初级用户





积分 23
发帖 19
注册 2009-7-10
状态 离线
『第 15 楼』:  

终于见识到什么是高手。

2010-2-1 17:55
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
« [1] [2] »
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


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



论坛跳转: