标题: [游戏娱乐] 批处理将光标退回原点 [打印本页]
作者: batman 时间: 2010-2-7 02:41 标题: 批处理将光标退回原点
- @echo off&setlocal enabledelayedexpansion
- :: 灵感来源于cn-dos趣味东的多行回退
- :: 趣味东发现用set /p输出一个tab+n个退格就将光标回退多行,但并不好控制
- :: 于是本人就想到是不是能将光标回退到原点(屏幕左上角)
- :: 结果发现用echo输出一个tab+n个退格就能将光标退回到原点过一格的位置,但有错误信息输出
- :: 于是,用2>nul屏蔽错误信息,并再加一个退格将光标退回原点
- :: 下面通过代码进行简单演示,至于原因本人暂未搞明白
- :: 因论坛处理不了tab,请将代码中的tab字符替换为实际的tab
- title 神奇的回退
- set "t=tab"
- for /l %%a in (1,1,1000) do set "k=!k!"
- for /l %%a in (1,1,10) do echo ○○○○○○○○○○
- ping /n 2 127.1>nul
- :: 这里将光标退回原点处,请仔细注意光标的位置
- echo %t%%k% 2>nul&set /p=<nul
- pause>nul
- :: 请注意6-10行第6-10个字符的输出是没有改变的
- for /l %%a in (1,1,5) do echo ●●●●●¤¤¤¤¤
- for /l %%a in (1,1,5) do echo ⊙⊙⊙⊙⊙
- pause>nul
复制代码
延伸:当我们实现了将光标退回原点后,那么就能随意控制光标退回到设定的位置了,再以代码示之:- @echo off&setlocal enabledelayedexpansion
- :: 请同样将tab字符换成tab
- title 光标回退7行
- set "t=tab"
- for /l %%a in (1,1,1000) do set "k=!k!"
- for /l %%a in (1,1,20) do echo %%a%t%bathome
- ping /n 2 127.1>nul
- set /a n=20-7
- echo %t%%k% 2>nul&set /p=<nul
- for /l %%a in (1,1,%n%) do echo.
- set /p=现在光标回退到这里了<nul
- pause>nul
复制代码
作者: 523066680 时间: 2010-2-9 12:53
马上去测试了一下旧的效果,画面顺畅了很多呢~
实现方法也简单了
作者: Spring 时间: 2010-2-9 14:08
我是先在 cn-dos 上看到趣味东的帖子,然后发现他的二楼有个人回复说“已实现控制”,还以为是已经有人发过这样的帖子,结果点一下那个连接就来到了这里,然后你这里又说是根据他的帖子,然后又跑去看他的,发现他三楼又多了个回到原点,真是迅速啊,难道两个论坛是一家开的。。。
话说那位同志挺难辛苦的,这个帖子(http://cn-dos.net/forum/viewthread.php?tid=50206
)还是因为之前他发的一个帖子(http://cn-dos.net/forum/viewthread.php?tid=50166
)没人回复,快委屈死了,于是发牢骚,终于引众人注视,才写出这个来的,版主要不要注册个马甲给他顶一下,呵呵
作者: 523066680 时间: 2010-2-9 14:27 标题: 回复 3楼 的帖子
你没看过cn-dos精华帖咩,瞧瞧里面的ID就知道。
好多大军是那里来的,只是换了称号。像我这个过渡期的人就知道他们哪个是哪个。
我怎么看链接来链接去的都看晕了……¥%#……不鸟,算是学到了相见恨晚的知识,
在这之前写了多少个“刷屏无限闪”的粗糙东西啊!
这个是小改其中一个的,修改下第三句tab的符号。- @echo off
- setlocal enabledelayedexpansion
- set "tab= "
- set /a cols=20,lines=10,act=0
- for /l %%a in (1,1,%cols%) do (set spc=+!spc!)
- for /l %%a in (1,1,%lines%) do (set l%%a=%spc%)
- for /l %%a in (1,1,%cols%) do (
- for /l %%b in (1,1,%lines%) do (
- set /a act+=1
- set num[!act!]="x=%%a,y=%%b"
- set back=!back!
- )
- )
- :act
- set /a rand=%random% %% act + 1
- set /a !num[%rand%]:"=!,xa=x-1
- set num[%rand%]=!num[%act%]!
- set l%y%=!l%y%:~0,%xa%! !l%y%:~%x%!
- color 0%act:~-1%
- echo %tab%%back% 2>nul
- echo,
- for /l %%a in (1,1,%lines%) do (echo,!l%%a!)
- if %act% gtr 1 (set /a act-=1 &goto :act)
- pause
复制代码
真像是说我的……
[ 本帖最后由 523066680 于 2010-2-9 18:55 编辑 ]
作者: Spring 时间: 2010-2-9 15:54
原帖由 523066680 于 2010-2-9 14:27 发表
我怎么看链接来链接去的都看晕了……¥%#……不鸟,算是学到了相见恨晚的知识,
在这之前写了多少个“刷屏无限闪”的粗糙东西啊!
额,我只知道 cls 能回到原点,-_-```
莫非就是你说的“刷屏无限闪”。。。
作者: qwd 时间: 2010-2-9 18:36
我又回来了!只因我的收藏夹是原来论坛网址,手懒没进咱坛子!
作者: 随风 时间: 2010-2-9 23:54
想想以前写动画时最难解决的就是这个问题,可惜现在不爱动画了,这个帖要是早点出来多好啊~ (^_^)
作者: batman 时间: 2010-2-9 23:55 标题: 回复 6楼 的帖子
欢迎兄弟回家!
作者: netbenton 时间: 2010-2-10 19:58
此法用在动画显示上真的超爽,即不用三方,速度也是嘎嘎的
在俄罗斯方块中引入后,不但不闪了,速度有所提升!
作者: 随风 时间: 2010-2-10 23:31
是否可以考虑写个函数,将光标退回到指定的行和例。
作者: 523066680 时间: 2010-2-11 08:47 标题: 回复 10楼 的帖子
本帖最后由 523066680 于 2016-9-21 17:17 编辑
[ 本帖最后由 523066680 于 2010-2-11 08:59 编辑 ]
作者: zhouyongjun 时间: 2010-2-12 19:56
哇,重大发现。真是太好了。
作者: zhouyongjun 时间: 2010-2-12 20:24
定位到指定列还是有问题,会修改后面的东西
作者: batman 时间: 2011-2-26 11:51
在思考一位朋友的问题时,又想到了光标回退,结果发现光标回退其实是有着规律可循的,经本人测试,如果想回退n行的话,就可以用echo+空格+tab+n*10+2个退格来实现,那么想要保证回到原点,必须知道当前输出了多少行(空行也算一行),测试代码如下(请将字符改为实际的tab):- @echo off&setlocal enabledelayedexpansion
- for /l %%a in (1,1,202) do (
- set "k=!k!"&cls
- for /l %%b in (1,1,20) do (
- for /l %%c in (1,1,20) do set "str=!str!■"
- echo !str!&set "str="
- )
- 2>nul echo tab!k!
- if %%a equ 202 set /p=<nul
- echo %%a
- for /l %%b in (1,1,1000) do echo>nul
- )
- pause>nul
复制代码
[ 本帖最后由 batman 于 2011-2-26 12:37 编辑 ]
作者: batman 时间: 2011-2-26 12:11 标题: 现给个直接点的测试代码:
一样将tab换成实际tab- @echo off&setlocal enabledelayedexpansion
- set /p h=请输入总行数:
- set /p t=请输入回退行数,请不要大于总行数:
- for /l %%a in (1,1,%h%) do echo 第%%a行:www.bathome.net is my home
- set /a t=t*10+2
- for /l %%a in (1,1,%t%) do set "k=!k!"
- 2>nul echo tab!k!
- pause>nul
复制代码
[ 本帖最后由 batman 于 2011-2-26 12:23 编辑 ]
作者: batman 时间: 2011-2-26 12:36
补充一点:
为确保退回到原点并重新输出字符时前面不会多出空格,建议将2>nul echo tab!k!改成2>nul echo tab!k!&set /p=<nul
作者: jay_16 时间: 2011-4-14 13:50
好强大,受益匪浅....
作者: CrLf 时间: 2011-4-14 20:51
2>nul是亮点,不过set /p可以省掉的,只需要任意字符打断tab与退格的关联即可:echo tab@
作者: idos 时间: 2016-9-22 17:57
回复 14# batman
1.用echo+空格+tab+n*10+2个退格来实现回退N行,在14楼的例子中最外层循环执行到第二次的时候,数字向上跑了一行,而此时的退格键为两个,这是怎么一回事?
2.用set /p输出一个tab+n个退格就将光标回退多行,实例中是用的echo输出,效果一样啊?
新手,求解答
作者: ShenMian 时间: 2018-2-3 21:58
本帖最后由 ShenMian 于 2018-2-3 22:00 编辑
回复 15# batman
我不是很在意可读性...
for /l %%a in (-1,1,%10) do set "k=!k!"
回复 19# idos
TEST...
作者: wujunkai 时间: 2020-4-20 10:09
win10好像失效了~有什么办法吗
欢迎光临 批处理之家 (http://bathome.net./) |
Powered by Discuz! 7.2 |