Arduinoで遊んでみた:その3

【ルーレットゲーム】

対話できるゲームを考えてみました。遊び方はこんな感じ。

  1. Arduinoが「赤(緑、青)で止められますか?」と聞いてきます。(PC画面内に表示)
  2. ボタンを押すと、赤、緑、青とLEDがルーレットのように、すばやく点灯します。
  3. ボタンをもう1回押したら、どれか1つのLEDが点灯して停止します。
  4. 指示通りに止められたら「当たり!」と表示されます。(PC画面内に表示)
  5. 指示通りに止められなかったら「はずれ」と表示されます。(PC画面内に表示)
  6. 次の問題が出題されて、ゲームが繰り返されます。

という、ゲームです。(^o^)

P1080291

P1080293

【作り方】

①回路を作る

赤、緑、青の3つのLEDと、スイッチをつなぎます。焼き切れないように間に抵抗を挟みます。

LEDは上のデジタルコネクタからGND、13、12、11でつなぎ、スイッチは7番と、下のアナログコネクタの5V、GNDとつなぎます。

cap005

②スイッチ(プログラム)を書く

あとは、ルーレットをするプログラムを書きます。

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ボタンで書き込み、実行します。

これでできあがりです。