Matrix Digital Rain in LibreOffice
之前在facebook 看到一個沒有見過的效果,一時興起就研究了一下
如何使用LibreOffie 做一個代碼瀑布?
所謂的代碼瀑布,就是電影The Matrix(台譯:駭客任務)出現的一個經典畫面,其效果就是一條一條的綠色文字如雨一般的下降
網路上已經有人用Excel做過,身為LibreOffice使用者不免手癢,馬上做一個LibreOffice Calc版本
1. 準備一個RANDBETWEEN( )函式.
首先,我們在儲存格B1插入第一個函式
=RANDBETWEEN(1,9)
然後選取B2到B16的儲存格,將背景色和字體顏色均改成黑色 然後在儲存格A1補個9
2. 寫入公式
在儲存格B2到B16寫入以下公式
=MOD(ROW()+B$1-$A$1,15)+1
3. 設定條件式格式
選取B2到B16的儲存格後,選擇選單中的 格式(O) -> 條件式(O) -> 條件(A)
- 條件1 : 選擇「公式」
- 套用樣式 : 自訂一個新的樣式,將字型色彩設定成白色
- 使用的公式如下
(ROW()+B$1-$A$1,15)+1=6 MOD
新增後再點一次下方的「加入(A)」按鈕,新增一個條件2
- 條件2 : 選擇「公式」
- 套用樣式 : 自訂一個新的樣式,將字型色彩設定成亮綠色
- 使用的公式如下
(ROW()+B$1-$A$1,15)+1=5 MOD
新增後再點一次下方的「加入(A)」按鈕,新增一個條件3
- 條件3 : 選擇「公式」
- 套用樣式 : 自訂一個新的樣式,將字型色彩設定成暗綠色
- 使用的公式如下
(ROW()+B$1-$A$1,15)+1<5 MOD
4.為何要設定這些條件式格式?
以條件1寫入的公式舉例 我們在儲存格A1寫入過9,在儲存格B1寫入過RANDBETWEEN(1,9),假設B1的值是3
此時發生在儲存格B2的事如下
公式:
=MOD(ROW()+B$1-$A$1,15)+1
儲存格B2:
=MOD(2+3-9,15)+1
儲存格中的MOD(-4,15)+1 會得到12
儲存格B2設定的條件1:
= MOD(ROW()+B$1-$A$1,15)+1 = 6
最後會回傳 12=6 的邏輯判斷 FALSE
在條件式格式的作用下,這個FALSE會讓他無法作用,因此維持原來的黑色
但是發生在儲存格B11的事就不同
公式:
=MOD(ROW()+B$1-$A$1,15)+1
儲存格B11:
=MOD(11+3-9,15)+1=6
儲存格中的MOD(5,15)+1 會得到6
依照條件1最後會回傳 6=6 的邏輯判斷 TRUE
在條件式格式的作用下,這個TRUE會讓他作用,變成我們設定好的白色
條件2在這個基礎上把條件設定成公式要等於5
- MOD(ROW()+B$1-$A$1,15)+1 = 6
- MOD(ROW()+B$1-$A$1,15)+1 = 5
這個等於5會讓格式作用在比條件1向上移動一個儲存格,變成淺綠色
條件3是把這個公式設計成包含4、3、2、1,也就是小於5
MOD(ROW()+B$1-$A$1,15)+1 < 5
這樣的設定保證了我們可以得到 “深綠-深綠-深綠-深綠-淺綠-白”這樣順序的文字,只要A1的值不斷的+1,這個過程就可以無限循環
5.使用巨集
最後進入 工具(T) -> 巨集(M) -> 組織巨集(O) -> Basic語言(B) 將這個語法巨集嵌入到ods檔
Sub Main= ThisComponent.CurrentController.ActiveSheet
Sheet = Sheet.getCellRangeByName("A1")
Cell = 0 To 100
For i 100
Wait .setValue(i)
Cell
Next i End Sub
可以選擇是否要採用表單控制項來啟動
6.產生文字
雖然可以產生數字,但是我們需要的是文字,因此要做進一步的改造
先增加一個sheet2,放入需要的文字
接下來在sheet1的B2寫入這個函式
=INDEX($sheet2.A$1:A$15,MOD(ROW()+B$1-$A$1,15)+1)
主要是將原本的數字用INDEX( )函式轉換成文字
完成後,將原本的儲存格B2向下複製到需要的儲存格,只是B1請保留原來的數字
後面在連同儲存格C1、D1等分別寫入不同的數字,營造高低不同的瀑布感