更酷的ASCII旋转器?

312
在控制台应用程序中,可以使用ASCII旋转器来指示正在执行的工作,就像GUI等待光标一样。常见的旋转器通过以下4个字符循环:'|','/','-','\'。
还有哪些循环动画序列可用于增添控制台应用程序的趣味性?

82
在我看来,这似乎是一个非常合理的问题。 - Raj More
21
关闭这个问题似乎有些不必要。虽然控制台文本模式的用户界面不如图形用户界面时髦,但它们仍然是相关主题。此外,该问题已经获得了赞同,并收到了几个有用的答案(也都被赞同)。 - Stephen C. Steel
3
@roe:社区维基意味着原帖作者想让任何网站用户都能编辑他的问题和答案,但这可能并非原帖作者的意图。维基不用来分类问题为“主观性”或“无单一答案”,这就是标签的作用。@Jason:如果你不想,你不需要把这个问题变成维基。 - Juliet
1
感谢大家的支持。我标记了一个答案,因为我认为问题已经解决了,但显然这是主观的,所以请继续贡献!谢谢! - Jason Kleban
7
@Juliet: 在该网站的大部分历史中,CW的正式含义通常被社区规范补充,即“有趣”的、非技术性的和类似投票的内容应该标记为CW,并且如果没有这样做可能会被关闭。漠视这一事实不会使其消失,反复重申CW在软性内容上不需要的口号也不会。这个问题在界限上非常微妙,但我倾向于让它通过。 - dmckee --- ex-moderator kitten
显示剩余4条评论
18个回答

15

尝试这些操作符

  • '+', 'x'
  • 'v', '<', '^', '>'

13

在JavaScript中使用jQuery选择器:

var spins = [
    "←↖↑↗→↘↓↙",
    "▁▃▄▅▆▇█▇▆▅▄▃",
    "▉▊▋▌▍▎▏▎▍▌▋▊▉",
    "▖▘▝▗",
    "┤┘┴└├┌┬┐",
    "◢◣◤◥",
    "◰ ◳ ◲ ◱",
    "◴◷◶◵",
    "◐◓◑◒",
    "|/-\\"];

    var spin = spins[0],
        title$ = $('title'),
        i=0;

    setInterval(function() {
        i = i==spin.length-1 ? 0 : ++i;
        title$.text('('+ spin[i] +') Loading...');
    },300);

9
JavaScript 可以在非常少的控制台中使用。 - New Alexandria
@NewAlexandria 无论如何也不会可用,因为这个程序使用的是仅在浏览器中工作的jQuery。 - Jacob

10

很高兴我不是唯一一个浪费时间在这上面的疯子!

以下是我最喜欢的一些代码(某些使用了dos ASCII码):

             classic: "/-\\|";
       bouncing ball: ".oOo";
better bouncing ball: [46, 111, 79, 248, 79, 111]; // (.oO°Oo.)

[180, 217, 193, 192, 195, 218, 194, 191];  // ┤ ┘ ┴ └ ├ ┌ ┬ ┐
[185, 188, 202, 200, 204, 201, 203, 187];  // double piped version of that 
[219, 220, 223];                           // block colours

5
制造可爱的“雨”效果:
using System;
using System.Text;
using System.Threading;

namespace CSharpSandbox
{
    class Program
    {
        static Random rnd = new Random();
        static char[,] Step(char[,] matrix)
        {
            int width = matrix.GetUpperBound(0) + 1;
            int height = matrix.GetUpperBound(1) + 1;

            char[,] res = new char[width, height];
            for (int h = 0; h < height; h++)
            {
                for (int w = 0; w < width; w++)
                {
                    char c;
                    if (h == 0)
                        c = rnd.Next(2) == 0 ? ' ' : '*';
                    else
                        c = matrix[w, h - 1];

                    res[w, h] = c;
                }
            }

            return res;
        }

        static string ToString(char[,] matrix)
        {
            int width = matrix.GetUpperBound(0) + 1;
            int height = matrix.GetUpperBound(1) + 1;
            StringBuilder sb = new StringBuilder();

            for (int h = 0; h < height; h++)
            {
                for (int w = 0; w < width; w++)
                {
                    sb.Append(matrix[w, h]);
                }
                sb.AppendLine();
            }
            return sb.ToString();
        }

        static Timer timer;
        static void Spinner()
        {
            char[,] matrix = new char[10, 5];
            timer = new Timer(_ =>
                {
                    string s = ToString(matrix);

                    Console.SetCursorPosition(0, 0);
                    Console.Write(s);

                    matrix = Step(matrix);
                },
                null,
                0,
                200);
        }

        static void Main(string[] args)
        {
            Spinner();
            Console.ReadLine();
        }
    }
}

非常好!在Spinner()中使用char[,] matrix = new char[Console.WindowWidth-1, Console.WindowHeight-1];看起来很棒。 - Callum Rogers
* 替换为 , 以制造暴风雪。 - Sorin Comanescu
4
你可能需要提及这是用C#编写的... - Matt Fletcher

4

感谢我的同事,这里提供了一个很棒的C语言实现:

#define COW 2172
char* moo = "MO ";
void wrap() {
    int i,j;
    for(i=0;doSomething(i);i++)
        j=COW-moo[i&3],fputs(&j,stderr);
}

经过我的分析,它只能在至少有32位字长和ASCII字符集的小端机器上运行。但是,它相当地巧妙。


这真的很酷。在我的机器上运行良好,尽管我实现了doSomething()只睡眠1毫秒,它动画非常缓慢...我希望你正在进行的操作很快。 - rmeador
20
那么,效果如何呢? - Jason Kleban
2
没有进行强制转换,我在VS2010上无法编译:fputs((const char*)&j,stderr); ... 当它真的编译通过时,有点让人失望。 - EMP
1
@Evgeny:是的,原始代码是用C写的;如果你使用C++编译器,你需要进行强制类型转换。我从未说过这是一个令人兴奋的显示,只是实现方式相当巧妙。 - Daniel Pryden

4

在一个应用程序中,我看到了1、2、3、4、5、6、7、8、9、0。


4

我写了一个循环显示标准的\ | / -,但是留下了一个_并继续移动到下一个位置。旨在看起来像一系列的旋转器,每个旋转器在下一个开始前都会掉落到地板上。这是因为我的程序正在重复尝试某些操作,等待特定的结果。我想表示每次尝试的次数以及尝试了多少次,而不占用太多屏幕空间(或计数器)。

写完后,它看起来比我想象中不那么酷,但它达到了它的目的。


3

我看过

 echo -e "\033[41;1m$1 \033[0m"

在bash中,可以使用块字符来构建一个基于进度条的不断更新的效果。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接