いろいろとChatGptと事前にいろいろとやり取りをしたのちに、プログラムの概要を頭で構築、
CHATGPTへ指示、いろいろとデバックした結果、
ある程度動くサンプルが「下記のこれがその成果」
CHATGPTへの要求仕様書
PACMAN_SIZE
を追加し、パックマンと敵のサイズを5x5ドットの円形に変更しました。- パックマンと敵の位置の更新部分を円形に修正し、切れ目のないシームレスな動きを実現しました。
- パックマンと敵が交差するごとに敵の色が変更されるようにしました。
- 進行方向は双方同一となっています。
- パックマンが1周するごとに敵の速度が1上がるように修正しました。
- パックマンが敵に追いついた場合、敵の速度がリセットされ、敵の動作が停止するようになります。味方が16ドット移動する間、敵の動作は停止します。
#include <Adafruit_GFX.h>
#include <Adafruit_NeoMatrix.h>
#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
#include <avr/power.h>
#endif
#define PIN 5 // 出力ピン番号
#define MATRIX_WIDTH 32 // マトリクスの幅
#define MATRIX_HEIGHT 8 // マトリクスの高さ
Adafruit_NeoMatrix matrix = Adafruit_NeoMatrix(MATRIX_WIDTH, MATRIX_HEIGHT, PIN,
NEO_MATRIX_TOP + NEO_MATRIX_LEFT + NEO_MATRIX_COLUMNS + NEO_MATRIX_ZIGZAG,
NEO_GRB + NEO_KHZ800);
const uint16_t RED = matrix.Color(255, 0, 0);
const uint16_t ENEMY_COLORS[] = { matrix.Color(255, 255, 0), matrix.Color(0, 255, 255), matrix.Color(0, 255, 0), matrix.Color(255, 0, 255) };
int enemyColorIndex = 0; // 敵の色のインデックス
// パックマンの初期位置
int16_t pacmanX = 0;
int16_t pacmanY = MATRIX_HEIGHT / 2;
int16_t pacmanSpeed = 1; // パックマンの移動速度
// 敵の初期位置
int16_t enemyX = MATRIX_WIDTH - 1;
int16_t enemyY = MATRIX_HEIGHT / 2;
int16_t enemySpeed = -2; // 敵の移動速度
int16_t pacmanDistance = 0; // パックマンの進行距離
bool enemyStopped = false; // 敵が停止中かどうかのフラグ
int16_t enemyStopDuration = 1000; // 敵の停止時間(ミリ秒)
unsigned long lastEnemyStopTime = 0; // 前回の敵の停止時刻
void setup() {
matrix.begin();
matrix.setTextWrap(false);
matrix.setBrightness(50);
// 背景をグレーに設定
matrix.fillScreen(matrix.Color(128, 128, 128));
// パックマンを描画
drawPacman();
// 敵を描画
drawEnemy();
matrix.show();
}
void loop() {
// パックマンの位置を更新
pacmanX += pacmanSpeed;
if (pacmanX >= MATRIX_WIDTH) {
pacmanX = 0;
pacmanDistance += MATRIX_WIDTH;
} else if (pacmanX < 0) {
pacmanX = MATRIX_WIDTH - 1;
pacmanDistance += MATRIX_WIDTH;
}
// 敵の位置を更新
if (!enemyStopped) {
enemyX += enemySpeed;
if (enemyX >= MATRIX_WIDTH) {
enemyX = 0;
if (pacmanDistance >= MATRIX_WIDTH) {
enemySpeed++; // 1周ごとに敵の速度を1増加
}
} else if (enemyX < 0) {
enemyX = MATRIX_WIDTH - 1;
if (pacmanDistance >= MATRIX_WIDTH) {
enemySpeed++; // 1周ごとに敵の速度を1増加
}
}
}
// パックマンと敵の位置を更新して表示
updateAndDisplay();
delay(100);
}
void drawPacman() {
matrix.fillCircle(pacmanX, pacmanY, 2, RED);
matrix.fillTriangle(pacmanX, pacmanY, pacmanX + 2, pacmanY - 2, pacmanX + 2, pacmanY + 2, RED);
}
void drawEnemy() {
matrix.fillCircle(enemyX, enemyY, 2, ENEMY_COLORS[enemyColorIndex]);
}
void updateAndDisplay() {
matrix.fillScreen(matrix.Color(128, 128, 128)); // 背景をグレーに設定
// パックマンを表示
drawPacman();
// 敵を表示
drawEnemy();
// パックマンと敵が交差した場合
if (pacmanX == enemyX && pacmanY == enemyY) {
enemyColorIndex = (enemyColorIndex + 1) % (sizeof(ENEMY_COLORS) / sizeof(ENEMY_COLORS[0]));
if (!enemyStopped) {
enemyStopped = true; // 敵を停止
lastEnemyStopTime = millis(); // 停止時刻を記録
}
}
// 敵が停止中で一定時間経過した場合
if (enemyStopped && millis() - lastEnemyStopTime >= enemyStopDuration) {
enemyStopped = false; // 敵を再開
enemySpeed = pacmanSpeed; // 速度をパックマンと同じに設定
}
matrix.show();
}
実際に動きます、「
異常sっ