[Scratch] 佛地魔顛倒字謎 (Voldemort Anagram)
最近在家裡看完了哈利波特電影版全集~
其中第二集「消失的密室」裡,
湯姆瑞斗展示了自己名字與佛地魔的關聯,
從 Tom Marvolo Riddle 轉換成 I am Lord Voldemort,
看到這個的時候,就想說能不能用 Scratch 做出相同的效果呢?
以這 Scratch 程式來說,
程式本身不難,倒是在設定每個字母的坐標時很麻煩…
先來看一下執行效果吧:
1. 程式主體
程式裡只有一個角色,但它有 16 個裝扮 (costume),
就是 Tom Marvolo Riddle 這 16 個字母。
我用兩個陣列 List1 和 List2 分別來存
Tom Marvolo Riddle 與 I am Lord Voldemort 每個字母的坐標
(事實上每個 List 都分成兩個,如 List1X 和 List1Y,
分別存 X 與 Y 坐標,因為 Scratch 的陣列實在不好處理…)
2. 初始化陣列
這邊就是將每個字母的預定座標存成陣列:
如前所述,X 與 Y 坐標分別存在兩個陣列裡面,
因為 Scratch 不能在陣列內存 tuple 或物件,
也很難將 XY 坐標組合成如 “X,Y” 的方式再解開使用,
所以只好用兩個陣列:
因為角色裝扮原本就是以 Tom Marvolo Riddle 來排列,
所以要取 List1 的坐標比較容易,
可以移動字母,再看 Scratch 編輯器上的坐標。
但 List2 就比較麻煩…
同樣索引值代表的是同一個字母,
例如在 List1 的第一個值,代表的是 Tom 的 T 的坐標。
在 List2 的第一個值,代表的則會是這個 T 變成 Voldemort 的 T 的坐標。
所以一樣用 Scratch 編輯器看到 I am Lord Voldemort 每個字母的坐標後,
要仔細對應,看這坐標應該是從哪個字母來,
再標到那字母原本在 List1 中的索引值上。
至於有些重覆的字母像是 O 或 M,
就可以自己決定是要移動到對應的哪一個 O 或 M,
我是盡量讓它選移動距離遠的,比較有移動的效果~
(當然如果你很堅持電影的原汁原味,
可以去重看電影,看看湯姆到底是怎麼弄的… :P)
3. 顯示字母
顯示字母很簡單,全部有 16 個字母,
我產生了 15 個分身代表第 1~15 個字母,本體則代表第 16 個字母。
字母一開始都集中在 (0, 0) 的位置,
這樣待會它們移動到 Tom Marvolo Riddle 位置時,
就會有一個展開的效果:
當字母被產生出來之後,它們就會開始朝向目標位置前進:
4. 移動字母到目標位置
移動字母這個動作在一開始會做一次
(從正中央移動到 Tom Marvolo Riddle),
在使用者按下空白鍵時也會做一次。
我這邊的設計是,用一個 TargetList (一樣分成 X 和 Y 陣列) 來儲存目標位置的坐標,
同時用一個變數代表現在是往 List1 或 List2 前進。
當按下空白鍵時,會改變前往的陣列,
做法就是將 List1 或 List2 的值存到 TargetList 裡面去:
上述做法的好處是,隨時可以按空白鍵改變方向,
反正字母就是一直朝 TargetList 的坐標前進就對了~
在移動每個字母時,為了有點隨機效果,
會計算目標坐標與現在位置的差距,然後在範圍裡隨機移動一個距離。
舉例來說,假設 X 坐標與目的地相差 100 像素,
則目前的公式會取 1~10 點來移動,
越遠的話,移動的距離就有可能越大:
有興趣的人可以到 佛地魔顛倒字謎 (Voldemort Anagram) 來玩玩看囉~