# rush_hour_game

6x6のラッシュアワー（Rush Hour）スライディングブロックパズル Web アプリケーションです。

## 概要

赤いターゲット車を右側の出口まで移動させるパズルゲームです。
MySQLへのクリア記録（タイム・手数）の保存機能、SQLiteへの自動フォールバック機能、およびパズルパターンのデータベース管理に対応しています。

---

## セットアップ手順

### 1. 依存パッケージのインストール

```bash
npm install
```

### 2. 環境変数の設定 (`.env`)

プロジェクト直下に `.env` ファイルを作成（または `.env.example` を複製）し、必要に応じて設定を変更してください。

```env
# MySQL Database Configuration
MYSQL_HOST=localhost
MYSQL_PORT=3306
MYSQL_USER=root
MYSQL_PASSWORD=password
MYSQL_DATABASE=rush_hour

# Application Server Port
PORT=3000
```

### 3. アプリケーションの起動

```bash
npm start
```

ブラウザで `http://localhost:3000` にアクセスするとゲームをプレイできます。

---

## データベース設定

本アプリケーションは **MySQL** を主データベースとして使用します。MySQL サーバーへ接続できない場合は、自動的にローカルの **SQLite (`rush_hour.db`)** へフォールバックして動作します。

### 環境変数一覧

| 変数名 | 説明 | デフォルト値 |
| --- | --- | --- |
| `MYSQL_HOST` | MySQL ホスト名 | `localhost` |
| `MYSQL_PORT` | MySQL ポート番号 | `3306` |
| `MYSQL_USER` | MySQL ユーザー名 | `root` |
| `MYSQL_PASSWORD` | MySQL パスワード | `password` |
| `MYSQL_DATABASE` | 使用するデータベース名 | `rush_hour` |
| `PORT` | サーバーの起動ポート番号 | `3000` |

---

## データベーステーブル一覧

データベース起動時に以下のテーブルが自動作成されます。

### 1. `clear_records` （クリア記録テーブル）

プレイヤーのパズルクリアタイムや手数、スコアログを記録します。

| カラム名 | 型 (MySQL) | 型 (SQLite) | 制約・初期値 | 説明 |
| --- | --- | --- | --- | --- |
| `id` | `INT` | `INTEGER` | PRIMARY KEY, AUTO_INCREMENT | レコードID |
| `username` | `VARCHAR(255)` | `TEXT` | NOT NULL | ユーザー名 |
| `pattern_id` | `INT` | `INTEGER` | NOT NULL | クリアしたパズルのパターンID |
| `clear_time_seconds` | `INT` | `INTEGER` | NOT NULL | クリアにかかった時間（秒） |
| `moves` | `INT` | `INTEGER` | DEFAULT 0 | 移動手数 |
| `created_at` | `TIMESTAMP` | `DATETIME` | DEFAULT CURRENT_TIMESTAMP | 記録日時 |

### 2. `patterns` （パズルパターン情報テーブル）

各ステージの初期配置や難易度情報を保持します。

| カラム名 | 型 (MySQL) | 型 (SQLite) | 制約・初期値 | 説明 |
| --- | --- | --- | --- | --- |
| `id` | `INT` | `INTEGER` | PRIMARY KEY | パターンID |
| `name` | `VARCHAR(255)` | `TEXT` | NOT NULL | パターン名・難易度表記 |
| `difficulty` | `VARCHAR(100)` | `TEXT` | NOT NULL | 難易度区分（例: 初級, 中級, 上級, エキスパート） |
| `min_moves` | `INT` | `INTEGER` | NOT NULL | 最少クリア手数 |
| `vehicles` | `JSON` | `TEXT` | NOT NULL | 車両配置データ (JSON形式) |
| `updated_at` | `TIMESTAMP` | `DATETIME` | DEFAULT CURRENT_TIMESTAMP | 更新日時 |

---

## Seeder (シードデータ投入) の実行

`patterns.json` からパズルパターンの初期データをデータベースに投入・更新するためのシーダースクリプトが用意されています。

### シーダーコマンド

```bash
npm run seed
```

- このコマンドを実行すると、`scripts/seed_attached_patterns.js` が実行され、`patterns.json` に記述されたパターンデータが DB の `patterns` テーブルへ保存・更新されます。
- **自動シード機能:** アプリケーション起動時 (`npm start`) に `patterns` テーブルが空の場合は、自動的に `patterns.json` の内容がシードされます。手動でパターン情報を最新状態にリセット・再投入したい場合に `npm run seed` を使用してください。

---

## テストの実行

バックエンド API の単体テストを実行します。

```bash
npm test
```
