所以我前几天看到了这个模拟雪落在终端上的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
答案 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();
}