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

Arduino UNOで16×16 LEDマトリックス上にスネークゲームを構築

必要なコンポーネントと用品

パーツ 数量 備考
Arduino UNO 1
RGB LEDピクセルマトリックス(NeoPixel NeoMatrix) 1 私はAliExpressで購入: リンク
ジャンパーワイヤー(汎用) 1
アナログジョイスティック(汎用) 1
ブレッドボード(汎用) 1

プロジェクト概要

Arduinoを学習中に、昔のNokia携帯電話のスネークゲームを再現してみました。16×16 LEDマトリックス、ジョイスティック、Arduino UNOを使用しています。各LEDが直列に接続されているため、移動ロジックが少しトリッキーでした。

スネークを操作してエサを食べ、体を伸ばし、壁や自分にぶつかるとゲームオーバーです。コードは拡張しやすい構造になっています。

楽しんでください!気に入ったらYouTubeとInstagramの登録もお願いします(ロシア語ですが、近々字幕を追加予定)。

Arduino UNOで16×16 LEDマトリックス上にスネークゲームを構築
Arduino UNOで16×16 LEDマトリックス上にスネークゲームを構築
Arduino UNOで16×16 LEDマトリックス上にスネークゲームを構築

コード全文

#include <FastLED.h> // マトリックス設定
#define NUM_LEDS 256
#define DATA_PIN 3
#define BRIGHTNESS 8

// ジョイスティック設定
#define pinX A2 // X軸
#define pinY A1 // Y軸
#define swPin 2 // ジョイスティックボタン

int snake[256];       // スネークの要素配列
int snakeSize = 2;    // 実際のスネーク長
int snakeSpeed = 500; // ゲーム速度
int row, col;         // 行・列番号
int lastDirection = 135; // 初期方向
int i, newDirection, OlddX = 1, OlddY, f;
int red, green, blue, fred, fgreen, fblue; // 色
CRGB leds[NUM_LEDS];

void setup() {
  red = random(0, 255);
  green = random(0, 255);
  blue = random(0, 255);
  fred = random(127, 255);
  fgreen = random(127, 255);
  fblue = random(127, 255);
  Serial.begin(9600);
  pinMode(pinX, INPUT);
  pinMode(pinY, INPUT);
  pinMode(swPin, INPUT);
  digitalWrite(swPin, HIGH);
  FastLED.addLeds<NEOPIXEL, DATA_PIN>(leds, NUM_LEDS);
  FastLED.setBrightness(BRIGHTNESS);
  for (i = 0; i <= 255; i++) snake[i] = 0;
  for (i = 0; i <= snakeSize; i++) snake[i] = lastDirection + i;
  f = random(0, 255);
  FastLED.show();
}

// ジョイスティック入力から次の方向を計算
int Snakedirection(int last, int dX, int dY) {
  dX = map(dX, 0, 1000, -1, 1);
  dY = map(dY, 0, 1000, -1, 1);
  if (dX == 0 && dY == 0 && OlddX != dX) dX = OlddX;
  if (dY == 0 && dX == 0 && OlddY != dY) dY = OlddY;
  int newDirection = last;
  if (dX != 0) { // X方向移動
    if (row & 1) { // 偶数行
      if (col == 0 && dX == 1) newDirection = last - 15;
      else if (col == 15 && dX == -1) newDirection = last + 15;
      else newDirection = last + dX;
    } else { // 奇数行
      if (col == 0 && dX == 1) newDirection = last + 15;
      else if (col == 15 && dX == -1) newDirection = last - 15;
      else newDirection = last - dX;
    }
  }
  if (dY < 0) { // Y下方向
    if (row == 15 && dY == -1) newDirection = col;
    else if (row & 1) newDirection = last + (col * 2) + 1;
    else newDirection = last + (16 - col - 1) + (16 - col);
  }
  if (dY > 0) { // Y上方向
    if (row == 0 && dY == 1) newDirection = 255 - col;
    else if (row & 1) newDirection = last - (last - 16 * row) - (16 - col);
    else newDirection = last - (col * 2) - 1;
  }
  OlddX = dX;
  OlddY = dY;
  return newDirection;
}

// スネーク移動処理
int snakeMove(int snakeDirection) {
  for (i = 0; i <= 255; i++) {
    if (snake[i] == snakeDirection) death(); // 自己衝突判定
  }
  FastLED.clear();
  for (i = snakeSize; i >= 1; i--) snake[i] = snake[i - 1];
  snake[0] = snakeDirection;
  for (i = 0; i <= 255; i++) {
    if (snake[i]) leds[snake[i]].setRGB(red, green, blue);
  }
  FastLED.show();
  row = (int)(snakeDirection / 16);
  if (row & 1) col = (row + 1) * 16 - snakeDirection - 1;
  else col = snakeDirection - row * 16;
  return snakeDirection;
}

// エサ処理
void food(int eaten) {
  if (eaten == f) { // エサを食べた
    snakeSize++;
    f = random(0, 255);
    red = fred; green = fgreen; blue = fblue;
    fred = random(0, 255);
    fgreen = random(0, 255);
    fblue = random(0, 255);
    snakeSpeed = snakeSpeed / 1.1; // 徐々に高速化
  } else {
    leds[f].setRGB(fred, fgreen, fblue);
    FastLED.show();
  }
}

// ゲームオーバー
void death() {
  snakeSize = 2;
  snakeSpeed = 500;
  red = 255; green = 0; blue = 0; // 赤く点滅
}

// ジョイスティックボタンで色変更
void color(boolean sw) {
  if (!sw) {
    red = random(0, 255);
    green = random(0, 255);
    blue = random(0, 255);
  }
}

void loop() {
  color(digitalRead(swPin));
  newDirection = Snakedirection(lastDirection, analogRead(pinX), analogRead(pinY));
  lastDirection = snakeMove(newDirection);
  food(newDirection);
  delay(snakeSpeed);
}

回路図

Arduino UNOで16×16 LEDマトリックス上にスネークゲームを構築

製造プロセス

  1. DIY Arduino USBゲームコントローラー - 高性能ゲームパッドを自作
  2. Arduino NanoとMAX7219で作る24×16 LEDポングゲーム機
  3. 自作16×8 LEDマトリックスでテトリスゲーム:Arduino Nano実装
  4. ArduinoでBluetooth経由でLEDを制御 – シンプルDIYガイド
  5. PIRセンサー連動 インタラクティブLEDマトリクスドアディスプレイ - ホリデーグリーティング
  6. スマートArduino四足歩行ロボットの製作:ステップバイステップガイド
  7. Pixel Chaser: Arduino Nanoで作るワンタップLEDゲーム
  8. Arduino Nanoで作る8×8 LEDマトリックスのフリップクロック - 自作リアルタイムクロック
  9. Arduino RGB LEDカラーミキサー:初心者向けDIYプロジェクト
  10. Arduino Unoで8×8 LEDマトリックスを制御:ステップバイステップガイド
  11. Arduino NanoとWS2812 LEDストリップで作る1次元ポンゲーム - 完全DIYガイド