中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [推荐][挑战思路]用脚本模拟黑客帝国数码雨
« [1] [2] [3] [4] [5] »
作者:
标题: [推荐][挑战思路]用脚本模拟黑客帝国数码雨 上一主题 | 下一主题
无奈何
荣誉版主





积分 1338
发帖 356
注册 2005-7-15
状态 离线
『楼 主』:  [推荐][挑战思路]用脚本模拟黑客帝国数码雨

近日看到一段用 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[i] = 0
}

for (;;) {
        for (i = 0; i < iWidth; i++) {
                aDown[i]--
                if (aDown[i] < 0) {
                        aArrow[i] = mt_rand(0, iDensity)
                        aDown[i] = mt_rand(10, 25)
                }
                if (aArrow[i] == 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[$i] = 0;
}

while (1) {
    for ($i = 0; $i < $iWidth; $i++) {
        $aDown[$i]--;
        if ($aDown[$i] < 0) {
            $aArrow[$i] = mt_rand(0, $iDensity);
            $aDown[$i] = mt_rand(10, 25);
        }
        if ($aArrow[$i] == 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 ]

   此帖被 +3 点积分      点击查看详情   
评分人:【 redtek 分数: +2  时间:2006-11-2 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

2006-11-1 23:47
查看资料  发送邮件  发短消息 网志  OICQ (105400208)  编辑帖子
namejm
荣誉版主

batch fan


积分 5226
发帖 1737
注册 2006-3-10
来自 成都
状态 离线
『第 2 楼』:  

  观察了一下显示效果,觉得似乎可以这样做:先把一个字符串设置成变量,然后用 %random% 来重复截取这个字符串随机位上的字符,并且随机生成空格。 如果要取得更多的不同符号,就需要在字符串上做文章。



尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
2006-11-2 01:15
查看资料  发短消息 网志   编辑帖子
无奈何
荣誉版主





积分 1338
发帖 356
注册 2005-7-15
状态 离线
『第 3 楼』:  

RE  namejm
还要考虑纵向的长度,这样才会有下雨的感觉。

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

  Quote:

  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

2006-11-2 01:46
查看资料  发送邮件  发短消息 网志  OICQ (105400208)  编辑帖子
lxmxn
版主




积分 11386
发帖 4938
注册 2006-7-23
状态 离线
『第 4 楼』:  


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

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

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

  要达到以上这个效果,可以从延时方面考虑,感觉最不好把握的就是延时。要让人看起来有一种很炫的感觉,就必须抓延时。还有一个难题,就是怎么实现字符由上往下掉、而不是由下往上升的。
  
  如果用纯批处理来实现,这将是对我们的 Batch Fans 是一个挑战了。  =_=


2006-11-2 01:56
查看资料  发送邮件  发短消息 网志   编辑帖子
electronixtar
铂金会员





积分 7493
发帖 2672
注册 2005-9-2
状态 离线
『第 5 楼』:  

可以从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'>"
2006-11-2 02:08
查看资料  发送邮件  发短消息 网志   编辑帖子
无奈何
荣誉版主





积分 1338
发帖 356
注册 2005-7-15
状态 离线
『第 6 楼』:  

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

2006-11-2 02:14
查看资料  发送邮件  发短消息 网志  OICQ (105400208)  编辑帖子
NaturalJ0
银牌会员




积分 1181
发帖 533
注册 2006-8-14
状态 离线
『第 7 楼』:  

如果叫我自己写的话好像太难了 = =b

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

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

PS: 无奈何版主贴的代码为何总是这么好看,颜色这么分明,而且前面显示的行号选不中,也不会复制到。是怎么搞的?猜测版主自己写了个批处理,每次发帖前都用它处理下。

2006-11-2 02:27
查看资料  发短消息 网志   编辑帖子
无奈何
荣誉版主





积分 1338
发帖 356
注册 2005-7-15
状态 离线
『第 8 楼』:  

RE NaturalJ0
看一下这个帖子。
[原创]批处理代码发帖着色脚本 Batch2ubb(CMD & GAWK)




  ☆开始\运行 (WIN+R)☆
%ComSpec% /cset,=何奈无── 。何奈可无是原,事奈无做人奈无&for,/l,%i,in,(22,-1,0)do,@call,set/p= %,:~%i,1%<nul&ping/n 1 127.1>nul

2006-11-2 02:38
查看资料  发送邮件  发短消息 网志  OICQ (105400208)  编辑帖子
不得不爱
超级版主

我爱DOS


积分 5310
发帖 2044
注册 2005-9-26
来自 四川南充
状态 离线
『第 9 楼』:  

看了下 无奈何的代码改进了下,速度要快点
@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 ]



我的网络U盘 我的网络第2个U盘
论坛软件下载链接
灵雨飘零论坛  
论坛新手必读,所有人的基本行为准则
刷QQ空间人气、留言的小软件
2006-11-2 02:59
查看资料  发送邮件  发短消息 网志   编辑帖子
lxmxn
版主




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



  Quote:
Originally posted by 不得不爱 at 2006-11-2 02:59:
看了下 无奈何的代码改进了下,速度要快点
[code]@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 ]

2006-11-2 03:50
查看资料  发送邮件  发短消息 网志   编辑帖子
无奈何
荣誉版主





积分 1338
发帖 356
注册 2005-7-15
状态 离线
『第 11 楼』:  

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

2006-11-2 03:55
查看资料  发送邮件  发短消息 网志  OICQ (105400208)  编辑帖子
不得不爱
超级版主

我爱DOS


积分 5310
发帖 2044
注册 2005-9-26
来自 四川南充
状态 离线
『第 12 楼』:  

晕,如果把set /p=%line%<nul 改成set /p=!line!<nul也没有问题,9楼代码更新了



我的网络U盘 我的网络第2个U盘
论坛软件下载链接
灵雨飘零论坛  
论坛新手必读,所有人的基本行为准则
刷QQ空间人气、留言的小软件
2006-11-2 04:16
查看资料  发送邮件  发短消息 网志   编辑帖子
redtek
金牌会员





积分 2902
发帖 1147
注册 2006-9-21
状态 离线
『第 13 楼』:  

它只能从天上往地下掉小雨点儿(大片大片的雨简直太难啦,哈哈)……
掉一个格儿再抹掉一个格儿:)


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

  Quote:

  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 ]

   此帖被 +4 点积分     点击查看详情   
评分人:【 无奈何 分数: +4  时间:2006-11-3 06:49




    Redtek,一个永远在网上流浪的人……

_.,-*~'`^`'~*-,.__.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._
2006-11-2 05:39
查看资料  发送邮件  发短消息 网志   编辑帖子
无奈何
荣誉版主





积分 1338
发帖 356
注册 2005-7-15
状态 离线
『第 14 楼』:  

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

2006-11-2 06:16
查看资料  发送邮件  发短消息 网志  OICQ (105400208)  编辑帖子
vkill
金牌会员





积分 4103
发帖 1744
注册 2006-1-20
来自 甘肃.临泽
状态 离线
『第 15 楼』:  

怎么占cpu这么高那?

2006-11-2 06:43
查看资料  发送邮件  访问主页  发短消息 网志   编辑帖子
« [1] [2] [3] [4] [5] »
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


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



论坛跳转: