2011-12-22 7 views
1

先日、端末で雪が降るのをシミュレートするこのbashスクリプトを見ました。 Cでncursesを学ぶのは簡単なプロジェクトだと思っていましたが、私はそれを完全に混乱させました。私のアプローチは、いくつかの文字列にランダムな雪片を塗りつぶしてスクリーンに書き込むことでした。私は何も期待していません。基本的に光の速さで飛ぶ大きな混乱。ncurses/Cでbash "snowfall"スクリプトをシミュレートする

誰でも私を正しい軌道に乗せることができますか?ここに私が行動をコピーしたいスクリプトがあります。

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

あなたのコード、予想される出力、実際に得られている出力を表示して、問題の特定の質問をしてください。 –

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

または、画面上に表示されていない可能性があります。最近のうちに私はそれをまっすぐにします。 – Duck

+0

ありがとう!これは、私がやっていたことよりも無限に優れています。 –

関連する問題