2011-12-22 18 views
1

所以我在前一天看到這個bash腳本模擬終端上的積雪。我認爲這將是一個簡單的項目,在C中學習ncurses,但我已經完全搞砸了。我的做法只是用隨機雪花填充一些字符串並將它們寫入屏幕。我沒有得到我期望的任何東西。基本上只是一個以光速飛行的大混亂。模擬ncurses中的bash「snow fall」腳本/ C

任何人都可以把我放在正確的軌道上嗎?這是我想複製行爲的腳本。

#!/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 
+3

請向我們展示您的代碼,您期望的輸出是什麼,您實際得到的輸出是什麼,並且詢問關於您遇到問題的具體問題。 – 2011-12-22 18:31:42

+0

這段代碼被編輯和註釋掉了太多,以至於它在發佈之前只是一團亂麻,並且從挫敗中抹去了它。這不是家庭作業,只是試圖減輕無聊而導致的錯誤。 – 2011-12-22 22:24:56

回答

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(); 
} 
+0

或者它可能已經不在屏幕上了。這些日子裏,我會直接得到它。 – Duck 2011-12-22 18:56:09

+0

謝謝!這比我所做的要好得多,我發現我做錯了很多事情。 – 2011-12-22 22:32:01