Board logo

标题: [游戏娱乐] 批处理将光标退回原点 [打印本页]

作者: batman    时间: 2010-2-7 02:41     标题: 批处理将光标退回原点

  1. @echo off&setlocal enabledelayedexpansion
  2. :: 灵感来源于cn-dos趣味东的多行回退
  3. :: 趣味东发现用set /p输出一个tab+n个退格就将光标回退多行,但并不好控制
  4. :: 于是本人就想到是不是能将光标回退到原点(屏幕左上角)
  5. :: 结果发现用echo输出一个tab+n个退格就能将光标退回到原点过一格的位置,但有错误信息输出
  6. :: 于是,用2>nul屏蔽错误信息,并再加一个退格将光标退回原点
  7. :: 下面通过代码进行简单演示,至于原因本人暂未搞明白
  8. :: 因论坛处理不了tab,请将代码中的tab字符替换为实际的tab
  9. title 神奇的回退
  10. set "t=tab"
  11. for /l %%a in (1,1,1000) do set "k=!k!"
  12. for /l %%a in (1,1,10) do echo ○○○○○○○○○○
  13. ping /n 2 127.1>nul
  14. :: 这里将光标退回原点处,请仔细注意光标的位置
  15. echo %t%%k% 2>nul&set /p=<nul
  16. pause>nul
  17. :: 请注意6-10行第6-10个字符的输出是没有改变的
  18. for /l %%a in (1,1,5) do echo ●●●●●¤¤¤¤¤
  19. for /l %%a in (1,1,5) do echo ⊙⊙⊙⊙⊙
  20. pause>nul
复制代码
延伸:当我们实现了将光标退回原点后,那么就能随意控制光标退回到设定的位置了,再以代码示之:
  1. @echo off&setlocal enabledelayedexpansion
  2. :: 请同样将tab字符换成tab
  3. title 光标回退7行
  4. set "t=tab"
  5. for /l %%a in (1,1,1000) do set "k=!k!"
  6. for /l %%a in (1,1,20) do echo %%a%t%bathome
  7. ping /n 2 127.1>nul
  8. set /a n=20-7
  9. echo %t%%k% 2>nul&set /p=<nul
  10. for /l %%a in (1,1,%n%) do echo.
  11. set /p=现在光标回退到这里了<nul
  12. 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的符号。
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set "tab=    "
  4. set /a cols=20,lines=10,act=0
  5. for /l %%a in (1,1,%cols%) do (set spc=+!spc!)
  6. for /l %%a in (1,1,%lines%) do (set l%%a=%spc%)
  7. for /l %%a in (1,1,%cols%) do (
  8.   for /l %%b in (1,1,%lines%) do (
  9.     set /a act+=1
  10.     set num[!act!]="x=%%a,y=%%b"
  11.     set back=!back!
  12.   )
  13. )
  14. :act
  15.   set /a rand=%random% %% act + 1
  16.   set /a !num[%rand%]:"=!,xa=x-1
  17.   set num[%rand%]=!num[%act%]!
  18.   set l%y%=!l%y%:~0,%xa%! !l%y%:~%x%!
  19.   color 0%act:~-1%
  20.   echo %tab%%back% 2>nul
  21.   echo,
  22.   for /l %%a in (1,1,%lines%) do (echo,!l%%a!)
  23. if %act% gtr 1 (set /a act-=1 &goto :act)
  24. 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):
  1. @echo off&setlocal enabledelayedexpansion
  2. for /l %%a in (1,1,202) do (
  3.     set "k=!k!"&cls
  4.     for /l %%b in (1,1,20) do (
  5.         for /l %%c in (1,1,20) do set "str=!str!■"
  6.         echo !str!&set "str="
  7.     )
  8.     2>nul echo tab!k!
  9.  if %%a equ 202 set /p=<nul
  10.     echo %%a
  11.     for /l %%b in (1,1,1000) do echo>nul
  12. )
  13. pause>nul
复制代码

[ 本帖最后由 batman 于 2011-2-26 12:37 编辑 ]
作者: batman    时间: 2011-2-26 12:11     标题: 现给个直接点的测试代码:

一样将tab换成实际tab
  1. @echo off&setlocal enabledelayedexpansion
  2. set /p h=请输入总行数:
  3. set /p t=请输入回退行数,请不要大于总行数:
  4. for /l %%a in (1,1,%h%) do echo 第%%a行:www.bathome.net is my home
  5. set /a t=t*10+2
  6. for /l %%a in (1,1,%t%) do set "k=!k!"
  7. 2>nul echo tab!k!
  8. 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