中国DOS联盟

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

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

中国DOS联盟论坛
现在时间是 2026-06-20 12:38
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [推荐][挑战思路]用脚本模拟黑客帝国数码雨 精华I 查看 27,142 回复 67
楼 主 [推荐][挑战思路]用脚本模拟黑客帝国数码雨 发表于 2006-11-01 23:47 ·  中国 浙江 宁波 鹏博士宽带
荣誉版主
★★★
积分 1,338
发帖 356
注册 2005-07-15 12:09
20年会员
UID 40733
性别 男
状态 离线
近日看到一段用 PHP 制作的脚本,模拟了黑客帝国里数码雨的效果,很炫。遗憾的是我将脚本保存后,忘了保存作者的主页,搜索也没有结果,所以我也不知道作者是谁了。

我尝试用纯批处理来实现,始终没有成功。鉴于大家机器上不可能都安装有 PHP ,我将其转换成了 awk 脚本,可以更方便的先体验一下效果。

看看兄弟们那位能用批处理来实现。
awk 版:
保存为批处理执行。

@echo off
mode con cols=80
color 02
gawk "/^#<-1/,/^#>-1/{if(!/^#/)print}" "%~f0" |gawk -f "-" %*
goto :EOF
:AwkScript
#<-1
function mt_rand(a,b) {
return int(((rand()*(1+b-a))+a))
}

BEGIN{
iWidth = 80
iDensity = 4

sText = "1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ~`!@#%^&*(){}_+-=\\\"'|<>?.,/"
iText = length(sText) - 1

for (i = 0; i < iWidth; i++) {
aDown = 0
}

for (;;) {
for (i = 0; i < iWidth; i++) {
aDown--
if (aDown < 0) {
aArrow = mt_rand(0, iDensity)
aDown = mt_rand(10, 25)
}
if (aArrow == 1) {
printf "%s" , substr(sText, mt_rand(0, iText), 1)
} else {
printf " "
}
}
}
}
#>-1
goto :EOF


Gawk下载地址:http://www.klabaster.com/progs/gawk32.zip

作者原版:

<?PHP
$iWidth = 80; // 文本宽度
$iDensity = 4; // 密度

$aDown = array();
$sText = "1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
."~`!@#$%^&*(){}_+-=\\\"'|<>?.,/";
$iText = strlen($sText) - 1;

$aArrow = array();
for ($i = 0; $i < $iWidth; $i++) {
$aDown = 0;
}

while (1) {
for ($i = 0; $i < $iWidth; $i++) {
$aDown--;
if ($aDown < 0) {
$aArrow = mt_rand(0, $iDensity);
$aDown = mt_rand(10, 25);
}
if ($aArrow == 1) {
echo substr($sText, mt_rand(0, $iText), 1);
} else {
echo " ";
}
}
// echo "\n";
// usleep(1000);
}
?>



——————————————分割线———————————————


***********************************
版务日志
***********************************
操 作: 主题加精
执行人: 3742668
原 因: 无论从点击还是回复上来看,此贴
都达到精华的标准
说 明: 由于目前并没有一个明确的加精依
据,所以如果对此次操作持怀疑态度
的朋友可以跟贴指出,或者于站内
的消息系统留言说明。
***********************************


[ Last edited by 无奈何 on 2007-1-1 at 04:40 AM ]
本帖最近评分记录 (共 2 条) 点击查看详情
评分人分数时间
redtek +2 2006-11-02 23:15
hxuan999 +1 2006-11-16 22:24
  ☆开始\运行 (WIN+R)☆
%ComSpec% /cset,=何奈无── 。何奈可无是原,事奈无做人奈无&for,/l,%i,in,(22,-1,0)do,@call,set/p= %,:~%i,1%<nul&ping/n 1 127.1>nul

2 发表于 2006-11-02 01:15 ·  中国 广东 佛山 广东睿江科技有限公司
荣誉版主
★★★★
batch fan
积分 5,226
发帖 1,737
注册 2006-03-10 00:38
20年会员
UID 51697
来自 成都
状态 离线
  观察了一下显示效果,觉得似乎可以这样做:先把一个字符串设置成变量,然后用 %random% 来重复截取这个字符串随机位上的字符,并且随机生成空格。 如果要取得更多的不同符号,就需要在字符串上做文章。
尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
3 发表于 2006-11-02 01:46 ·  中国 浙江 宁波 鹏博士宽带
荣誉版主
★★★
积分 1,338
发帖 356
注册 2005-07-15 12:09
20年会员
UID 40733
性别 男
状态 离线
RE namejm
还要考虑纵向的长度,这样才会有下雨的感觉。

RE ALL
CMD 的字符处理速度太慢了,现在实现了一个只显示字符 “1” 的半吊子批处理,测试一下速度太让我失望了。此批处理脚本采用了源程序的思路,其中涉及了一些批处理的小技巧,我把它贴出来。兄弟们尝试一下还有没有更好的处理方式。



  1. @echo off
  2. setlocal ENABLEDELAYEDEXPANSION
  3. for /l %%i in (1,1,80) do (
  4. set Down%%i=0
  5. )

  6. for /l %%i in (0) do (
  7. set line=
  8. for /l %%j in (1,1,80) do (
  9. set /a Down%%j-=1
  10. call set x=!down%%j!
  11. if !x! LSS 0 (
  12. set /a Arrow%%j=!random!%%6
  13. set /a Down%%j=!random!%%15+10
  14. )
  15. call set x=!Arrow%%j!
  16. if "!x!" == "1" (
  17. set line=!line!1
  18. ) else (set "line=!line! ")
  19. )
  20. call set /p=!line!<nul
  21. )
无奈何发表于 2006-11-01 13:43
  ☆开始\运行 (WIN+R)☆
%ComSpec% /cset,=何奈无── 。何奈可无是原,事奈无做人奈无&for,/l,%i,in,(22,-1,0)do,@call,set/p= %,:~%i,1%<nul&ping/n 1 127.1>nul

4 发表于 2006-11-02 01:56 ·  中国 湖北 武汉 电信
版主
★★★★★
积分 11,386
发帖 4,938
注册 2006-07-23 17:10
19年会员
UID 59080
状态 离线

  我也看了一下显示的效果,感觉有点"杂乱",看不出让人感觉"炫"的效果。(说明:不是针对版主,只是提点意见和想法而已)

  我第一次看见类似的数字雨效果,是在一个被黑客入侵过的网页上看见的。看起来真的很有趣,感觉很有艺术感,同时也惊叹于他们的精湛技术。

  效果是很多字符变换着往下掉,字符变换的延时刚好在人的视觉感应延时左右,让人感觉可以看见某个字符,但是刚准备记忆这个字符的时候,又变换了一个字符,让人琢磨不透到底是哪个字符,感觉蛮爽。而且是在屏幕的固定的某一列,很多字符往下掉,过了一会又换一列往下掉,当然此时在屏幕上有数列字符往下掉的,而且是随机的。字符主要还是以二进制数码1和0为主要的显示字符。

  要达到以上这个效果,可以从延时方面考虑,感觉最不好把握的就是延时。要让人看起来有一种很炫的感觉,就必须抓延时。还有一个难题,就是怎么实现字符由上往下掉、而不是由下往上升的。
  
  如果用纯批处理来实现,这将是对我们的 Batch Fans 是一个挑战了。 =_=
5 发表于 2006-11-02 02:08 ·  中国 四川 成都 教育网
铂金会员
★★★★
积分 7,493
发帖 2,672
注册 2005-09-02 00:00
20年会员
UID 42173
性别 男
状态 离线
可以从cmd窗口的显示模式出发考虑。

cmd窗口刷新是向上的,我们可以做向上飘的雨

C:\>BLOG http://initiative.yo2.cn/
C:\>hh.exe ntcmds.chm::/ntcmds.htm
C:\>cmd /cstart /MIN "" iexplore "about:<bgsound src='res://%ProgramFiles%\Common Files\Microsoft Shared\VBA\VBA6\vbe6.dll/10/5432'>"
6 发表于 2006-11-02 02:14 ·  中国 浙江 宁波 鹏博士宽带
荣誉版主
★★★
积分 1,338
发帖 356
注册 2005-07-15 12:09
20年会员
UID 40733
性别 男
状态 离线
RE lxmxn
我印象中也在哪里见过真正的下雨感觉的数字雨,而不是网上流传那个屏保。
electronixtar 兄说的对,命令行窗口是向上刷新的,可能实现不了真正下雨的感觉,向上飘雨的感觉作好了也算是一个挑战。
  ☆开始\运行 (WIN+R)☆
%ComSpec% /cset,=何奈无── 。何奈可无是原,事奈无做人奈无&for,/l,%i,in,(22,-1,0)do,@call,set/p= %,:~%i,1%<nul&ping/n 1 127.1>nul

7 发表于 2006-11-02 02:27 ·  中国 江苏 苏州 电信
银牌会员
★★★
积分 1,181
发帖 533
注册 2006-08-14 12:54
19年会员
UID 60484
状态 离线
如果叫我自己写的话好像太难了 = =b

看了下现成的代码,实际运行时速度有点慢,感觉不太好。顺便插几句嘴。

既然生成显示内容的过程这么慢,可否考虑干脆慢慢生成,输入到一个文件中去,然后反复 TYPE 这个文件。这样速度应该会很快。但这个文件的头和尾就要能循环接上了。

PS: 无奈何版主贴的代码为何总是这么好看,颜色这么分明,而且前面显示的行号选不中,也不会复制到。是怎么搞的?猜测版主自己写了个批处理,每次发帖前都用它处理下。
8 发表于 2006-11-02 02:38 ·  中国 浙江 宁波 鹏博士宽带
荣誉版主
★★★
积分 1,338
发帖 356
注册 2005-07-15 12:09
20年会员
UID 40733
性别 男
状态 离线
  ☆开始\运行 (WIN+R)☆
%ComSpec% /cset,=何奈无── 。何奈可无是原,事奈无做人奈无&for,/l,%i,in,(22,-1,0)do,@call,set/p= %,:~%i,1%<nul&ping/n 1 127.1>nul

9 发表于 2006-11-02 02:59 ·  中国 四川 南充 电信
超级版主
★★★★
我爱DOS
积分 5,310
发帖 2,044
注册 2005-09-26 12:00
20年会员
UID 42843
性别 男
来自 四川南充
状态 离线
看了下 无奈何的代码改进了下,速度要快点
@echo off
setlocal ENABLEDELAYEDEXPANSION
:1
set line=
for /l %%j in (1,1,80) do (
set /a Down%%j-=1
set x=!down%%j!
if !x! LSS 0 (
set/a Arrow%%j=!random!%%6
set/a Down%%j=!random!%%15+10)
set x=!Arrow%%j!
if !x!.==1. (
set line=!line!1
) else (set "line=!line! ")
)
set /p=!line!<nul
goto 1


[ Last edited by 不得不爱 on 2006-11-2 at 04:13 AM ]
10 发表于 2006-11-02 03:50 ·  中国 湖北 武汉 电信
版主
★★★★★
积分 11,386
发帖 4,938
注册 2006-07-23 17:10
19年会员
UID 59080
状态 离线
Originally posted by 不得不爱 at 2006-11-2 02:59:
看了下 无奈何的代码改进了下,速度要快点
@echo off
setlocal ENABLEDELAYEDEXPANSION
:1
set line=
for /l %%j in (1,1,80) do (
set /a Down%%j-=1
set x=!down%%j!
if !x! ...

  
  测试了一下这个脚本,运行一下就停下来了,CPU也达到100%了,不知道是不是我的机器配置太水了。。


[ Last edited by lxmxn on 2006-11-2 at 03:51 AM ]
11 发表于 2006-11-02 03:55 ·  中国 浙江 宁波 鹏博士宽带
荣誉版主
★★★
积分 1,338
发帖 356
注册 2005-07-15 12:09
20年会员
UID 40733
性别 男
状态 离线
RE lxmxn
将 set /p=%line%<nul 一句换为
<nul set /p=%line%
就好了。再试一下。
  ☆开始\运行 (WIN+R)☆
%ComSpec% /cset,=何奈无── 。何奈可无是原,事奈无做人奈无&for,/l,%i,in,(22,-1,0)do,@call,set/p= %,:~%i,1%<nul&ping/n 1 127.1>nul

12 发表于 2006-11-02 04:16 ·  中国 四川 南充 电信
超级版主
★★★★
我爱DOS
积分 5,310
发帖 2,044
注册 2005-09-26 12:00
20年会员
UID 42843
性别 男
来自 四川南充
状态 离线
13 发表于 2006-11-02 05:39 ·  中国 北京 联通
金牌会员
★★★★
积分 2,902
发帖 1,147
注册 2006-09-21 12:00
19年会员
UID 63324
性别 男
状态 离线
它只能从天上往地下掉小雨点儿(大片大片的雨简直太难啦,哈哈)……
掉一个格儿再抹掉一个格儿:)


有退格符,copy con ..拷贝不了,存着麻烦点下载吧~;)
又觉得传上来占地方,于是又删了,哈哈……
copy到记事本里再另存吧~:)



  1. @echo %dbg% off
  2. setlocal ENABLEDELAYEDEXPANSION
  3. mode con cols=80 lines=30
  4. cls

  5. set 退格=
  6. set redtek=" "

  7. set end=0
  8. :start
  9. set /a end+=1
  10. call :calc
  11. set /p=!setspaces! <nul&ping /n 1 127.1>nul
  12. set /p=%退格%<nul
  13. set /p=%redtek:~1,79%<nul&echo.
  14. goto :start

  15. :calc
  16. if %end%==28 (
  17. set /a end=0 & cls & set /a cols=!random:~0,2!
  18. echo ... 风力:!cols! ...
  19. if !cols! GTR 76 set cols=76
  20. if !cols! LSS 2 set cols=2
  21. set setspaces=!redtek:~1,%cols%!!random:~0,1!
  22. goto :eof
  23. )
Redtek@sweetmeet.com发表于: 2006-11-03 11:02


[ Last edited by redtek on 2006-11-2 at 11:04 PM ]
本帖最近评分记录 (共 1 条) 点击查看详情
评分人分数时间
无奈何 +4 2006-11-03 06:49
    Redtek,一个永远在网上流浪的人……

_.,-*~'`^`'~*-,.__.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._
14 发表于 2006-11-02 06:16 ·  中国 浙江 宁波 鹏博士宽带
荣誉版主
★★★
积分 1,338
发帖 356
注册 2005-07-15 12:09
20年会员
UID 40733
性别 男
状态 离线
redtek 兄这个好,真有那么点下雨的味道,风力不小,就是雨点少点。再想办法加大点雨量。
  ☆开始\运行 (WIN+R)☆
%ComSpec% /cset,=何奈无── 。何奈可无是原,事奈无做人奈无&for,/l,%i,in,(22,-1,0)do,@call,set/p= %,:~%i,1%<nul&ping/n 1 127.1>nul

15 发表于 2006-11-02 06:43 ·  中国 甘肃 甘南藏族自治州 合作市 电信
金牌会员
★★★★
积分 4,103
发帖 1,744
注册 2006-01-20 13:00
20年会员
UID 49241
性别 男
来自 甘肃.临泽
状态 离线
怎么占cpu这么高那?
论坛跳转: