歡樂聖誕樹

每逢聖誕節,就可以在很多地方看到各種不同的聖誕樹,在寒冷的冬天夜晚,看著的色彩繽紛的聖誕樹,隨著時間不斷變換著顏色,是不是特別有聖誕節的感覺呢?

讓我們也來製作一棵屬於自己的聖誕樹吧!

 

現在我們有一塊白色的 grid,可以在上面畫出各種不同的圖案。我們先一步一步來,先從樹頂開始畫,首先畫最上頭的星星:

import grid = "grid"
def draw():
  grid.setBg(0, 4, "gold")

上面的程式裏,要使用grid,我們要先用 import 載入它。然後我們定義一個名字為 draw 的函數,先畫樹頂上的金色星星。因為 grid 格子位置的編號從 0 開始,所以 setBg(0, 4, "gold") 會在第一行左邊數來第五個位置畫上金色:

 

接著我們畫樹葉,第二行開始的六行會有樹葉,每兩行就增加長度 2,我們可以在原本的程式碼加上一些東西:

import grid = "grid"
def draw():
  grid.setBg(0, 4, "gold")

  var num = 3
  var head = 3
  for i from 1 to 6:
    for j from head to head + num - 1:
      grid.setBg(i, j, "green")
    if i%2 == 0:
      num = num + 2
      head = head - 1

這代表我們一開始一行樹葉的長度是 3 (num),從左邊數來 3 (head) 這個位置開始畫,總共要畫 6 行,所以 i 迴圈會從 1 到 6,那 j 迴圈為什麼從 head 到 head + num-1 呢?因為 j 迴圈負責的是畫出一行數葉,從 head 這個位置開始畫。下方的判斷式代表,每完成兩行,樹葉的長度會增加 2,開始的位置會減 1。

 

樹幹的部份,我們只要加上兩行棕色就好,所以程式變成:

import grid = "grid"
def draw():
  grid.setBg(0, 4, "gold")

  var num = 3
  var head = 3
  for i from 1 to 6:
    for j from head to head + num - 1:
      grid.setBg(i, j, "green")
    if i%2 == 0:
      num = num + 2
      head = head - 1

  for i from 7 to 8:
    for j from 3 to 5:
      grid.setBg(i, j, "brown")
      grid.setBg(i, j, "brown")

 

聖誕樹上都會有一閃一閃的燈光,看起來很絢麗奪目,我們應用亂數產生燈光吧:

import grid = "grid"
import math = "math"
def draw():
  grid.setBg(0, 4, "gold")

  var num = 3
  var head = 3
  for i from 1 to 6:
    for j from head to head + num - 1:
      var rnd = math.rand(10)
      var color = "green"
      if rnd == 0:
        color = "blue"
      elif rnd == 1:
        color = "yellow"
      grid.setBg(i, j, color)
    if i%2 == 0:
      num = num + 2
      head = head - 1

  for i from 7 to 8:
    for j from 3 to 5:
      grid.setBg(i, j, "brown")
      grid.setBg(i, j, "brown")

首先,要先載入 math 這個模組,才能夠產生亂數,我們在畫樹葉的迴圈裡,用 math.rand 這個函數,產生一個從 0 到 9 的數字,如果是 0 就畫藍色,如果是 1 就畫黃色,否則就是綠色。

 

要如何讓燈光可以隨著時間閃爍呢?其實很簡單,再加上一點東西:

import grid = "grid"
import math = "math"
import timer = "timer"
def draw():
  grid.setBg(0, 4, "gold")

  var num = 3
  var head = 3
  for i from 1 to 6:
    for j from head to head + num - 1:
      var rnd = math.rand(10)
      var color = "green"
      if rnd == 0:
        color = "blue"
      elif rnd == 1:
        color = "yellow"
      grid.setBg(i, j, color)
    if i%2 == 0:
      num = num + 2
      head = head - 1

  for i from 7 to 8:
    for j from 3 to 5:
      grid.setBg(i, j, "brown")
      grid.setBg(i, j, "brown")

def start():
  timer.tick(draw, 700)

我們載入了模組 timer,並且在最下方加上一個 start 函數,這樣就可以每 700 毫妙執行一次 draw 函數,這樣就可以讓燈光變得一閃一閃的。

 

想加上彩帶呢?我們可以在一些位置加上紅點,像是幫聖誕樹加上彩帶:

import grid = "grid"
import math = "math"
import timer = "timer"

var stripeR = [2, 3, 2, 4, 5, 5, 5, 4]
var stripeC = [3, 4, 5, 2, 3, 4, 5, 6]
def isStripe(r, c):
  for i from 0 to stripeR.length - 1:
    if stripeR[i] == r and stripeC[i] == c:
      return true
  return false

def draw():
  grid.setBg(0, 4, "gold")

  var num = 3
  var head = 3
  for i from 1 to 6:
    for j from head to head + num - 1:
      var rnd = math.rand(10)
      var color = "green"
      if rnd == 0:
        color = "blue"
      elif rnd == 1:
        color = "yellow"
      elif isStripe(i, j):
        color = "red"
      grid.setBg(i, j, color)
    if i%2 == 0:
      num = num + 2
      head = head - 1

  for i from 7 to 8:
    for j from 3 to 5:
      grid.setBg(i, j, "brown")
      grid.setBg(i, j, "brown")

def start():
  timer.tick(draw, 700)

我們的想法是,如果有一個位置應該畫彩帶,就畫紅色,所以在程式的上方,加上了兩個陣列,裡面是所有彩帶的點的位置,下方有一個函數 isStripe ,用來判斷 grid 上的某個位置是不是在彩帶,最後在畫樹葉的迴圈裡加上一個判斷,就完成了,看,我們的聖誕樹是不是很迷人呢!

 

 

聖誕樹
 

Comments

Computer 好炫
in 6 years
Computer
in 6 years