Board logo

标题: 【出题】显示移动文字的批处理函数 [打印本页]

作者: plp626    时间: 2011-5-8 13:56     标题: 【出题】显示移动文字的批处理函数

本帖最后由 plp626 于 2011-5-9 20:02 编辑

下面代码保存为test.html
  1. <HTML>
  2.   <BODY>
  3. <marquee scrollamount=10 width=200  behavior=scroll>bbs.bathome.net</marquee> <P>
  4. <marquee scrollamount=5 width=200  behavior=alternate>bbs.bathome.net</marquee> <P>
  5.                 <marquee scrollamount=15 width=200  behavior=slide>bbs.bathome.net</marquee>
  6.   </BODY>
  7. </HTML>
复制代码
现在用批处理分别实现上面scroll,alternate,slide三个效果:
  1. call:marquee "scrollamount=10 width=200  behavior=scroll" "bbs.bathome.net"
复制代码
  1. call:marquee "scrollamount=5 width=200  behavior=alternate" "bbs.bathome.net"
复制代码
  1. call:marquee "scrollamount=15 width=200  behavior=slide" "bbs.bathome.net"
复制代码
移动文字通用函数,要求代码短小者为佳
  1. :marquee <"属性"> <"字符串">
  2. rem 等待你的实现。。。。
  3. goto:eof
复制代码
还有好多属性有待实现,比如:
  1. <HTML>
  2.   <BODY>
  3.       <marquee scrollamount=5 width=400  direction=left>bbs.bathome.net</marquee> <P>
  4.       <marquee scrollamount=10 width=400  direction=right>bbs.bathome.net</marquee> <P>
  5.       <marquee scrollamount=15 width=400  direction=down>bbs.bathome.net</marquee> <P>
  6.       <marquee scrollamount=20 width=400  direction=up>bbs.bathome.net</marquee> <P>
  7.   </BODY>
  8. </HTML>
复制代码
先看看大家的热情程度。
============================================
2011-5-9修订:
对于函数传递参数的格式不做硬性规定,

可以
  1. call:marquee "scrollamount=15 width=200  behavior=slide" "bbs.bathome.net"
复制代码
也可以
  1. ::主要是考虑到字符串作为值传递的很多缺陷,所以鼓励大家引用调用(将字符串保持在变量内,把变量名传递到函数体内)
  2. ::用逗号隔开属性值的方式,是考虑到cmd中set/a的特性,方便赋值。
  3. set str=bbs.bathome.net
  4. call:marquee "scrollamount=15, width=200, behavior=slide" str
复制代码
初衷是:让调用者觉得方便,同时又让函数的实现代码尽量简短(这个函数无需考虑效率问题)
============================================
看到大家有在函数内部求字符串长度的“操作”,我的观点是在参数传递时,可以把字符串的长度作为参数传递过去,这样可以保持marquee函数功能的单一,最大限度做到函数的复用。
  1. set Mystr=bbs.bathome.net
  2. call:strlen Mystr len
  3. call:marquee "scrollamount=10, width=200, behavior=slide" Mystr len
复制代码
不用过于拘泥于上面的参数格式(上面的调用格式仅是我的做法),我主要看有没有更好的方式以及精简的代码

(大家还可以将三个效果用三个函数分别实现)
作者: CrLf    时间: 2011-5-8 22:18

本帖最后由 zm900612 于 2011-5-9 12:55 编辑

不是很擅长特效,也没怎么思考过其中的技巧,所以写得比较复杂
  1. @echo off
  2. set /a 耗时=10,宽=40
  3. set /p call=1、scroll  2、alternate  3、slide(Current) ^
  4.    Your Choice:[.]
  5. if "%call%"=="1" call:marquee "scrollamount=%耗时% width=%宽%  behavior=scroll" "bbs.bathome.net"
  6. if "%call%"=="2" call:marquee "scrollamount=%耗时% width=%宽%  behavior=alternate" "bbs.bathome.net"
  7. call:marquee "scrollamount=%耗时% width=%宽%  behavior=slide" "bbs.bathome.net"
  8. :marquee
  9. setlocal enabledelayedexpansion
  10. title %*
  11. for /f "skip=4 tokens=2" %%a in ('mode con') do if not defined cols set cols=%%a
  12. for /f "tokens=1-3" %%a in (%1) do set %%c&set /a %%a,%%b
  13. if %behavior%==slide set sl=::
  14. set "$=%~2#"
  15. set len=&for %%a in (128 64 32 16 8 4 2 1)do if !$:~%%a^,1!. NEQ . set/a len+=%%a&set $=!$:~%%a!
  16. set th=【此处替换为制表符tab】
  17. for /l %%a in (0 %cols% %width%) do echo;&set th=!th!
  18. set "sr=%~2"
  19. for /l %%a in (1 1 %width%) do set "sr= !sr!"
  20. set k=!sr:~0,%width%!&set xh=!sr:~-%width%!
  21. (if not %behavior%==alternate for /l %%a in (1 1 %len%) do (
  22. echo !th! !k:~0,-%%a!!xh:~-%len%,%%a!
  23. for /l %%b in (-%scrollamount%00 5) do cd.
  24. )) 2>nul
  25. if %behavior% neq scroll set /a "width-=len"
  26. %sl% (set /a width-=1
  27. %sl% for /l %%a in (1 %behavior:slide=%1 1) do (
  28. for /l %%b in (1 1 %width%) do (
  29. echo !th! !xh:~%%b!!xh:~0,%%b!
  30. for /l %%b in (-%scrollamount%00 5) do cd.
  31. )
  32. %sl% if !behavior! neq scroll for /l %%b in (!width! -1) do (
  33. %sl% echo !th! !xh:~%%b!!xh:~0,%%b!
  34. %sl% for /l %%b in (-%scrollamount%00 5) do cd.)
  35. %sl%)) 2>nul
  36. endlocal
  37. pause>nul
复制代码
修改了下,代码更飘逸,思路更严谨
作者: 523066680    时间: 2011-5-8 22:40

歌词:“一切也只是曾经”
恩,不过跟效果有关的,比较多路数。帖子一出总有机会看到新颖的思路。
作者: CrLf    时间: 2011-5-8 22:47

刚才笔误了,不是退格符,是制表符,也就是tab
作者: 523066680    时间: 2011-5-8 23:39

本帖最后由 523066680 于 2011-5-8 23:44 编辑

函数的
调用的时候发送一个数字保持一直在增加的那种……
如果改成函数自己每次平移一下,函数中加个变量作记录也可以。
第三行那个没动作,没细看,没做。
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set spec=bbs.bathome.net
  4. call :countlength
  5. for /l %%a in (1,1,100) do (set "s100= !s100!")
  6. for /l %%a in (1,1,100) do (
  7. for /l %%A in (1,1,300) do (echo >nul)
  8. cls
  9. call :run %spec% %%a 20
  10. call :LR %spec% %%a 20
  11. )
  12. pause
  13. :: $str $move $range
  14. :run
  15. set /a move=%2 %% (%3+len)
  16. set result=!s100:~0,%3!%1%s100%
  17. set result=!result:~%move%,%3!
  18. echo,%result%
  19. goto :eof
  20. :LR
  21. set /a spacerange=%3-len,move=spacerange - ( %2 %% (spacerange*2) +1)
  22. set move=%move:-=%
  23. set result=!s100:~0,%move%!%1
  24. echo %result%
  25. goto :eof
  26. :countlength
  27. set str=%1
  28. for /l %%a in (1,1,1000) do (
  29. if "!spec:~%%a!"=="" (
  30. set /a len=%%a &&goto :eof
  31. )
  32. )
复制代码

作者: terse    时间: 2011-5-13 19:39

特效  523066680兄的强项




欢迎光临 批处理之家 (http://bathome.net./) Powered by Discuz! 7.2