【ルーレットゲーム】
対話できるゲームを考えてみました。遊び方はこんな感じ。
- Arduinoが「赤(緑、青)で止められますか?」と聞いてきます。(PC画面内に表示)
- ボタンを押すと、赤、緑、青とLEDがルーレットのように、すばやく点灯します。
- ボタンをもう1回押したら、どれか1つのLEDが点灯して停止します。
- 指示通りに止められたら「当たり!」と表示されます。(PC画面内に表示)
- 指示通りに止められなかったら「はずれ」と表示されます。(PC画面内に表示)
- 次の問題が出題されて、ゲームが繰り返されます。
という、ゲームです。(^o^)
【作り方】
①回路を作る
赤、緑、青の3つのLEDと、スイッチをつなぎます。焼き切れないように間に抵抗を挟みます。
LEDは上のデジタルコネクタからGND、13、12、11でつなぎ、スイッチは7番と、下のアナログコネクタの5V、GNDとつなぎます。
②スイッチ(プログラム)を書く
あとは、ルーレットをするプログラムを書きます。
const int GREEN = 11; // LED緑は11番のピンを使う const int BLUE = 12; // LED青は11番のピンを使う const int RED = 13; // LED赤は11番のピンを使う const int BUTTON = 7; // ボタンは7番のピンを使う int val = 0; // ボタンが押されたかを調べる int old_val = 0; // 直前のボタンの状態を覚えておく int state = -1; // ルーレットを回すモード(-1:初回、0:停止モード、1:回転モード) int LED_mode = 0; // LEDの色(0:赤、1:緑、2:青) int r = 0; // 乱数用 int hanteiFlag = 0; // void setup() { // 起動時に行うこと Serial.begin(9600); // 文字出力の準備 pinMode(GREEN, OUTPUT); // LED緑のピンは出力にする pinMode(BLUE, OUTPUT); // LED青のピンは出力にする pinMode(RED, OUTPUT); // LED赤のピンは出力にする pinMode(BUTTON, INPUT); // スイッチのピンは入力にする randomSeed(analogRead(0)); // 乱数の初期化 } void loop() { // ずっと行い続けること val = digitalRead(BUTTON); // ボタンの状態を取得 if ((val == HIGH) && (old_val == LOW)) { // 直前にボタンを押していなくて、今回押したら if (state == 1) { // 回転モードなら state = 0; // 停止モードに } else { // そうでなければ state = 1; // 回転モードに } delay(10); // ボタンの物理ノイズを取るため少し時間待ち } old_val = val; // 直前のボタンの状態として保存する if (state == 1) { // ルーレットを回すモードなら hanteiFlag = 0; // まだ判定していないフラグにして LED_mode++; // LEDの色を変える if (2 < LED_mode) { // 2を越えたら0に戻して0>1>2>0の繰り返しに LED_mode = 0; } LED_ONOFF(); // 指定されたLEDを点灯する delay(50); // 少し時間待ち } else { // 停止モードなら hantei(); // 問題と止まったLEDが同じか判定をする } } void LED_ONOFF(){ // 指定されたLEDを点灯する switch(LED_mode) { case 0: // 0なら 赤だけ点灯 digitalWrite(GREEN, LOW); digitalWrite(BLUE, LOW); digitalWrite(RED,HIGH); break; case 1: // 1なら 緑だけ点灯 digitalWrite(GREEN, HIGH); digitalWrite(BLUE, LOW); digitalWrite(RED, LOW); break; case 2: // 2なら 青だけ点灯 digitalWrite(GREEN, LOW); digitalWrite(BLUE, HIGH); digitalWrite(RED,LOW); break; } } void syutudai() { // 問題を出題する r = random(3); // 乱数で問題の色を決める(0:赤、1:緑、2:青) switch(r) { case 0: // 「赤で止められますか?」と出題 Serial.println("]] [AKA] DE TOMERAREMASUKA ? (?_?)"); break; case 1: // 「緑で止められますか?」と出題 Serial.println("]] [MIDORI] DE TOMERAREMASUKA? (?_?)"); break; case 2: // 「青で止められますか?」と出題 Serial.println("]] [AO] DE TOMERAREMASUKA? (?_?)"); break; } } void hantei() { // 問題と止まったLEDが同じか判定をする if (hanteiFlag == 0) { // まだ判定をしていなかったときだけ判定をする hanteiFlag = 1; // まず判定フラグを1にして判定をしたことにする Serial.println(""); // 改行 if (r == LED_mode) { // 問題と止まったLEDが同じなら Serial.println("ooo Atari !! sugoi !!! (^_^)/ "); // 「当たり」と表示 } else { // 違っていたら Serial.println("xxx Hazure --- (T_T) "); // 「はずれ」と表示 } Serial.println(""); // 改行 syutudai(); // 次の問題を出題する } }
③Uploadボタンで書き込み、実行します。
これでできあがりです。