Arduino TouchTic-Tac-Toeゲーム
コンポーネントと消耗品
> |
| × | 1 | |||
| × | 1 |
アプリとオンラインサービス
> |
|
このプロジェクトについて
<図> <図> <図>
親愛なる友人、別のArduinoチュートリアルへようこそ!この詳細なチュートリアルでは、ArduinoTic-Tac-Toeゲームを作成します。ご覧のとおり、私たちはタッチスクリーンを使用しており、コンピューターと対戦しています。 Tic-Tac-Toeのような単純なゲームは、ゲームプログラミングと人工知能の優れた入門書です。このゲームでは人工知能アルゴリズムを使用しませんが、より複雑なゲームで人工知能アルゴリズムが必要な理由を理解できます。
Arduino用のゲームの開発は簡単ではなく、多くの時間を必要とします。ただし、Arduino用の簡単なゲームを作成することはできます。これは、楽しく、人工知能などのより高度なプログラミングトピックを探索できるためです。それは素晴らしい学習体験であり、最後には子供たちのための素晴らしいゲームがあります!
このプロジェクトを作成しましょう。
ステップ1:すべての部品を入手する <図>
このプロジェクトを構築するために必要な部品は次のとおりです。
- Arduino Uno
- 2.8インチのタッチスクリーン
プロジェクトの費用は非常に低いです。たったの15ドルです。
このプロジェクトを構築する前に、こちらのカードをクリックして、タッチディスプレイについて準備したビデオをご覧ください。コードを理解し、タッチスクリーンを調整するのに役立ちます。
ステップ2:Arduino用の2.8インチタッチカラーディスプレイ <図> <図>
私はbanggood.comでこのタッチスクリーンを発見し、いくつかのプロジェクトで使用するために購入することにしました。ご覧のとおり、ディスプレイは安価で、約$ 11かかります。
ここで入手してください。
ディスプレイは320x240ピクセルの解像度を提供し、Arduinoとの接続を非常に簡単にするシールドとして提供されます。ご覧のとおり、ディスプレイはArduinoUnoのほとんどすべてのデジタルピンとアナログピンを使用しています。このシールドを使用すると、プロジェクト用に2つのデジタルピンと1つのアナログピンだけが残ります。幸い、ディスプレイはArduino Megaでも正常に機能するため、より多くのピンが必要な場合は、ArduinoUnoの代わりにArduinoMegaを使用できます。残念ながら、このディスプレイはArduinoDueまたはWemosD1ESP8266ボードでは機能しません。シールドのもう1つの利点は、非常に使いやすいマイクロSDスロットを提供することです。
ステップ3:プロジェクトの構築とテスト <図> <図> <図>
画面をArduinoUnoに接続したら、コードをロードして再生する準備が整います。
まず、「ゲーム開始」ボタンを押すとゲームが始まります。 Arduinoが最初に再生されます。その後、画面に触れるだけで動きを再生できます。その後、Arduinoはその動きを再生します。 3つのマークを水平、垂直、または斜めの列に配置することに成功したプレーヤーがゲームに勝ちます。ゲームオーバーになると、ゲームオーバー画面が表示されます。その後、[もう一度再生]ボタンを押して、ゲームを再開できます。
Arduinoはこのゲームがとても得意です。ほとんどのゲームに勝ちます。または、あなたが非常に優れたプレーヤーである場合、ゲームは引き分けで終了します。私は、人間のプレイヤーに勝つチャンスを与えるために、いくつかの間違いを犯すようにこのアルゴリズムを意図的に設計しました。ゲームのコードにさらに2行追加することで、Arduinoがゲームに負けることを不可能にすることができます。しかし、2ドルのチップであるArduino CPUは、どうすれば人間の脳を打ち負かすことができるのでしょうか。私たちが開発したプログラムは人間の脳よりも賢いですか?
ステップ4:ゲームアルゴリズム <図> <図>
この質問に答えるために、私が実装したアルゴリズムを見てみましょう。
コンピュータが常に最初に再生されます。この決定だけで、Arduinoが勝つためのゲームがはるかに簡単になります。最初の動きは常にコーナーです。 Arduinoの2番目の動きも、プレーヤーの動きをまったく気にせずに、残りの部分からランダムなコーナーになります。この時点から、Arduinoは最初に、プレーヤーが次の動きで勝つことができるかどうかを確認し、その動きをブロックします。プレーヤーが1回の移動で勝てない場合、利用可能な場合はコーナー移動を再生し、残りの移動からランダムに移動します。それだけです。この単純なアルゴリズムは、毎回、または最悪の場合、ゲームが引き分けになるシナリオで、人間のプレーヤーを打ち負かすことができます。これは最高の三目並べアルゴリズムではありませんが、最も単純なアルゴリズムの1つです。
Tic-Tac-Toeゲームは非常にシンプルであり、簡単に分析して解決できるため、このアルゴリズムはArduinoで簡単に実装できます。ゲームツリーを設計すると、いくつかの勝利戦略を見つけてコードで簡単に実装できます。または、CPUにゲームツリーをリアルタイムで計算させて、それ自体で最適な動きを選択することもできます。もちろん、このゲームで使用するアルゴリズムは非常に単純です。これは、ゲームが非常に単純だからです。チェスの勝利アルゴリズムを設計しようとすると、最速のコンピューターを使用しても、1000年でゲームツリーを計算することはできません。このようなゲームには、別のアプローチが必要です。人工知能アルゴリズムと、もちろん巨大な処理能力が必要です。これについては、今後のビデオで詳しく説明します。
ステップ5:プロジェクトのコード <図>
プロジェクトのコードを簡単に見てみましょう。コードをコンパイルするには、3つのライブラリが必要です。
- 変更されたAdafruitTFTLCD
- Adafruit GFX
- タッチスクリーン
ご覧のとおり、このような単純なゲームでも、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);ボード[c] =2; Serial.print(firstMoves [randomMove]); Serial.println(); 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;それ以外の場合は100を返します;}
はいの場合、ほとんどの場合、その移動をブロックします。人間のプレイヤーに勝つチャンスを与えるために、すべての動きをブロックするわけではありません。どの動きがブロックされていないかわかりますか?移動をブロックした後、残りのコーナー、またはランダムな移動を再生します。コードを研究して、独自の無敵のアルゴリズムを簡単に実装できます。いつものように、このチュートリアルに添付されているプロジェクトのコードを見つけることができます。
注:Banggoodは2つの異なるディスプレイドライバーで同じディスプレイを提供するため、上記のコードが機能しない場合は、initDisplay関数を次のように変更してください。
void initDisplay(){tft.reset(); tft.begin(0x9341); tft.setRotation(3);}
graphics.c TicTacToeEasy.ino
ステップ6:最終的な考えと改善 <図>
ご覧のとおり、Arduino Unoを使用しても、単純なゲーム用の無敵のアルゴリズムを構築できます。このプロジェクトは、構築が簡単であると同時に、人工知能とゲームプログラミングの優れた入門書であるため素晴らしいものです。今後は、より強力なRaspberry Piを使用して、人工知能を使用したより高度なプロジェクトを構築しようと思いますので、ご期待ください。このプロジェクトについてのご意見をお聞かせください。
以下にコメントを投稿してください。興味がある場合は、チュートリアルを気に入ってください。ありがとう!
コード
- コードスニペット#1
- コードスニペット#2
コードスニペット#1 プレーンテキスト
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);ボード[c] =2; Serial.print(firstMoves [randomMove]); Serial.println(); drawCpuMove(firstMoves [randomMove]); b =1; }}
コードスニペット#2 プレーンテキスト
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;それ以外の場合は100を返します;}
Github
https://github.com/adafruit/Adafruit-GFX-Libraryhttps://github.com/adafruit/Adafruit-GFX-LibraryGithub
https://github.com/adafruit/Touch-Screen-Libraryhttps://github.com/adafruit/Touch-Screen-Library製造プロセス