Skip to main content

[LEGO] How to make an "Unique Random Number" my Block


這篇是答應某人要公開分享的教學...這兩天終於湊出時間來寫...

Erin 分享的原則通常都秉持著 "給你魚吃,到不如教你釣魚" 的想法在寫,所以如果沒有附上原始檔也請不用詢問了呦...意思就是我已經提供很多可以讓你"開始學"釣魚的概念囉!

這是去年三月在台北舉辦的 Flex&AIR AUG 網聚上使用的 lotto-bot 中的取得唯一亂數號碼 myBlock,可以用在樂透遊戲或者是亂數只給出現一次的程式應用。它的邏輯很簡單,只是要改成 NXT-G 的 myBlock 花了些時間連連看...XD

開始製作之前請先注意看看你的 NXT-G 有沒有安裝過 Dynamic Block Update ,安裝完成後可以在下拉式功能表中找到 "Block Import and Export Wizard"。接下來請下載及 import Simple Array Block,在下載的時候請記得點一下畫面中的google AD 感謝 Simple Array 的作者 Steve Hassenplug 提供了很多很棒的NXT-G Blocks 給大家使用。

由於 NXT-G 的變數是全域變數,所以在組合 myBlock 要小心變數命名,取得唯一亂數號碼需要兩個 myBlock ,一個負責初始化相關參數,一個負責輸出唯一號碼:
initUniqueRandom myBlock:
  1. var uniq_total:Number = total;

  2. Simple Array Block : clear

  3. Add a value(e.g. 100) to index 0 in Simple Array Block, coz we don't use index 0. If you need it to count from 0, just ignore this step.


如圖:


接下來就麻煩了...很長一串...

getUniqueRandom myBlock:
這段要用程式表示囉...不然寫的好累...冏...
var Logic 1 : Logic = false;
//Logic Switch
if(uniq_total == uniq_legth){
//Logic Switch Conditions : True
Logic 1 = true;
// output isEnd
}else{
//Logic Switch Conditions : False

//Logic Loop Until isSame = False
do Loop1(!isSame){
var isSame:Logic = false;
uniq_result = Random(1, uniq_total);
//Logic Loop Until count == uniq_length
for(count = 0; count <= uniq_length ; count ++){
if(uniq_result == SimpleArray[Value_index]){
isSame = true;
//if isSame = true, will do Loop1 again
}
}
// coz isSame = false , so break loop
}
SimpleArray[Value_index] = uniq_result;
uniq_length = uniq_length + 1;
}

output Logic 1 as isEnd;
output uniq_result as result;

圖示:


如何使用:
在遊戲一開始放置 initUniqueRandom 並傳入 total ,將 getUniqueRandom 放在Logic Loop直到 isEnd = true 跳出 Loop
這樣在 Logic Loop 內就可以一直輸出唯一的亂數囉!

Enjoy~

Comments

Popular posts from this blog

[Swift3] weak 與 unowned 關鍵字

雖然在 Swift 中看起來"很像"是不需要煩惱內存管理的問題,不過實際上它還是遵循著自動引用計數 (ARC) 的規則,當一個物件沒有被其他對象引用時會自動被銷毀,如果三魂七魄沒有完全回位的話,就會有個靈體留在現世的空間裡,最經典的範例如下: 閉包(Closure)引用 classClassA { typealias Complete = ()->() var name : String var onComplete : Complete? init(_ name: String){ self.name = name print("Hello I am \(self.name)") onComplete = { print("\(self.name): onComplete!") // --> 閉包引用 self, 計數 + 1 } } deinit { print("deinit: \(self.name)") } } var a : ClassA? = ClassA("A") // --> 引用計數 + 1 a = nil // 2-1 = 1 還剩下 1 所以沒辦法銷毀 ---output------- Hello I am A 由於這邊的 onComplete 宣告為 Optional, 正確的做法要連同 onComplete 一起刪除才可以被回收,若不是 Optional 則會進入無法回收狀態: var b : ClassA? = ClassA("B") b?.onComplete = nil // --> 還好是 Optional 可以設成 nil 計數 - 1 b = nil // 計數 = 0 所以被回收 ---output------- Hello I am B deinit: B 但是做人不需要煩惱太多,這時候就出動 unowned 關鍵字讓物件可以順利被回收: onComplete = { [unowned self] in print...

[書評] 拖延心理學:為什麼我老是愛拖延?是與生俱來的壞習慣,還是身不由己?

作者: Jane B. Burka & Lenora M . Yuen 推薦指數 ★★★★★ 有時候,只是想了解事情發生原因而不是尋求解法 在這邊不是要講這本書的內容,而是想聊它對我的影響。