工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Manufacturing Technology >> 製造プロセス

Arduino Dueで作るタッチスクリーン三目並べゲーム

必要な部品

部品数量
Arduino Due1
2.8インチTFT LCD(タッチスクリーン付き、ILI9341等)1
ジャンパーワイヤ1式

必要なライブラリ

配線

タッチスクリーン側

タッチピンArduino Dueピン
T_IRQ22
T_DO24
T_DIN26
T_CS28
T_CLK30

ディスプレイ側

ディスプレイピンArduino Dueピン
SDO (MISO)A25
LED (バックライト)3.3V
SCKA27
SDI (MOSI)A26
DC9
RESET8
CS10
GNDGND
VCC3.3V

Arduino Dueで作るタッチスクリーン三目並べゲーム

プロジェクト概要

Nickthegreek82氏の「Arduino Touch Tic Tac Toe Game」をベースに、AIを強化しコードを最適化した版です。2.8インチタッチスクリーン上でCPUと対戦できます。

開発履歴

実装されている2つのバージョン

バージョン1:基本版(TIC TAC TOE)

バージョン2:強化版(TicTacToe_new - ミニマックスAI)

主要コード構成(強化版)

盤面管理

int board[9] = {0,0,0,0,0,0,0,0,0}; // 0=空, 1=CPU(○), -1=プレイヤー(×)

勝利判定


int win(const int board[9]) {
  unsigned wins[8][3] = {{0,1,2},{3,4,5},{6,7,8},{0,3,6},{1,4,7},{2,5,8},{0,4,8},{2,4,6}};
  for (int i=0; i<8; ++i) {
    if (board[wins[i][0]] != 0 && 
        board[wins[i][0]] == board[wins[i][1]] && 
        board[wins[i][0]] == board[wins[i][2]])
      return board[wins[i][2]];
  }
  return 0;
}

ミニマックス探索


int minimax(int board[9], int player, int depth) {
  int winner = win(board);
  if (winner != 0) return winner * player; // 視点統一

  int move = -1, score = -2;
  for (int i=0; i<9; ++i) {
    if (board[i] == 0) {
      board[i] = player;
      int thisScore = (depth < difficulty) ? -minimax(board, -player, depth+1) : 0;
      board[i] = 0;
      if (thisScore > score) { score = thisScore; move = i; }
    }
  }
  return (move == -1) ? 0 : score;
}

CPU手選択


void computerMove(int board[9]) {
  int move = -1, score = -2;
  for (int i=0; i<9; ++i) {
    if (board[i] == 0) {
      board[i] = 1;
      int tempScore = -minimax(board, -1, 0);
      board[i] = 0;
      if (tempScore > score) { score = tempScore; move = i; }
    }
  }
  board[move] = 1;
  drawCpuMove(move);
}

タッチ入力処理


void playerMove(int board[9]) {
  int move = 0; bool wait = true;
  do {
    if (myTouch.dataAvailable()) {
      myTouch.read();
      x = myTouch.getX(); y = myTouch.getY();
      // 9マスの座標判定(各セル約70×70ピクセル)
      if (x>55 && x<125 && y>0 && y<80 && board[0]==0) { move=0; wait=false; }
      // ... 他8マス同様 ...
    }
  } while (wait);
  board[move] = -1;
  drawPlayerMove(move);
}

ビットマップ描画(PROGMEM格納)

○(赤)と×(青)を65×65ピクセルのビットマップとしてフラッシュメモリに格納し、drawBitmap()で高速描画。

遊び方

  1. 起動時「Gamestart」ボタンをタッチ
  2. 「YOU」で先手、「CPU」で後手を選択
  3. 3×3グリッドの任意のセルをタッチして×を置く
  4. CPUが自動で○を置く
  5. 勝敗または引き分けで「GAME OVER」表示、「Again?」でリプレイ

カスタマイズのヒント

製造プロセス

  1. 名刺サイズPCBで作る4×4三目並べゲーム - 設計・製作・プログラミングガイド
  2. K30 CO2センサで室内空気質をリアルタイム監視する
  3. 1SheeldとArduinoで盲ろう者のコミュニケーションを支援する
  4. スマート貯金箱を作ろう:Arduino Nanoでコインアクセプターを制御
  5. ArduinoでBluetooth経由でLEDを制御 – シンプルDIYガイド
  6. DFRobot静電容量式指紋センサーをArduino/ESP8266で使う – 登録・認証・削除の完全ガイド
  7. Arduino MegaとNextion HMIで作る高機能ウェザーステーション
  8. Arduinoベースのヌンチャク操作6自由度ロボットアームキット
  9. Arduino UNOとEthernetシールドで太陽放射を測定する自作ピラノメーター
  10. コンパクトなArduinoレーダーシステム – HC-SR04超音波センサー & 1.8インチST7735ディスプレイ搭載
  11. Arduinoで楽器演奏:音階生成のステップバイステップガイド