![]() |
中国DOS联盟-- 联合DOS 推动DOS 发展DOS --联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum |
| 游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟 |
|
中国DOS联盟论坛 现在时间是 2026-08-13 00:07 |
共 47,811 主题排行 / 349,897 发帖 / 今日 0 篇 / 48,256 会员排行 |
| DOS批处理 & 脚本技术(批处理室) » [源码解释][10-1-25更新]全彩迷宫 真正彩色的批处理游戏 |
| 可打印版本 2,783 / 15 |
| 第1楼 sl543001 | 发表于 2010-01-15 22:53 |
| 中级用户 发帖 225 积分 499 | |
|
[源码解释][10-1-25更新]全彩迷宫 真正彩色的批处理游戏 一个基于微型外部命令的彩色批处理脚本,基础部分已经基本完成!全部代码,控制在10KB以内.
当前为基础测试版,日后会添加更多有创意的游戏模式,欢迎大家提供意见和建议! 新动向:正在开发新的外部命令,以提高开发速度! 以使用新的外部命令SYBN dll 完成对个演示文件 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 ] 附件 mgtm.rar (4.01 KiB) mg.GIF (13.51 KiB) mgsy.GIF (25.02 KiB) mgtm.GIF (23.05 KiB) yzsb.GIF (26.25 KiB) |
|
| 第2楼 clamber | 发表于 2010-01-16 13:49 |
| 初级用户 发帖 39 积分 46 | |
|
不错!看起来很复杂啊,高级命令。
|
|
| 第3楼 sl543001 | 发表于 2010-01-17 16:03 |
| 中级用户 发帖 225 积分 499 | |
|
解释:sybc的彩色输出 sybc.com大小仅240B,集成在脚本中,随脚本执行时生成,它源于修改过的tit.com输出彩色字符,依赖于16位子系统"command"
和基于相同命令的:bk子程序结合,可以使用较少的代码实现漂亮的效果: 只需要以下代码既可以实现顶楼的"图1",的选关画面. ========================================== SYBC的参数格式如下 sybc ... 5个数字,第一个是占位数字,大小无所谓,,因为脚本对0开头数字可能出错,所以加上个数字凑成5位数,避过0开头,节约脚本的代码 和color的参数一样 要显示的文字,不能含有符号"$",因为后边要用 使用符号"$"结束一个彩色字符串的输出,这样就可以继续写下一个彩色字符串,从而连续输出多种颜色的字符而无需多次调用sybc,节约代码,提高速度.最后一个结束符可以省略 注意:以后版本的sybc参数格式可能有改变! [ Last edited by sl543001 on 2010-1-18 at 20:53 ] |
|
| 第4楼 sl543001 | 发表于 2010-01-17 16:15 |
| 中级用户 发帖 225 积分 499 | |
|
解释:sybc的键盘输入与DEBUG调用2进制程序 sybc命令还集成了类似choice的截取键盘输入功能,但是它不支持延时.
它支持2种返回值 使用"sybc"命令不加参数可以获取键盘码 使用"sybn a"命令可以获取可以获取字符内码 附上sybc的debug代码: 使用debug可以吧2进制程序添加的脚本中,但要付出超过2.5倍的文件体积为代价 以下的代码经过了专门的优化,暂时还没有找到更省代码的方式,这使得我们不能方便的在脚本中集成较大的2进制程序 另外这里使用的是额外生成后再调用的方式使用2进制程序. 对于不常用或不方便额外生成文件等情况可以改用"set b=;RCX;F0;G;Q;"直接运行而无需生成文件. 而这样不能添加参数,不过还可以改用"set b=A80;DB 03 00 54 30 01;RCX;F0;G;Q;" ============================================= 注意: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 ] |
|
| 第5楼 sl543001 | 发表于 2010-01-18 19:55 |
| 中级用户 发帖 225 积分 499 | |
|
解释:地图压缩 一张完整的地图要包含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,单张地图自然无所谓,但考虑到将来可能有很多张的图,所以需要进一步压缩代码. 为了进一步减小代码,继续使用地图中未使用的字母替代在不同位置重复的部分,将替代列表保存到额外的变量中 =============================================== 最后单张地图大小控制在300B以内,完全可以在当前脚本中添加几张地图而不太大的增加文件体积. 当然这并不是最优的方法,也许以后能找到更好的方法替代它! 最终的地图格式如下: 当前版本的地图解压代码如下: [ Last edited by sl543001 on 2010-1-20 at 21:06 ] |
|
| 第6楼 sl543001 | 发表于 2010-01-19 22:56 |
| 中级用户 发帖 225 积分 499 | |
|
解释:地图验证 在截图4中,我们看到了验证失败的提示框,它使用的自认也是sybc+:BK组合,代码如下:
他是脚本对随机的图可用性验证失败后的提示,也就是出现永远也走不通时才出现. 其算法比较简陋,遇到如下左边情况时,将把地图替换为右边情况,循环重复直至无法改变或遇到地图出口为止. ■■■■■■■■■ ■■■■■■■■■ ■■■■■■■■■ ■○∷∷∷∷∷∷■ ■○○∷∷∷∷∷■ ■○○○∷∷∷∷■ ■∷■■■■■∷■ ■○■■■■■∷■ ■○■■■■■∷■ ■∷■∷∷∷■∷■ ■∷■∷∷∷■∷■ ■○■∷∷∷■∷■ ■∷■∷■■■∷■ ■∷■∷■■■∷■ ■∷■∷■■■∷■ ■∷■∷∷∷∷∷■ ■∷■∷∷∷∷∷■ ■∷■∷∷∷∷∷■ ■■■■■■■■■ ■■■■■■■■■ ■■■■■■■■■ 由图可知检查○周围是否有∷,有则替换为○ 从左上第一个格子开始,一行一行检查直至右下方最终结果会是下图 ■■■■■■■■■ ■○○○○○○○■ ■○■■■■■○■ ■○■∷∷∷■○■ ■○■∷■■■○■ ■○■∷∷∷○○■ ■■■■■■■■■ 由图可知,执行一遍后会漏掉好多方块,于是需要再检查一遍 为了防止出现极端情况例如类似如下左图,我们不能一直由左上至右下检查,而需要不断改变方向,脚本中就是使用4个方向轮流检查. ■■■■■■■■■ ■■■■■■■■■ ■■■■■■■■■ ■○■∷∷∷■∷■ ■○■∷∷∷■∷■ ■○■∷∷∷■∷■ ■○■∷■∷■∷■ ■○■∷■∷■∷■ ■○■∷■∷■∷■ ■○■∷■∷■∷■ ■○■∷■∷■∷■ ■○■○■∷■∷■ ■○■∷■∷■∷■ ■○■○■∷■∷■ ■○■○■∷■∷■ ■○○○■∷∷∷■ ■○○○■∷∷∷■ ■○○○■∷∷∷■ ■■■■■■■■■ ■■■■■■■■■ ■■■■■■■■■ =================================== 附:验证部分代码: [ Last edited by sl543001 on 2010-1-19 at 23:41 ] |
|
| 第7楼 sl543001 | 发表于 2010-01-20 20:41 |
| 中级用户 发帖 225 积分 499 | |
|
解释:随机地图生成 在没有大量自带地图的情况下,使用随机地图是唯一的出路!
最初使用的随机地图是完全无规律的随机布点,最终地图很难看. 后来在同学HEXIN.的建议下改用1/4永久墙,1/4永久空,1/2随机的方式生成出看起来比较整齐的随机地图. ============================================== 当前的随机地图生成算法一样很简陋,分为3个步骤: 1.制作地图边框,生成类似如下的图: ■■■■■■■■■■■ ■∷∷∷∷∷∷∷∷∷■ ■∷∷∷∷∷∷∷∷∷■ ■∷∷∷∷∷∷∷∷∷■ ■∷∷∷∷∷∷∷∷∷■ ■∷∷∷∷∷∷∷∷∷■ ■∷∷∷∷∷∷∷∷∷■ ■∷∷∷∷∷∷∷∷∷■ ■■■■■■■■■■■ 2.在偶数行偶数列添加■,生成类似如下的图: ■■■■■■■■■■■ ■∷∷∷∷∷∷∷∷∷■ ■∷■∷■∷■∷■∷■ ■∷∷∷∷∷∷∷∷∷■ ■∷■∷■∷■∷■∷■ ■∷∷∷∷∷∷∷∷∷■ ■∷■∷■∷■∷■∷■ ■∷∷∷∷∷∷∷∷∷■ ■■■■■■■■■■■ 3.如果是奇数行在偶数列随机生成,如果是偶数行在奇数列随机生成■ ■■■■■■■■■■■ ■∷○∷○∷○∷○∷■ ○为奇数行的偶数列的位置 ■◎■◎■◎■◎■◎■ ◎为偶数行的奇数列的位置 ■∷○∷○∷○∷○∷■ ■◎■◎■◎■◎■◎■ 反复随机在以上位置生成■ ■∷○∷○∷○∷○∷■ 随机的数量有变量NANDU控制 ■◎■◎■◎■◎■◎■ ■∷○∷○∷○∷○∷■ ■■■■■■■■■■■ 加上随机生成的出口,最终生成的地图类似下图: ■■■■■■■■■■■ ■∷∷∷■∷■∷∷∷■ ■∷■■■∷■■■∷■ ■∷∷∷■∷∷∷∷∷■ ■■■∷■∷■∷■■■ ■∷■∷∷∷■∷■∷■ ■■■■■☆■∷■■■ ■∷■∷∷∷■∷∷∷■ ■■■■■■■■■■■ 然后就交给楼上的地图验证模块验证了! ========================= 附地图生成部分代码: [ Last edited by sl543001 on 2010-1-20 at 21:16 ] |
|
| 第8楼 cxchcq | 发表于 2010-01-21 17:33 |
| 新手上路 发帖 12 积分 16 | |
|
顶下。。很强大
|
|
| 第9楼 ccwan | 发表于 2010-01-21 18:09 |
| 金牌会员 发帖 1,160 积分 2,725 来自 河北廊坊 | |
|
强人!
|
|
| 第10楼 Jays | 发表于 2010-01-22 10:31 |
| 新手上路 发帖 7 积分 10 | |
|
怎么不兼容2K3呢?
|
|
| 第11楼 sl543001 | 发表于 2010-01-23 18:10 |
| 中级用户 发帖 225 积分 499 | |
|
解释:不兼容2K3的原因[未证实] 脚本彩色输出使用的com程序是16位DOS程序,
要在非DOS系统下运行,需要模拟系统. windows 98/2000/XP/2003......等系统使用command.exe运行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 ] |
|
| 第12楼 sl543001 | 发表于 2010-01-25 19:30 |
| 中级用户 发帖 225 积分 499 | |
|
解释:关于DEBUD windows系列中DEBUG是16位子系统的调试工具,也就是说它只针对16位子系统有效.貌似不同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指令 :a指令可以让我们在制定位置向内存写汇编指令 ----------------------------------------------- a 100 mov ah,4c int 21 ----------------------------------------------- :a+db指令单字节写16进制数据到内存 ----------------------------------------------- a 100 db b4 4c cd 21 ----------------------------------------------- :a+dw指令双字节写16进制数据到内存 ----------------------------------------------- a 100 dw 4cb4 21cd ----------------------------------------------- :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 就是保存了,不需要参数 :保存示例 ----------------------------------------------- a 100 db b4 4c cd 21 r cx 4 n sybc.com w ----------------------------------------------- 另外,不想输出文件直接运行要使用G指令 :G运行 ----------------------------------------------- a 100 db b4 4c cd 21 r cx 4 g ----------------------------------------------- =============================================== 其他常用的DEBUG指令 F 批量写入重复内容 L 读取文件到内存 这些东西大家自己去看帮助文档或去百度了解吧,就不详细介绍了 =============================================== 最后这么多行东西怎么搞到cmd里去呢?只要全部echo然后搞到括号里最后使用管道符搞进DEBUG就行. :插入到cmd ----------------------------------------------- (echo a 100&echo db b4 4c cd 21&echo.&echo r cx&echo 4&echo g&echo.)|DEBUG ----------------------------------------------- 另外还有不在成熟的半成品方案,效果也不错,就是必须放在开头. :插入到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 ] |
|
| 第13楼 ldr2zjj | 发表于 2010-01-28 14:29 |
| 初级用户 发帖 95 积分 167 | |
|
太牛了~~~~~~~~
|
|
| 第14楼 ldr2zjj | 发表于 2010-01-29 13:05 |
| 初级用户 发帖 95 积分 167 | |
|
先试试~~~看起来非常牛,我的WIN7系统玩不了~~~
|
|
| 第15楼 sysplay | 发表于 2010-02-01 17:55 |
| 初级用户 发帖 19 积分 23 | |
|
终于见识到什么是高手。
|
|
| 1 2 下一页 |
|
[ 联系联盟系统管理团队 -
中国DOS联盟 -
标准版 ] Sponsored by ifanr Inc | © 2001–2023 |