2012-11-16 106 views
3

我想畫一棵樹下面的表單繪製聖誕樹

*  
    *** 
    ***** 
******* 
********* 

,你可以看到我需要兩個空間,而「*」星星在每一行,但我不能讓它相當我想要的方式

#!/bin/bash 

display_tree() { 
    local rows=$1 
    local columns=$2 

    for ((i=0; i<$rows; i++)) 
    do 
     #spaces loop 
     for ((j=0; j<$columns; j++)) 
     do 
      echo -n " " 
      #drawing tree loop 
      for ((a=0; a<$(($i + 1)); a++)) 
      do 
       echo -n "*" 
      done 
     done 
    echo 
    done 
} 

if [ $# -eq 2 ]; then 
    display_tree $1 $2 
else 
    echo "Usage: $0 rows columns" 
fi 
+1

它看起來像你還沒有正式你需要多少空間你散發明星之前發出,並且您已經包裹的內部循環,而不是使他們的連續的。當樹高3行時,需要在行1,行2和行3上的第一顆星前放置多少個空間?你的代碼如何確保發生? (提示,它尚未 - 所以你必須修改它,直到它。) –

+0

,你會更好地理解你的腳本的內部,如果你修改最內層的循環發射'printf「a =%s \ ti =%s \ tj =%s \ n「$ a $ i $ j>」/ dev/tty ????「'哪裏?是在單獨的窗口中運行'tty',然後用數字代替'????'在我的示例中。或者你可以省略'>「/ dev/tty ...」,並將輸出與你的聖誕樹混合在一起。祝你好運。 – shellter

回答

3

這似乎適用於我。對於「列」參數推薦使用奇數。當列= 2 *行 - 1時,看起來最漂亮。代碼中最長的行在播放時會執行一些基本代數,特別是線性插值,用於計算在給定行中顯示的恆星數量。

#!/bin/bash 
# Christmas tree ASCII drawer 
# works nicest for odd integers 

spaces() { 
    for ((i=0; i<$1; i++)) ; do 
    echo -n " " 
    done 
} 

stars() { 
    for ((i=0; i<$1; i++)) ; do 
    echo -n "*" 
    done 
    echo "" 
} 

display_tree() { 
    local rows=$1 
    local columns=$2 

    # render 
    for ((r=1; r <= $rows; r++)); do 
     s=$(((((columns-1) * (r-1)/(rows-1) + 1)/2)*2 +1)) 
     spaces $(((columns-s)/2)) 
     stars $s 
    done 
} 

if [ $# -eq 2 ]; then 
    display_tree $1 $2 
else 
    echo "Usage: $0 rows columns" 
fi 

輸出示例:

./display_tree.sh 5 21 
      * 
     ******* 
    *********** 
    ***************** 
********************* 

./display_tree.sh 30 59 
          * 
          *** 
          ***** 
          ******* 
         ********* 
         *********** 
         ************* 
         *************** 
        ***************** 
        ******************* 
        ********************* 
        *********************** 
       ************************* 
       *************************** 
       ***************************** 
       ******************************* 
      ********************************* 
      *********************************** 
      ************************************* 
      *************************************** 
     ***************************************** 
     ******************************************* 
     ********************************************* 
     *********************************************** 
    ************************************************* 
    *************************************************** 
    ***************************************************** 
    ******************************************************* 
********************************************************* 
*********************************************************** 
0
letters=(\" \');while true;do clear; letter=${letters[$[RANDOM%${#letters[@]}]]}; [[ $letter == \" ]] && color=35 || color=32;m=2;i=77;p=$(($i/2-1)); while [[ $m -le $i ]];do printf "%${p}s" ;printf "\e[4;${color}m${letter}%.0s\e[m" $(seq $m);echo;m=$[m+2];((p--));done;sleep 1;done