こんにちは、猫子です。(プロフィールはこちら)
リクエストがあったので、今回はくじ引きゲームです。
(TicTokから見つけて頂きありがとうございます!)
Arduinoと液晶を使って簡単なゲームを作ります!
3つのボタンのうち、1つだけ当たりがあるという簡単なゲームです。
動作
動作の様子です。@nekoko_nyazak Lottery Game ##DIY ##arduino ##LCD ##toy ##programming ##電子工作 ##自作ゲーム
♬ Yes Or Yes (Extended Instrumental Mix) - Kar4sing
- "Choose a button"と表示される
- プレイヤーは1つのボタンを押す
- 当たりなら”You win!”と表示され、LEDが光る
- ハズレなら"You lose..."と表示される
リセットする度に当たりボタンがランダムに変更されます。
回路の配線
液晶の配線はこちらを参照ボタンはデジタルピン2,3,4 (INPUT) + 抵抗各10kΩ、
LEDがデジタルピン5 (OUTPUT) + 抵抗220Ωです。
配線はこんな感じ。
いつもテーブルクロスの主張が大きくてすみません...(^^;)
ソースコード
#include <LiquidCrystal.h> LiquidCrystal lcd(7, 8, 9, 10, 11, 12); int swA = 0; int swB = 0; int swC = 0; int num_com; int num_player; void setup() { lcd.begin(16, 2); pinMode(2, INPUT); pinMode(3, INPUT); pinMode(4, INPUT); pinMode(5, OUTPUT); lcd.setCursor(0, 0); lcd.print("Choose a button!"); randomSeed(analogRead(A0)); num_com = random(3); } void loop() { swA = digitalRead(2); swB = digitalRead(3); swC = digitalRead(4); if (swA == HIGH || swB == HIGH || swC == HIGH) { if (swA == HIGH) { num_player = 0; } else if (swB == HIGH) { num_player = 1; } else if (swC == HIGH) { num_player = 2; } if (num_com == num_player) { lcd.clear(); lcd.setCursor(0, 0); lcd.print("You won!(^O^)"); lcd.setCursor(0, 1); lcd.print("Congratulations!"); digitalWrite(5,HIGH); } else { lcd.clear(); lcd.setCursor(0, 0); lcd.print("You Lose...(x_x)"); lcd.setCursor(0, 1); lcd.print("Try Again..."); digitalWrite(5,LOW); } } }
ソースコード解説
液晶
液晶ライブラリをインクルードし、ピンの設定をします。#include <liquidcrystal.h> LiquidCrystal lcd(7, 8, 9, 10, 11, 12);
セットアップの中で液晶を初期化します。引数は、(一行の文字数, 行数)です。
lcd.begin(16, 2);ここまでが初期設定です。
スターターキットのHITACHI HD44780を使用する場合は毎回同じで大丈夫です。
初期設定ができたら、文字を書きたい場所にカーソルの位置をセットします。
lcd.setCursor(0, 0);引数は( 〇文字目, 〇行目)です。(0から始まります)
カーソルをセットした位置から、文字を出力します。
lcd.print("Choose a button!");
乱数と、乱数の種
乱数(ランダムな数)を発生させます。ゲームでは、サイコロやガチャなど、ランダムな数が必要になる場面がたくさんあります。
Arduinoでは、random関数で乱数を生成することができます。
今回は、リセット時に当たりボタンを決めます。
num_com = random(3);関数randamに3をセットすると [0,1,2] の3つの数から一つが選択され、num_comに格納されます。num_comは「コンピューターが選んだ数」の意で名付けました。ネーミングセンス…
さて、これだけだと困ったことにnum_comは毎回同じ数になってしまいます。
なぜかというと、予めArduinoには乱数の数列が収録されていて、それを先頭から出しているだけだからです。ランダムに作られためちゃくちゃ長い数列があるけど、それはいつも同一なのです。
そこで、randomを行う前にrandomSeed()をしておくと、開始点がランダムに選ばれ、真にランダムな数を作ることができます。
randomSeed(analogRead(A0));randomSeed()の引数には使用していないアナログピンを選択します。
今回の回路ではA0ピンはどこにも接続されていない(=浮いている)状態なので、ノイズが乗っています。
そのノイズを種にすることで、リセット毎に違う乱数を発生させることができるのです。
ボタン判定
メインループの処理を解説します。swA = digitalRead(2); swB = digitalRead(3); swC = digitalRead(4);
ループでは常に3つのスイッチ(A,B,C)が押された(HIGH)か押されていない(LOW)か見張っています。 どれか1つでも押されると、ifの中に入ります。
if (swA == HIGH || swB == HIGH || swC == HIGH) { ........ }
どのボタンがオンになっているかチェックし、num_playerに格納します。
num_playerは、「プレイヤーが選んだ数」という意味で名づけたよ。
num_playerの値は
ボタンAがONのとき: 0
ボタンBがONのとき: 1
ボタンCがONのとき: 2
となります。ちなみに同時に押されたときは若い方が優先です。
当たり判定
最後にコンピューターの番号(num_com)とプレイヤーが選んだ番号(num_player)が一致しているか判定します。判定に応じて、メッセージとLEDのON/OFFを切り替えます。
感想&子供達の反応
ちょっと単純すぎるかなと思ったけど、うちの子たちには大うけでした! 小さい子はこういう運ゲー好きだよね!表示をグーチョキパーにしてじゃんけんゲーム作っても楽しそう。
こういうやつ。令和にもあるのかな…(^v^)
Doripoke - 利用者:Doripokeによる撮影、栃木県内のスーパー銭湯ゲームコーナー, CC 表示-継承 3.0, リンクによる
またいつかじゃんけんゲームバージョンも作ってみたいと思います。
これは音声あるほうが楽しそうだな~
にほんブログ村に参加中。いいね!と思ったらクリックしてね
最後までお読みいただきありがとうございました!
質問、リクエストなどお気軽にどうぞ~(^^)
▼今回使用した部品が全部入っている便利なスターターキットはこちら▼
▼Arduino UNOボード単体はこちら▼
コメント