中国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” 的半吊子批处理,测试一下速度太让我失望了。此批处理脚本采用了源程序的思路,其中涉及了一些批处理的小技巧,我把它贴出来。兄弟们尝试一下还有没有更好的处理方式。
  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 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 楼』:  





  ☆开始\运行 (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 ]




2006-11-2 02:59
查看资料  发送邮件  发短消息 网志   编辑帖子
lxmxn
版主




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

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楼代码更新了




2006-11-2 04:16
查看资料  发送邮件  发短消息 网志   编辑帖子
redtek
金牌会员





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

它只能从天上往地下掉小雨点儿(大片大片的雨简直太难啦,哈哈)…… 掉一个格儿再抹掉一个格儿:) 有退格符,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 ]


   此帖被 +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]  >>   >
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


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



论坛跳转: