中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --
联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟
中国DOS联盟论坛
现在时间是 2026-08-12 20:46
47,811 主题排行 / 349,897 发帖 / 今日 0 篇 / 48,256 会员排行
DOS批处理 & 脚本技术(批处理室) » [源码解释][10-1-25更新]全彩迷宫 真正彩色的批处理游戏
可打印版本  2,777 / 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