Arduinoとタッチスクリーンで作る三目並べゲーム:ステップバイステップチュートリアル
必要なパーツと用品
| パーツ | 数量 |
|---|---|
| Arduino UNO | 1 |
| 2.8インチ タッチスクリーン | 1 |
使用するアプリとオンラインサービス
- Arduino IDE
プロジェクト概要
みなさん、こんにちは!今回の詳細なチュートリアルでは、Arduinoを使って三目並べ(ティックタックトー)ゲームを作ります。タッチスクリーンを使用し、コンピューター(Arduino)と対戦します。シンプルな三目並べは、ゲームプログラミングと人工知能への優れた入門になります。このゲームではAIアルゴリズムを使用しませんが、より複雑なゲームでなぜAIアルゴリズムが必要になるかを理解できます。
Arduinoでゲームを開発するのは簡単ではなく、多くの時間を要します。しかし、シンプルなゲームなら作成可能で、楽しみながら人工知能などの高度なプログラミングトピックを探求できます。素晴らしい学習体験となり、最後には子供たちも楽しめるゲームが完成します!
ステップ1:パーツを揃える
このプロジェクトに必要なパーツは以下の通りです:
- Arduino Uno
- 2.8インチ タッチスクリーン
プロジェクトのコストは非常に低く、約15ドル(約2,200円)です。
このプロジェクトを始める前に、タッチディスプレイについて解説した動画をご覧になることをお勧めします。コードの理解とタッチスクリーンのキャリブレーションに役立ちます。
ステップ2:Arduino用2.8インチタッチカラーディスプレイ
このタッチスクリーンはBanggood.comで見つけ、いくつかのプロジェクトで試すために購入しました。ご覧の通り、このディスプレイは安価で、約11ドル(約1,600円)です。
解像度: 320×240ピクセル
形状: シールドタイプで、Arduino Unoへの接続が非常に簡単
このシールドを使用すると、Arduino Unoのデジタルピンとアナログピンのほとんどを占有し、残りはデジタルピン2本とアナログピン1本のみとなります。ただし、Arduino Megaでも正常に動作するため、より多くのピンが必要な場合はMegaを使用できます。残念ながら、Arduino DueやWemos D1 ESP8266ボードでは動作しません。また、マイクロSDスロットを備えており、簡単に使用できます。
ステップ3:プロジェクトの組み立てとテスト
スクリーンをArduino Unoに接続したら、コードをアップロードしてプレイできます。
最初に「Start Game」ボタンを押すとゲームが開始します。Arduinoが先手を打ちます。その後、画面をタッチして自分の手を置きます。Arduinoが次の手を打ち、これを繰り返します。自分のマークを横、縦、または斜めに3つ並べたプレイヤーが勝利です。ゲーム終了時には「Game Over」画面が表示され、「Play Again」ボタンで再開できます。
Arduinoはこのゲームが非常に得意で、ほとんどのゲームで勝つか、上手なプレイヤー相手でも引き分けに持ち込みます。人間プレイヤーに勝機を与えるため、意図的にアルゴリズムにミスをさせています。コードに2行追加するだけで、Arduinoを負けない(必勝・引き分け以上)アルゴリズムに変更可能です。たった2ドルのチップ(ArduinoのCPU)が、なぜ人間の脳に勝てるのか?私たちが開発したプログラムは人間の脳より賢いのか?
ステップ4:ゲームアルゴリズム
この疑問に答えるため、実装したアルゴリズムを見てみましょう。
コンピューターは常に先手です。この決定だけで、Arduinoが勝ちやすくなります。
最初の手:常にコーナー(四隅のいずれか)
2手目:残りのコーナーからランダムに選択(プレイヤーの手は考慮しない)
3手目以降:
- プレイヤーが次の手で勝てるかチェックし、勝てる場合はその手をブロック
- プレイヤーが1手で勝てない場合、空いているコーナーがあればそこを、なければ残りからランダムに選択
このシンプルなアルゴリズムで、人間プレイヤーに毎回勝つか、最悪でも引き分けにできます。これが最強のアルゴリズムではありませんが、最もシンプルなものの一つです。
三目並べは非常にシンプルなゲームなので、ゲームツリーを設計して勝利戦略を発見し、コードに実装するか、CPUにリアルタイムでゲームツリーを計算させて最善手を選ばせることが容易です。しかし、チェスのようなゲームでは、最速のコンピューターを使ってもゲームツリーを千年かけても計算しきれません。このようなゲームには、別のアプローチ、すなわち人工知能アルゴリズムと膨大な処理能力が必要です。これについては今後の動画で解説予定です。
ステップ5:プロジェクトのコード
コードをざっと見てみましょう。コンパイルには以下の3つのライブラリが必要です:
- Modified Adafruit TFTLCD
- Adafruit GFX
- Touchscreen
このシンプルなゲームでも600行以上のコードが必要です。複雑なので詳細な解説は省きますが、Arduinoの手を決めるアルゴリズムの実装部分を紹介します。
最初の2手:ランダムなコーナーを選択
int firstMoves[] = {0, 2, 6, 8}; // 最初に使用する位置(コーナー)
for (counter = 0; counter < 4; counter++) {
if (board[firstMoves[counter]] != 0) {
movesPlayed++;
}
}
do {
if (moves <= 2) {
int randomMove = random(4);
int c = firstMoves[randomMove];
if (board[c] == 0) {
delay(1000);
board[c] = 2;
drawCpuMove(firstMoves[randomMove]);
b = 1;
}
}
各ラウンドでプレイヤーの勝利手をチェック
int checkOpponent() {
if (board[0]==1 && board[1]==1 && board[2]==0) return 2;
else if (board[0]==1 && board[1]==0 && board[2]==1) return 1;
else if (board[1]==1 && board[2]==1 && board[0]==0) return 0;
else if (board[3]==1 && board[4]==1 && board[5]==0) return 5;
else if (board[4]==1 && board[5]==1 && board[3]==0) return 3;
else if (board[3]==1 && board[4]==0 && board[5]==1) return 4;
else if (board[1]==0 && board[4]==1 && board[7]==1) return 1;
else return 100;
}
プレイヤーが勝てる手があれば、それをブロックします(ただし、人間に勝機を与えるため、すべての手をブロックするわけではありません。どの手がブロックされないか、コードから見つけられますか?)。ブロック後、残りのコーナーまたはランダムな手を打ちます。コードを研究して、独自の必勝アルゴリズムを実装してみてください。コードはこのチュートリアルに添付されています。
注意: Banggoodでは同じディスプレイでも2種類のドライバーが存在します。上記のコードが動作しない場合、initDisplay関数を以下に変更してください:
void initDisplay() {
tft.reset();
tft.begin(0x9341);
tft.setRotation(3);
}
ステップ6:最終的な考察と改善点
ご覧の通り、Arduino Unoでもシンプルなゲームなら必勝アルゴリズムを構築できます。このプロジェクトは組み立てが簡単で、かつ人工知能とゲームプログラミングへの優れた入門になります。今後、よりパワフルなRaspberry Piを使って、より高度なAIプロジェクトに挑戦したいと思います。ご意見・ご感想をお待ちしています!
コード
完全なコードはGitHubリポジトリで公開されています:
製造プロセス
- チェス:古代起源から現代製造まで——専門家の概観
- Arduino NanoとMPU-6050で作るリアルタイムジャイロスコープゲーム
- Arduino UNOとOLEDディスプレイでクラシックPongゲームを自作:ステップバイステップチュートリアル
- Arduinoで携帯型静電容量タッチピアノを自作:MPR121シールド活用・ステップバイステップ
- DIY Arduino USBゲームコントローラー - 高性能ゲームパッドを自作
- Arduino NanoとMAX7219で作る24×16 LEDポングゲーム機
- Arduinoタッチブレークアウトゲーム:2.4インチTFT LCDでクラシックアーケードを再現
- 巨大レゴミニフィグ・アニマトロニクス「オペレーション」ゲームをArduinoで自作
- Pixel Chaser: Arduino Nanoで作るワンタップLEDゲーム
- Arduinoで自動化するChrome恐竜ゲーム – LDRとPythonで障害物を検知してジャンプ
- Arduino UNOで作る静電容量式タッチLEDスイッチ - 簡単DIY