Arduinoでもぐらたたきゲームを作る

Arduino

今まで習ってきたことの総まとめです。

モグラたたきに必要な機能を考える

モグラたたきに必要な機能は何があるでしょうか。

モグラの制御

モグラのイラストを表示させます。これはLCDの回を学んでいると実現できます。

モグラをランダム表示させる必要があります。これはじゃんけんゲームで使ったrandom()で実現できます。

得点の管理

ボタンを押してモグラをたたくことができれば加点、外してしまった場合は減点、という機能を実装していきます。条件分岐で実現できます。

加点や減点の時に音が出るとユーザーフレンドリーになるので、音も追加していきたいですね。

モグラたたきゲームを作る

下記のコードをコピーして穴埋め問題に解答してみてください。

今回は今までの内容をフル活用するので、分からないところは過去の記事を参照してみてください。

#include <Wire.h>
#include <FaBoLCDmini_AQM0802A.h>

#define pinSw1 5          // SW1は5番ピンへ接続
#define #############     // SW2~4はA2番ピンへ接続
#define pinBuz 9          // ブザーは9番ピンへ接続
FaBoLCDmini_AQM0802A lcd; // LCDライブラリを初期化
int #############;        // モグラの位置(0~3) -1=不在
int #############;        // スコアの初期値

void setup()
{
    pinMode(pinSw1, INPUT_PULLUP); // 5番ピンを入力に設定
    pinMode(pinBuz, OUTPUT);       // 9番ピンを出力に設定
    lcd.begin();
    #######################; // 乱数の種を得る
}

void loop()
{
    if (mogura ######)
    {                                 // モグラはまだ出現していない
        lcd.clear();                  // LCD画面を消去
        ##################;           // 0~3の乱数を発生
        lcd.setCursor(mogura # 2, 0); // カーソルをモグラの位置に移動
        lcd.################;         // モグラを描画
        lcd.################;
        lcd.setCursor(0, 1); // カーソルを下段に移動
        lcd.###############; // スコア表示
    }
    int SwVal = ##################; // SW2~4の値を取得

    if (digitalRead(##########) == LOW)
    {
        if (###########)
        { // SW1を押したらモグラがいた
            hit();
        }
        else
        {
            miss();
        }
    }
    else if (###########)
    {
        if (###########)
        { // SW2を押したらモグラがいた
            hit();
        }
        else
        {
            miss();
        }
    }
    else if (###########)
    {
        if (###########)
        { // SW3を押したらモグラがいた
            hit();
        }
        else
        {
            miss();
        }
    }
    else if (###########)
    {
        if (###########)
        { // SW4を押したらモグラがいた
            hit();
        }
        else
        {
            miss();
        }
    }
}

// モグラを叩いた
void hit()
{
    lcd.######################;   // カーソルをモグラの位置に移動
    lcd.print("  ");              // モグラを消去
    ###########;                  // もうモグラは居ない
    tone(######################); // ブザー鳴動G7
    delay(50);
    tone(######################); // ブザー鳴動D8
    delay(200);                   // 誤作動防止のディレイ
}

// 別の場所を叩いた
void miss()
{
    lcd.######################;   // カーソルを下段に移動
    lcd.###########;              // スコア表示
    tone(######################); // ブザー鳴動G1
    delay(200);                   // 誤作動防止のディレイ
}

こちらが回答例です。あくまで一例なので、想定通り動けばOKです。

#include <Wire.h>
#include <FaBoLCDmini_AQM0802A.h>

#define pinSw1 5          // SW1は5番ピンへ接続
#define pinSw A2          // SW2~4はA2番ピンへ接続
#define pinBuz 9          // ブザーは9番ピンへ接続
FaBoLCDmini_AQM0802A lcd; // LCDライブラリを初期化
int mogura = -1;          // モグラの位置(0~3) -1=不在
int score = 0;            // スコアの初期値

void setup()
{
    pinMode(pinSw1, INPUT_PULLUP); // 5番ピンを入力に設定
    pinMode(pinBuz, OUTPUT);       // 9番ピンを出力に設定
    lcd.begin();
    randomSeed(analogRead(A0)); // 乱数の種を得る
}

void loop()
{
    if (mogura == -1)
    {                // モグラはまだ出現していない
        lcd.clear(); // LCD画面を消去
        mogura = random(0, 4);
        // 0~3の乱数を発生
        lcd.setCursor(mogura * 2, 0); // カーソルをモグラの位置に移動
        lcd.write(0b00101110);        // モグラを描画
        lcd.write(0b00011110);
        lcd.write(0b00101110);
        lcd.setCursor(0, 1); // カーソルを下段に移動
        lcd.print(++score);  // スコア表示
    }

    int SwVal = analogRead(pinSw);

    if (digitalRead(pinSw1) == LOW)
    {
        if (mogura == 0)
        { // SW1を押したらモグラがいた
            hit();
        }
        else
        {
            miss();
        }
    }
    else if (SwVal < 200)
    {
        if (mogura == 1)
        { // SW2を押したらモグラがいた
            hit();
        }
        else
        {
            miss();
        }
    }
    else if (SwVal < 500)
    {
        if (mogura == 2)
        { // SW3を押したらモグラがいた
            hit();
        }
        else
        {
            miss();
        }
    }
    else if (SwVal < 900)
    {
        if (mogura == 3)
        { // SW4を押したらモグラがいた
            hit();
        }
        else
        {
            miss();
        }
    }
}

// モグラを叩いた
void hit()
{
    lcd.setCursor(mogura * 2, 0); // カーソルをモグラの位置に移動
    lcd.print(" ");               // モグラを消去
    mogura = -1;                  // もうモグラは居ない
    tone(pinBuz, 3136, 50);       // ブザー鳴動G7
    delay(50);
    tone(pinBuz, 4699, 50); // ブザー鳴動D8
    delay(200);             // 誤作動防止のディレイ
}

// 別の場所を叩いた
void miss()
{
    lcd.setCursor(0, 1);    // カーソルを下段に移動
    lcd.print(--score);     // スコア表示
    tone(pinBuz, 196, 200); // ブザー鳴動G1
    delay(200);             // 誤作動防止のディレイ
}

まとめ

お疲れ様でした。今回でArduinoに最低限必要な知識を学ぶことができました。

全6回の講義からは漏れますが、覚えておいて損がない知識を下記にまとめておいたのでぜひご覧ください。

リファレンスもこちらに置いておくので、Arduinoを極めたい方はこちらもぜひ。

英語版(公式)

Arduino Reference - Arduino Reference
The Arduino programming language Reference, organized into Functions, Variable and Constant, and Structure keywords.

日本語版(株式会社武蔵野電波様)

Arduino 日本語リファレンス