标题: [特效代码] 【挑战】用批处理画出正方形和抛物线 [打印本页]
作者: myzwd 时间: 2009-3-1 19:25 标题: 【挑战】用批处理画出正方形和抛物线
题1******
要求:1---以圆点“.”,全屏模式,在cmd的中央显示正方形
2--在程序运行时,要求顺时针,逐渐的显示点运动的轨迹
题2******
要求:1---画出函数y=x^2(x>0) 的图像。
2--程序运行时,以点的形式,逐渐的显示画图轨迹。
-------------------------------------------------------------------------------------
此题确实很有难度,不适合新手来完成,因此移至本版块,并修改
了标题,事先未来得及和楼主商量,还请楼主谅解。
----------batman----------
-------------------------------------------------------------------------------------
-
- @echo off&setlocal enabledelayedexpansion&color 0A &cls
- rem by myzwd 2009 -3 -10
- rem 逆时针描点正方形
- :main
- set "sp= "
- set "sp1= "
- set "sp2= "
-
- call:1
- goto:eof
- :1 向上运动
- for /l %%i in (1 1 8) do (
- set /a n+=1
- set /a m=8-!n!
- for /l %%i in (1 1 7) do echo.
- for /l %%i in (!m! -1 1) do (echo. !sp!)
- for /l %%i in (1 1 !n!) do (echo !sp!a)
- echo.
- echo ----------------------------
- for /l %%1 in (1 1 200) do (call echo.>nul)
- cls
- )
- :2 向左运动
- for /l %%i in (1 1 8) do (
- for /l %%i in (1 1 7) do echo.
- set aa=!aa! a
- set /p "=!sp1!!aa!"<nul
- echo.
- for /l %%i in (1 1 7) do (echo !SP!a)
- echo.
- echo ----------------------------
- for /l %%1 in (1 1 200) do (call echo.>nul)
- cls
- )
- :3 向下运动
- set n=
- set m=
- for /l %%i in (1 1 8) do (set cc=!cc!a )
- for /l %%i in (1 1 7) do (
- for /l %%i in (1 1 7) do echo.
- echo !sp!!cc!
- set /a n+=1
- set /a m=7-!n!
- for /l %%i in (1 1 !n!) do (echo !sp!a!sp2!a)
- for /l %%i in (1 1 !m!) do (echo !sp!a)
- echo.
- echo ----------------------------
- for /l %%1 in (1 1 200) do (call echo.>nul)
- cls
- )
- :4 向右运动
- set "sp= "
- set "sp2= "
- set "sp5= "
- set n=
- set cc=
- for /l %%i in (1 1 8) do (set cc=!cc!a )
- for /l %%i in (1 1 16) do (set "sp3= !sp2!")
- for /l %%i in (1 1 8) do (
- for /l %%i in (1 1 7) do echo.
- set /a n+=2&set /a "n1=!n!>>1"
- echo !sp5!!cc!
- for /l %%i in (1 1 6) do (set "sp4=!sp5!a !sp!a"&echo !sp4!)
- call set /p "=!sp5!%%sp3:~0,-!n!%%"<nul
- for /l %%i in (1 1 !n1!) do (set /p=a<nul )
- echo.&echo.
- echo ----------------------------
- for /l %%1 in (1 1 180) do (call echo.>nul)
- cls
- )
- :The End
- for /l %%i in (1 1 7) do echo.
- echo !sp1! !cc!
- for /l %%i in (1 1 6) do (set "sp4= !sp1!a !sp!a" &echo !sp4!)
- echo !sp1! !cc!
- echo ----------------------------
复制代码
- @echo off &setlocal enabledelayedexpansion &cls &color 1a
- for /l %%1 in (1 1 80) do set "space= !space!"
- mode con cols=80 lines=35
- rem 抛物线方程为--(y-16)*(y-16)=x edited by myzwd
- for /l %%i in (8 -1 1) do (
- set y=%%i
- set /a "x=y*y"
- call echo %%space:~-!x!%%●
- echo.
- for /l %%1 in (1 1 30) do call echo.>nul
- )
- for /l %%i in (1 1 8) do (
- set y=%%i
- set /a "x=y*y"
- call echo %%space:~-!x!%%●
- echo.
- for /l %%1 in (1 1 30) do call echo.>nul
- )
- pause
复制代码
说明:抛物线的画法主要是计算y坐标的增量。不是计算y坐标。
[ 本帖最后由 myzwd 于 2009-3-18 23:45 编辑 ]
作者: batman 时间: 2009-3-1 23:51
这题对新手来说是难了点。。。
作者: batman 时间: 2009-3-2 02:42
先发一个画正方形的,但没完成逐步显示这个步骤(左边竖边比较困难,还没想到好的办法),给大家做参考了:- @echo off&setlocal enabledelayedexpansion
- set /p l=请输入正方形的边长(小于46的偶数):
- echo exit|%ComSpec% /k prompt e 100 B4 00 B0 12 CD 10 B0 03 CD 10 CD 20 $_g$_q$_|debug>nul
- chcp 437 >nul
- graftabl 936 >nul
- set /a g=l/2,kk=40-l/2
- for /l %%a in (1,1,%kk%) do set "kkk=!kkk! "
- echo.&echo.
- for /l %%a in (1,1,%g%) do (
- set /p=%kkk%<nul&set "a="
- for %%c in (1 %g%) do if %%a equ %%c set "a=a"
- for /l %%b in (1,1,%l%) do (
- set "_%%a-%%b= "
- for %%d in (1 %l%) do if %%b equ %%d set "b=a"
- if defined a (
- set /p=.<nul
- ) else (
- if defined b (
- set /p=.<nul&set "b="
- ) else (
- set /p= <nul
- )
- )
- )
- echo.
- )
- 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
实现了逐步画图,但效果实在不怎么样:- @echo off&setlocal enabledelayedexpansion
- set /p l=请输入正方形的边长(小于46的偶数):
- echo exit|%ComSpec% /k prompt e 100 B4 00 B0 12 CD 10 B0 03 CD 10 CD 20 $_g$_q$_|debug>nul
- chcp 437 >nul
- graftabl 936 >nul
- set /a g=l/2,kk=40-l/2,l1=l-1,g1=g-2,s1=l,s2=s1+g1,s3=s2+l
- for /l %%a in (1,1,%kk%) do set "kkk=!kkk! "
- for /l %%a in (1,1,%l1%) do set "k1=!k1! "
- echo.&echo.
- for /l %%a in (1,1,%l%) do set /a n+=1&set "_!n!=."
- for /l %%a in (1,1,%g1%) do set /a n+=1&set "_!n!=%k1%."
- for /l %%a in (1,1,%l%) do (
- set /a a=l-%%a
- for /l %%b in (1,1,!a!) do set "k2=!k2! "
- for /l %%c in (1,1,%%a) do set ".=!.!."
- set /a n+=1&set "_!n!=!k2!!.!"&set "k2="&set ".="
- )
- set /a n+=g1
- for /l %%a in (1,1,%n%) do (
- for /l %%b in (1,1,%%a) do (
- if %%b leq %s1% (
- if %%b equ 1 set /p=%kkk%<nul>temp
- set /p=!_%%b!<nul>>temp
- if %%b equ %s1% echo.>>temp
- ) else (
- if %%b leq %s2% (
- echo %kkk%!_%%b!>>temp
- ) else (
- if %%b leq %s3% (
- set /a a=kk+%%b
- for /l %%c in (1,1,!a!) do set /p= <nul>>temp
- set /p=%kkk%!_%%b!<nul>>temp
- )
- )
- )
- )
- cls&type temp
- if %%a gtr %s3% (
- set /a a=s2+s3-%%a
- for /l %%d in (%s2%,-1,!a!) do set "a=!_%%d!"&set "a=.!a:~1!"&set "_%%d=!a!"
- )
- )
- pause>nul&del /q temp
复制代码
[ 本帖最后由 batman 于 2009-3-5 23:31 编辑 ]
作者: batman 时间: 2009-3-6 00:27
这次效果上没问题了(不用全屏):- @echo off&setlocal enabledelayedexpansion
- set /p l=请输入正方形的边长(小于46的偶数):
- set /a g=l/2,kk=40-l/2,l1=l-1,g1=g-2,s1=l,s2=s1+g1,s3=s2+l
- for /l %%a in (1,1,%kk%) do set "kkk=!kkk! "
- for /l %%a in (1,1,%l1%) do set "k1=!k1! "
- for /l %%a in (1,1,%l%) do (
- set /a n+=1&set "_!n!=."
- set "str=!str!."
- )
- for /l %%a in (1,1,%g1%) do set /a n+=1&set "_!n!=%k1%."
- for /l %%a in (1,1,%l%) do (
- set /a a=l-%%a
- for /l %%b in (1,1,!a!) do set "k2=!k2! "
- for /l %%c in (1,1,%%a) do set ".=!.!."
- set /a n+=1&set "_!n!=!k2!!.!"&set "k2="&set ".="
- )
- set /a n+=g1
- for /l %%a in (1,1,%n%) do (
- for /l %%b in (1,1,%%a) do (
- if %%b leq %s1% (
- if %%b equ 1 set /p=%kkk%<nul>temp
- set /p=!_%%b!<nul>>temp
- if %%b equ %s1% echo.>>temp
- ) else (
- if %%b leq %s2% (
- echo %kkk%!_%%b!>>temp
- ) else (
- set "flag=a"
- if %%b geq %s3% set "ok=a"
- )
- )
- )
- if defined ok (
- echo %kkk%%str%>>temp
- ) else (
- if defined flag echo %kkk%!_%%a!>>temp
- )
- for /l %%d in (1,1,50) do echo>nul
- cls&type temp
- if %%a gtr %s3% (
- set /a a=s2+s3-%%a
- for /l %%e in (%s2%,-1,!a!) do set "a=!_%%e!"&set "a=.!a:~1!"&set "_%%e=!a!"
- )
- )
- 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
做的并不严密~ 发出来了- @echo off &setlocal enabledelayedexpansion
- set /p inp="1~46内的偶数: "
- set /a lx=inp/2,la=0,hx=lx,left=(80-inp)/2
- for /l %%a in (1,1,80) do (set k= !k!)
- set left=!k:~0,%left%!
- set "do=" &set "do2=::"
- :la
- set /a la+=1,lb=0
- if %la% gtr 1 (set "do=::" &set h%la%=!k:~-%inp%,-1!.)
- if %la% equ %lx% (set "do=")
- %do2% set /a lx-=1
- %do2% set h%lx%=.!h%lx%:~1!
- :lb
- %do% set /a lb+=1
- %do% set h%la%=!h%la%!.
- %do% set h%la%=!h%la%:~-%inp%!
- ping -n 1 127.1>nul
- cls
- for /l %%a in (1,1,%hx%) do echo,%left%!h%%a!
- %do% if %lb% lss %inp% (goto :lb) else (set lb=0)
- %do% if %la% equ %lx% (set "do=::" &set "do2=")
- if %lx% neq 0 goto :la
- 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的 感觉挺漂亮的
- @echo off
- setlocal enabledelayedexpansion
- mode con cols=102 lines=25
- for /l %%a in (1,1,100) do (set k= !k!)
- for /l %%a in (-10,1,10) do (set h%%a=%k%)
- set la=-11
- :la
- set /a la+=1,lb=la*la,tlb=100-lb
- set h%la%=!h%la%:~%tlb%!.
- ping -n 1 127.1>nul
- cls
- for /l %%a in (-10,1,10) do echo,!h%%a!
- if %la% lss 10 goto :la
- pause
复制代码
[ 本帖最后由 523066680 于 2009-3-8 14:57 编辑 ]
作者: 随风 时间: 2009-3-9 20:07
批处理画方框
好久没用批处理写动画了,也来一个。。
:- @echo off
- for /l %%a in (1 1 39) do call set "k= %%k%%"
- set /a m=100
- :start
- setlocal enabledelayedexpansion
- cls&echo.&echo.&echo.
- set/p=!k:~0,17!<nul
- for /l %%a in (1 1 20) do (
- set/p= .<nul
- set "n%%a= !k:~2!"
- set "yi=!yi! ."
- call :yc !m!
- )
- echo.
- for /l %%a in (1 1 15) do echo !k:~0,17!!k!.&call :yc !m!
- set/p=!k:~0,17!!k!.<nul
- for /l %%a in (1 1 19) do set /p= .<nul&call :yc !m!
- echo.
- for /l %%i in (15 -1 1) do (
- cls&echo.&echo.&echo.
- echo !k:~0,17!!yi!
- set n%%i= .!n%%i:~2!
- for /l %%a in (1 1 15) do echo !k:~0,17!!n%%a!.
- echo !k:~0,17!!yi!
- call :yc !m!
- )
- echo.&echo.&endlocal&cls&call :yc 800&goto start
- :yc
- for /l %%a in (1 1 %~1) do ver>nul
- goto :EOF
复制代码
作者: saber 时间: 2009-3-9 21:44
上面代码 很多都看不明呢
作者: 523066680 时间: 2009-3-10 17:17
我突然觉得调用函数可能会使代码短一些 果然如此
- @echo off &setlocal enabledelayedexpansion
- for /l %%a in (1,1,79) do (set k= !k!)
- for /l %%a in (1,1,23) do (set h%%a=%k%)
- set /p inp="输入高[2-23]: "
- set /a c=0,h=1,i2=inp*2,na=40-inp
- set stra=!k:~-%na%!
- for %%a in ("c + %i2%" "h + %inp%" "c - 1" "h - 1") do (call :func %%~a)
- pause>nul &exit
- :func
- set /a %1 %2 = 1,cf=c-1
- set h%h%=!h%h%:~0,%cf%!.!h%h%:~%c%!
- ping -n 1 127.1>nul &cls
- for /l %%a in (1,1,%inp%) do (echo,%stra%!h%%a:~0,-%na%!)
- 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
原来有这么搞代码了 先前用笨办法写的 到第二边的时候定义 后面用它- @echo off&setlocal enabledelayedexpansion&color a
- set/p n=请输入边长(最大37)
- set/a n1=n-2,n2=n*2-3,n3=76-n*2
- if %n3% leq 0 echo 输入超出范围&pause&exit
- mode con cols=80 lines=40
- for /l %%i in (1 1 79) do set "f= !f!"
- for /l %%i in (1 1 %n%) do (
- set "c=* !c!"
- set/a t=%%i*2
- call echo !f:~,5!%%c:~,!t!%%
- for /l %%a in (1,1,200) do echo.>nul
- cls
- )
- set str=!f:~,5!!c:~,-1!
- if %n1% gtr 0 (
- for /l %%i in (1 1 %n1%) do (
- set/a x=n-%%i-1
- set b!x!=!f:~,5!!c:~,-1!!var!
- set var=!var!!f!*
- set str=!f:~,5!*!f:~,%n2%!*!f:~,%n3%!!str!
- set a%%i=!str!
- echo !f:~,5!!c:~,-1!!var!!f!
- for /l %%a in (1,1,200) do echo.>nul
- cls
- ))
- for /l %%i in (1 1 %n%) do (
- cls
- set/a t=%%i*2
- call echo !f:~,5!!c:~,-1!!var! %%f:~,-!t!%%%%c:~-!t!%%
- for /l %%a in (1,1,200) do echo.>nul
-
- )
- if %n1% gtr 0 (
- for /l %%i in (1 1 %n1%) do (
- cls
- echo !b%%i!
- echo !a%%i!
- for /l %%a in (1,1,200) do echo.>nul
- ))
- 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 |