在ncurses / C中模拟bash“snow fall”脚本

时间:2011-12-22 18:25:26

标签: c linux bash ncurses

所以我前几天看到了这个模拟雪落在终端上的bash脚本。我认为在C中学习ncurses是一个简单的项目,但我已经弄得一团糟了。我的方法只是用随机雪花填充一些字符串并将它们写入屏幕。我没有得到任何我期望的东西。基本上只是一个以光速飞逝的大混乱。

有人能让我走上正轨吗?这是我要复制行为的脚本。

#!/bin/bash

LINES=$(tput lines)
COLUMNS=$(tput cols)

declare -A snowflakes
declare -A lastflakes

clear

function move_flake() {
    i="$1"

    if [ "${snowflakes[$i]}" = "" ] || [ "${snowflakes[$i]}" = "$LINES" ]; then
snowflakes[$i]=0
    else
if [ "${lastflakes[$i]}" != "" ]; then
printf "\033[%s;%sH \033[0;0H " ${lastflakes[$i]} $i
        fi
fi

printf "\033[%s;%sH*\033[0;0H" ${snowflakes[$i]} $i

    lastflakes[$i]=${snowflakes[$i]}
    snowflakes[$i]=$((${snowflakes[$i]}+1))
}

while :
do
i=$(($RANDOM % $COLUMNS))

    move_flake $i

    for x in "${!lastflakes[@]}"
    do
move_flake "$x"
    done

sleep 0.1
done

1 个答案:

答案 0 :(得分:0)

好吧,如果你能够在没有屏幕底部的线条的情况下生活,假装积雪在地面上,这很简单。主要技巧是不向上滚动屏幕。但是,如果您确实需要这个底线,那么它会变得更难,您可能需要尝试除此之外的其他方法。

我只是在我的机器上测试了这一点,因为在所有事情中都会诅咒关于终端的milage的常见警告。无论如何,有些东西供你咀嚼和玩耍。 Cntl-C应该杀掉它,但是进行一些适当的错误处理也是一个很好的练习。

#include <ncurses.h>
#include <stdlib.h>
#include <unistd.h>
#include <time.h>

int main(int argc, char *argv[])
{
    srand (time(NULL));

    initscr();

    int  maxRows, maxCols;

    getmaxyx(stdscr, maxRows, maxCols);

    int flakesPerRow = maxCols * 0.02;

    scrollok(stdscr, TRUE);

    while (true)
    {
        //setup top line
        for (int i = 0; i < flakesPerRow; ++i)
        {
            int x = rand() % maxCols;
            mvaddch(0, x, '*');
        }

        move(0,0);  //keeps cursor from bouncing around
        scrl(-1);   //scroll down, not up
        refresh();
        napms(200); //delay 200ms
    }

    endwin();
}