Board logo

标题: [特效代码] 【挑战】用批处理画出正方形和抛物线 [打印本页]

作者: myzwd    时间: 2009-3-1 19:25     标题: 【挑战】用批处理画出正方形和抛物线

题1******
要求:1---以圆点“.”,全屏模式,在cmd的中央显示正方形
           2--在程序运行时,要求顺时针,逐渐的显示点运动的轨迹
题2******
要求:1---画出函数y=x^2(x>0) 的图像。
           2--程序运行时,以点的形式,逐渐的显示画图轨迹。
-------------------------------------------------------------------------------------
     此题确实很有难度,不适合新手来完成,因此移至本版块,并修改
了标题,事先未来得及和楼主商量,还请楼主谅解。
                                                                      ----------batman----------
-------------------------------------------------------------------------------------
  1. @echo off&setlocal enabledelayedexpansion&color 0A &cls
  2. rem by myzwd 2009 -3 -10
  3. rem  逆时针描点正方形
  4. :main
  5. set "sp=        "
  6. set "sp1=       "
  7. set "sp2=             "
  8. call:1
  9. goto:eof
  10. :1 向上运动
  11. for /l %%i in (1 1 8) do (
  12. set /a n+=1
  13. set /a m=8-!n!
  14. for /l %%i in (1 1 7) do echo.
  15. for /l %%i in (!m! -1 1) do (echo. !sp!)
  16. for /l %%i in (1 1 !n!) do (echo !sp!a)
  17. echo.
  18. echo ----------------------------
  19. for /l %%1 in (1 1 200) do (call echo.>nul)
  20. cls
  21. )
  22. :2 向左运动
  23. for /l %%i in (1 1 8) do (
  24.    for /l %%i in (1 1 7) do echo.
  25.    set aa=!aa! a
  26.    set /p "=!sp1!!aa!"<nul
  27.    echo.
  28.    for /l %%i in (1 1 7) do (echo !SP!a)
  29. echo.
  30. echo ----------------------------
  31. for /l %%1 in (1 1 200) do (call echo.>nul)
  32. cls
  33. )
  34. :3  向下运动
  35. set n=
  36. set m=
  37. for /l %%i in (1 1 8) do (set cc=!cc!a )
  38. for /l %%i in (1 1 7) do (
  39.   for /l %%i in (1 1 7) do echo.
  40.   echo !sp!!cc!
  41.   set /a n+=1
  42.   set /a m=7-!n!
  43.   for /l %%i in (1 1 !n!) do (echo !sp!a!sp2!a)
  44.   for /l %%i in  (1 1 !m!) do (echo !sp!a)
  45.   echo.
  46. echo ----------------------------
  47. for /l %%1 in (1 1 200) do (call echo.>nul)
  48. cls
  49. )
  50. :4 向右运动
  51. set "sp=          "
  52. set "sp2=             "
  53. set "sp5=        "
  54. set n=
  55. set cc=
  56. for /l %%i in (1 1 8) do (set cc=!cc!a )
  57. for /l %%i in (1 1 16) do (set "sp3=   !sp2!")
  58. for /l %%i in (1 1 8) do (
  59.   for /l %%i in (1 1 7) do echo.
  60.   set /a n+=2&set /a "n1=!n!>>1"
  61.   echo !sp5!!cc!
  62.   for /l %%i in (1 1 6) do (set "sp4=!sp5!a   !sp!a"&echo !sp4!)
  63.   call set /p "=!sp5!%%sp3:~0,-!n!%%"<nul
  64.   for /l %%i in (1 1 !n1!) do (set /p=a<nul )
  65.   echo.&echo.
  66. echo ----------------------------
  67. for /l %%1 in (1 1 180) do (call echo.>nul)
  68. cls
  69. )
  70. :The End
  71. for /l %%i in (1 1 7) do echo.
  72. echo !sp1! !cc!
  73. for /l %%i in (1 1 6) do (set "sp4= !sp1!a   !sp!a" &echo !sp4!)
  74. echo !sp1! !cc!
  75. echo ----------------------------
复制代码
  1. @echo off &setlocal enabledelayedexpansion &cls &color 1a
  2. for /l %%1 in (1 1 80) do set "space= !space!"
  3. mode con cols=80 lines=35
  4. rem 抛物线方程为--(y-16)*(y-16)=x edited by myzwd
  5. for /l %%i in (8 -1 1) do (
  6.   set y=%%i
  7.   set /a "x=y*y"
  8.   call echo %%space:~-!x!%%●
  9.   echo.
  10.   for /l %%1 in (1 1 30) do call echo.>nul
  11. )
  12. for /l %%i in (1 1 8) do (
  13.   set y=%%i
  14.   set /a "x=y*y"
  15.   call echo %%space:~-!x!%%●
  16.   echo.
  17.   for /l %%1 in (1 1 30) do call echo.>nul
  18. )
  19. pause
复制代码


说明:抛物线的画法主要是计算y坐标的增量。不是计算y坐标。

[ 本帖最后由 myzwd 于 2009-3-18 23:45 编辑 ]
作者: batman    时间: 2009-3-1 23:51

这题对新手来说是难了点。。。
作者: batman    时间: 2009-3-2 02:42

先发一个画正方形的,但没完成逐步显示这个步骤(左边竖边比较困难,还没想到好的办法),给大家做参考了:
  1. @echo off&setlocal enabledelayedexpansion
  2. set /p l=请输入正方形的边长(小于46的偶数):
  3. echo exit|%ComSpec% /k prompt e 100 B4 00 B0 12 CD 10 B0 03 CD 10 CD 20 $_g$_q$_|debug>nul
  4. chcp 437 >nul
  5. graftabl 936 >nul
  6. set /a g=l/2,kk=40-l/2
  7. for /l %%a in (1,1,%kk%) do set "kkk=!kkk! "
  8. echo.&echo.
  9. for /l %%a in (1,1,%g%) do (
  10.     set /p=%kkk%<nul&set "a="
  11.   for %%c in (1 %g%) do if %%a equ %%c set "a=a"
  12.     for /l %%b in (1,1,%l%) do (
  13.         set "_%%a-%%b= "
  14.         for %%d in (1 %l%) do if %%b equ %%d set "b=a"
  15.         if defined a (
  16.            set /p=.<nul
  17.            ) else (
  18.            if defined b (
  19.               set /p=.<nul&set "b="
  20.               ) else (
  21.               set /p= <nul
  22.            )
  23.         )
  24.     )
  25.     echo.
  26. )
  27. pause>nul
复制代码
ps:楼主出的题很有难度,不适合新手来完成,所以移至代码咨询区。

[ 本帖最后由 batman 于 2009-3-2 07:44 编辑 ]
作者: myzwd    时间: 2009-3-2 15:20     标题: 我运行了

我运行了,没成功
报告是:此时不因有‘do’
现在可以了 ok。

因为我不知道批处理能否办到,所以出了这个题目。没想到还真可以。我也学习学习。呵呵

[ 本帖最后由 myzwd 于 2009-3-3 23:08 编辑 ]
作者: Batcher    时间: 2009-3-2 15:33     标题: 回复 3楼 的帖子

我运行了,没有报错。
但是没有实现完全意义上的居中,因为代码没有判断屏幕的高度。
作者: batman    时间: 2009-3-4 08:38

原帖由 Batcher 于 2009-3-2 15:33 发表
我运行了,没有报错。
但是没有实现完全意义上的居中,因为代码没有判断屏幕的高度。

这是因为用代码根本没办法判断全屏的高度的,这是和显示器的高度有关的参数,不同型号的显示器上这个数值是不同的,所以就没有用代码进行计算了。。。
作者: Batcher    时间: 2009-3-4 16:40     标题: 回复 6楼 的帖子

高度也能获取^_^
http://bbs.bathome.net/thread-3582-1-1.html
作者: batman    时间: 2009-3-5 23:28

实现了逐步画图,但效果实在不怎么样:
  1. @echo off&setlocal enabledelayedexpansion
  2. set /p l=请输入正方形的边长(小于46的偶数):
  3. echo exit|%ComSpec% /k prompt e 100 B4 00 B0 12 CD 10 B0 03 CD 10 CD 20 $_g$_q$_|debug>nul
  4. chcp 437 >nul
  5. graftabl 936 >nul
  6. set /a g=l/2,kk=40-l/2,l1=l-1,g1=g-2,s1=l,s2=s1+g1,s3=s2+l
  7. for /l %%a in (1,1,%kk%) do set "kkk=!kkk! "
  8. for /l %%a in (1,1,%l1%) do set "k1=!k1! "
  9. echo.&echo.
  10. for /l %%a in (1,1,%l%) do set /a n+=1&set "_!n!=."
  11. for /l %%a in (1,1,%g1%) do set /a n+=1&set "_!n!=%k1%."
  12. for /l %%a in (1,1,%l%) do (
  13.     set /a a=l-%%a
  14.     for /l %%b in (1,1,!a!) do set "k2=!k2! "
  15.     for /l %%c in (1,1,%%a) do set ".=!.!."
  16.     set /a n+=1&set "_!n!=!k2!!.!"&set "k2="&set ".="
  17. )
  18. set /a n+=g1
  19. for /l %%a in (1,1,%n%) do (
  20.     for /l %%b in (1,1,%%a) do (
  21.         if %%b leq %s1% (
  22.            if %%b equ 1 set /p=%kkk%<nul>temp
  23.            set /p=!_%%b!<nul>>temp
  24.            if %%b equ %s1% echo.>>temp
  25.            ) else (
  26.            if %%b leq %s2% (
  27.               echo %kkk%!_%%b!>>temp
  28.               ) else (
  29.               if %%b leq %s3% (
  30.                  set /a a=kk+%%b
  31.                  for /l %%c in (1,1,!a!) do set /p= <nul>>temp
  32.                  set /p=%kkk%!_%%b!<nul>>temp
  33.               )
  34.            )
  35.          )
  36.     )
  37.     cls&type temp
  38.     if %%a gtr %s3% (
  39.        set /a a=s2+s3-%%a
  40.        for /l %%d in (%s2%,-1,!a!) do set "a=!_%%d!"&set "a=.!a:~1!"&set "_%%d=!a!"
  41.     )
  42. )
  43. pause>nul&del /q temp
复制代码

[ 本帖最后由 batman 于 2009-3-5 23:31 编辑 ]
作者: batman    时间: 2009-3-6 00:27

这次效果上没问题了(不用全屏):
  1. @echo off&setlocal enabledelayedexpansion
  2. set /p l=请输入正方形的边长(小于46的偶数):
  3. set /a g=l/2,kk=40-l/2,l1=l-1,g1=g-2,s1=l,s2=s1+g1,s3=s2+l
  4. for /l %%a in (1,1,%kk%) do set "kkk=!kkk! "
  5. for /l %%a in (1,1,%l1%) do set "k1=!k1! "
  6. for /l %%a in (1,1,%l%) do (
  7.     set /a n+=1&set "_!n!=."
  8.     set "str=!str!."
  9. )
  10. for /l %%a in (1,1,%g1%) do set /a n+=1&set "_!n!=%k1%."
  11. for /l %%a in (1,1,%l%) do (
  12.     set /a a=l-%%a
  13.     for /l %%b in (1,1,!a!) do set "k2=!k2! "
  14.     for /l %%c in (1,1,%%a) do set ".=!.!."
  15.     set /a n+=1&set "_!n!=!k2!!.!"&set "k2="&set ".="
  16. )
  17. set /a n+=g1
  18. for /l %%a in (1,1,%n%) do (
  19.     for /l %%b in (1,1,%%a) do (
  20.         if %%b leq %s1% (
  21.            if %%b equ 1 set /p=%kkk%<nul>temp
  22.            set /p=!_%%b!<nul>>temp
  23.            if %%b equ %s1% echo.>>temp
  24.            ) else (
  25.            if %%b leq %s2% (
  26.               echo %kkk%!_%%b!>>temp
  27.               ) else (
  28.               set "flag=a"
  29.               if %%b geq %s3% set "ok=a"  
  30.             )
  31.          )
  32.     )
  33.     if defined ok (
  34.        echo %kkk%%str%>>temp
  35.        ) else (
  36.        if defined flag echo %kkk%!_%%a!>>temp
  37.     )
  38.     for /l %%d in (1,1,50) do echo>nul
  39.     cls&type temp
  40.     if %%a gtr %s3% (
  41.        set /a a=s2+s3-%%a
  42.        for /l %%e in (%s2%,-1,!a!) do set "a=!_%%e!"&set "a=.!a:~1!"&set "_%%e=!a!"
  43.     )
  44. )
  45. pause>nul&del /q temp
复制代码

[ 本帖最后由 batman 于 2009-3-6 00:32 编辑 ]
作者: myzwd    时间: 2009-3-7 09:00     标题: 回复 9楼 的帖子

不错收藏了。挺好的,学习学习
作者: Batcher    时间: 2009-3-7 10:31     标题: 回复 10楼 的帖子

啥时候把你自己的代码拿出来跟他的比较一下?
作者: myzwd    时间: 2009-3-7 22:09     标题: 回复 11楼 的帖子

我真弄不出来。我都说了,我以为批处理做不出来。我是看了随风的那个小球后,才知道批处理可以做这些。
其实我学习批处理,就是一种业余爱好。还得多象你们学习。呵呵
作者: Batcher    时间: 2009-3-7 23:39     标题: 回复 12楼 的帖子

哦,原来如此。
不过,大家一般以出题的形式发帖时,通常都是自己有了完整的代码。
看来误解你的意思了^_^
作者: 523066680    时间: 2009-3-8 14:11

做的并不严密~  发出来了
  1. @echo off &setlocal enabledelayedexpansion
  2. set /p inp="1~46内的偶数: "
  3. set /a lx=inp/2,la=0,hx=lx,left=(80-inp)/2
  4. for /l %%a in (1,1,80) do (set k= !k!)
  5. set left=!k:~0,%left%!
  6. set "do=" &set "do2=::"
  7. :la
  8. set /a la+=1,lb=0
  9. if %la% gtr 1 (set "do=::" &set h%la%=!k:~-%inp%,-1!.)
  10. if %la% equ %lx% (set "do=")
  11. %do2% set /a lx-=1
  12. %do2% set h%lx%=.!h%lx%:~1!
  13.      :lb
  14. %do% set /a lb+=1
  15. %do% set h%la%=!h%la%!.
  16. %do% set h%la%=!h%la%:~-%inp%!
  17.      ping -n 1 127.1>nul
  18.      cls
  19.      for /l %%a in (1,1,%hx%) do echo,%left%!h%%a!
  20. %do% if %lb% lss %inp% (goto :lb) else (set lb=0)
  21. %do% if %la% equ %lx% (set "do=::" &set "do2=")
  22. if %lx% neq 0 goto :la
  23. pause
复制代码


我觉得改成+号会方一些~

[ 本帖最后由 523066680 于 2009-3-8 14:35 编辑 ]
作者: 523066680    时间: 2009-3-8 14:46

刚刚有想做y=x^2 的  不过想想又停止了
因为 x=5 的时候就飙到25行了~

如果是col=line^2 的话可能有看头。

哈哈 改来了, x=y^2的  感觉挺漂亮的
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. mode con cols=102 lines=25
  4. for /l %%a in (1,1,100) do (set k= !k!)
  5. for /l %%a in (-10,1,10) do (set h%%a=%k%)
  6. set la=-11
  7. :la
  8. set /a la+=1,lb=la*la,tlb=100-lb
  9. set h%la%=!h%la%:~%tlb%!.
  10. ping -n 1 127.1>nul
  11. cls
  12. for /l %%a in (-10,1,10) do echo,!h%%a!
  13. if %la% lss 10 goto :la
  14. pause
复制代码

[ 本帖最后由 523066680 于 2009-3-8 14:57 编辑 ]
作者: 随风    时间: 2009-3-9 20:07

批处理画方框
好久没用批处理写动画了,也来一个。。
:
  1. @echo off
  2. for /l %%a in (1 1 39) do call set "k= %%k%%"
  3. set /a m=100
  4. :start
  5. setlocal enabledelayedexpansion
  6. cls&echo.&echo.&echo.
  7. set/p=!k:~0,17!<nul
  8. for /l %%a in (1 1 20) do (
  9.    set/p= .<nul
  10.    set "n%%a=  !k:~2!"
  11.    set "yi=!yi! ."
  12.    call :yc !m!
  13. )
  14. echo.
  15. for /l %%a in (1 1 15) do echo !k:~0,17!!k!.&call :yc !m!
  16. set/p=!k:~0,17!!k!.<nul
  17. for /l %%a in (1 1 19) do set /p= .<nul&call :yc !m!
  18. echo.
  19. for /l %%i in (15 -1 1) do (
  20.   cls&echo.&echo.&echo.
  21.   echo !k:~0,17!!yi!
  22.   set n%%i= .!n%%i:~2!
  23.   for /l %%a in (1 1 15) do echo !k:~0,17!!n%%a!.
  24.   echo !k:~0,17!!yi!
  25.   call :yc !m!
  26. )
  27. echo.&echo.&endlocal&cls&call :yc 800&goto start
  28. :yc
  29.    for /l %%a in (1 1 %~1) do ver>nul
  30. goto :EOF
复制代码

作者: saber    时间: 2009-3-9 21:44

上面代码 很多都看不明呢
作者: 523066680    时间: 2009-3-10 17:17

我突然觉得调用函数可能会使代码短一些 果然如此

  1. @echo off &setlocal enabledelayedexpansion
  2. for /l %%a in (1,1,79) do (set k= !k!)
  3. for /l %%a in (1,1,23) do (set h%%a=%k%)
  4. set /p inp="输入高[2-23]: "
  5. set /a c=0,h=1,i2=inp*2,na=40-inp
  6. set stra=!k:~-%na%!
  7. for %%a in ("c + %i2%" "h + %inp%" "c - 1" "h - 1") do (call :func %%~a)
  8. pause>nul &exit
  9. :func
  10. set /a %1 %2 = 1,cf=c-1
  11. set h%h%=!h%h%:~0,%cf%!.!h%h%:~%c%!
  12. ping -n 1 127.1>nul &cls
  13. for /l %%a in (1,1,%inp%) do (echo,%stra%!h%%a:~0,-%na%!)
  14. if !%1! neq %3 goto :func
复制代码

[ 本帖最后由 523066680 于 2009-3-10 17:27 编辑 ]
作者: coolmir2    时间: 2009-3-11 04:08

唉,都是牛人啊,谁肯做我师傅啊
作者: Batcher    时间: 2009-3-11 09:11     标题: 回复 19楼 的帖子

教程才是最好的师傅。
遇到具体问题就来发帖提问,很多热心人会帮你的。
作者: 骚鸡    时间: 2009-3-14 12:53

好难哦。。。。。。。。。。。。。。。。学习中
作者: 523066680    时间: 2009-3-14 17:33

1.上面那位同学的用户名~。。。。。。

师傅嘛~    有一句话,师傅领进门,修行在个人~, 需要一个人引导罢了。



2.Yes!  在这里再次收集到 pusofalse  wxcute  batman  more 的加分了  我没有遗憾了!!!心情舒畅啊~

[ 本帖最后由 523066680 于 2009-3-15 12:04 编辑 ]
作者: terse    时间: 2009-3-15 17:19

原来有这么搞代码了  先前用笨办法写的  到第二边的时候定义  后面用它
  1. @echo off&setlocal enabledelayedexpansion&color a
  2. set/p n=请输入边长(最大37)
  3. set/a n1=n-2,n2=n*2-3,n3=76-n*2
  4. if %n3% leq 0 echo 输入超出范围&pause&exit
  5. mode con cols=80 lines=40
  6. for /l %%i in (1 1 79) do set "f= !f!"
  7.     for /l %%i in (1 1 %n%) do (
  8.         set "c=* !c!"
  9.         set/a t=%%i*2
  10.         call echo !f:~,5!%%c:~,!t!%%
  11.         for /l %%a in (1,1,200) do echo.>nul
  12.         cls
  13.     )
  14.         set str=!f:~,5!!c:~,-1!
  15.         if %n1% gtr 0 (
  16.         for /l %%i in (1 1 %n1%) do (
  17.             set/a x=n-%%i-1
  18.             set b!x!=!f:~,5!!c:~,-1!!var!
  19.             set var=!var!!f!*
  20.             set str=!f:~,5!*!f:~,%n2%!*!f:~,%n3%!!str!
  21.             set a%%i=!str!
  22.             echo !f:~,5!!c:~,-1!!var!!f!
  23.             for /l %%a in (1,1,200) do echo.>nul
  24.             cls      
  25.      ))
  26.          for /l %%i in (1 1 %n%) do (
  27.             cls
  28.             set/a t=%%i*2
  29.             call echo !f:~,5!!c:~,-1!!var!  %%f:~,-!t!%%%%c:~-!t!%%
  30.             for /l %%a in (1,1,200) do echo.>nul
  31.             
  32.      )
  33.          if %n1% gtr 0 (
  34.          for /l %%i in (1 1 %n1%) do (
  35.             cls
  36.             echo !b%%i!
  37.             echo !a%%i!
  38.             for /l %%a in (1,1,200) do echo.>nul
  39.      ))
  40. pause>nul
复制代码

作者: myzwd    时间: 2009-3-19 09:03     标题: 回复 18楼 的帖子

我好好学习学习这段代码。看看是怎么编辑的。
作者: 523066680    时间: 2009-3-22 14:43

大概以前想到这个的,因为曾经写过
随机游动粒子 http://www.cn-dos.net/forum/viewthread.php?tid=43059
所以对描点的效果,应该算比较熟悉了。

另外,我觉得在特效的流畅方面,可以跟随风取经。
我嘛,作品全在签名的链接里了,感兴趣的话可以看看。

[ 本帖最后由 523066680 于 2009-3-22 14:45 编辑 ]




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