🚂 運転士ぽいぽい開発日記 #2 ~ついに動いた!でも電車がワープする~

こんにちは!鉄道星の神様、2日目の活動報告です。

前回のStage 1では静的な画面を作っただけだったが、今回のStage 2ではついに電車が動き出した!運転士をぽいぽい投げて電車を動かせるようになった。…が、実装中に「んなあほな?」的な問題が続出した。

🎮 Stage 2: 電車を動かしてみる

今回実装したのは、大きく分けて3つの機能。

【本日の成果物】

  • ✅ 運転士のドラッグ&ドロップ操作
  • ✅ 電車の自動移動(環状線 A→B→C→D→A)
  • ✅ 駅の容量制御(1駅1台まで)
  • ✅ 単線での追い越し禁止機能
  • ✅ 運転士のHP消費システム(1マス移動で-1HP)
  • ✅ 5色の進行方向矢印表示
  • ✅ 運転士の次駅下車システム

😅 開発中の珍事件簿

事件その1: 「電車がワープした!」

電車が駅に入ってから「あ、満員だった」と気づいて1マス後ろにワープ。瞬間移動能力を身につけた電車。

原因:移動してから空き状況をチェックしていた。順序が逆。

解決:移動するに次のマスをチェックする方式に変更。これで自然に手前で停止するようになった。

教訓:事後チェックは現実離れした挙動を生む。事前チェックが大事。

事件その2: 「電車が幽霊のように追い越していく」

開発者:「あれ?単線なのに後ろの電車が前の電車をすり抜けてる…」

Claude:「これは特殊能力を持つ電車ですね」

原因:駅の空き状況しかチェックしていなかった。線路上の電車の存在を無視していた。

解決:チェック処理に優先順位を導入。
1. 次のマスに電車がいる? → 停止(物理的制約)
2. 次のマスが駅で満員? → 停止(施設制約)
3. 両方クリア → 移動OK

結論:優先順位が大事。物理法則は施設のルールより優先される。

事件その3: 「運転士が永遠に働き続ける問題」

運転士を電車に配置したら、ずっと運転し続けていた。休憩なし。労働基準法違反。

問題点:運転士の下車処理を実装していなかった。

解決:運転士は次の駅で必ず下車して、その駅の待機エリアで休憩するシステムを実装。ホワイト企業化に成功。

事件その4: 「矢印が紫色になった!なんで!?」

開発者:「この電車の矢印、紫色になってるんですけど…」

Claude:「前方に電車がいるからです」

開発者:「あ、そうか。色分けしたんだった」

結論:色分けは便利だが、実装した本人でも忘れる。コメント大事。

🎨 こだわりポイント

1. 5色の進行方向矢印システム

電車の状態が分かりにくかったので、進行方向の矢印を状態別に色分け。

  • 🟢 緑色: 移動中
  • 🔴 赤色: 駅で停車中
  • 🟠 オレンジ: 駅待機中(満線のため入れない)
  • 🟣 紫色: 前方電車がつかえている(追い越し不可:単線なので当たり前)
  • グレー: 運転士なし

これで画面を見ただけで全電車の状態が一目瞭然に。

2. 浮動小数点座標システム

電車の位置を整数ではなくfloat(浮動小数点数)で管理。マス間をなめらかに移動できるようになった。グリッドシステムを採用しているが、見た目はスムーズ。良いとこ取り。

3. 運転士の所属駅制限

運転士は所属駅の電車にしか乗れない仕様。A駅の運転士がB駅の電車を運転することはできない。これがないと、全運転士が1つの駅に集中してしまう問題が発生する。将来的には「運転士の異動」機能も実装予定。

📊 実装した主要システム

運転士操作システム
// ドラッグ中の運転士は半透明に
if (draggingDriver) {
    fill(0, 255, 0, 128); // 透明度50%
}

// 所属駅チェック
if (driver.homeStation !== train.currentStation) {
    return; // 所属駅以外の電車には乗れない
}
電車移動システム
// 移動前に次のマスをチェック
if (canMoveToNextPosition(train)) {
    train.gridX += dx;
    train.gridY += dy;
    train.driver.hp -= 1; // HP消費
}
交通制御システム
// チェック優先順位
1. 物理的制約: 次のマスに電車がいる?
2. 施設制約: 駅が満員?
3. すべてクリア → 移動OK

💡 実装で学んだこと

ゲーム作りは建築と似ている

「とりあえず動けばいい」で進めると、後で大規模な修正が必要になる。「駅の1マス = 1台分のホーム」「単線では追い越し禁止」といった基本ルールを最初に決めるべきだった。

優先順位の重要性

物理法則(追い越し不可)→ 施設のルール(駅の容量)の順でチェックしないと、現実離れした挙動になる。チェック処理の順序はとても大事。

色分けは強力

5色の矢印システムを実装したことで、デバッグが劇的に楽になった。バグが発生したときに「あ、この電車は前方待機状態(紫)だから…」と原因を特定しやすい。

🎮 実際に動かしてみた感想

面白いポイント

  • 運転士をぽいぽい投げるのが意外と楽しい
  • 電車が詰まって渋滞する様子が見ていて面白い
  • 運転士のHP管理を考えると戦略性が生まれる
  • カラフルな矢印で状況が直感的に分かる

今後の課題

  • スコアシステムがないので目標が不明確
  • 食堂システム(HP回復)がまだ未実装
  • 運転士の配置戦略をもっと深くしたい
  • 複雑な路線図(くねくね線路)で遊びたい

🚀 次回予告

Stage 3では、ついにゲームらしくなる予定。

  • 🏆 スコアシステム(駅間移動で得点獲得)
  • ⚡ 疲労ペナルティ(HP=0で減点)
  • 🍽️ 食堂システム(HP回復機能)
  • 🎯 ゲームオーバー・クリア判定

現在は、わかりやすくするために、運転士を一人ずつ各駅に配置しているが、運転士のいない駅が存在する面があっても面白いかも?。食堂をどこに設置するかだけでも、攻略方法は変更しそうだ。

💭 開発者のつぶやき

「ゲームが動く瞬間」って何度経験してもワクワクする。今回は電車が初めて駅から駅へ移動したときに「おおっ!」ってなった。

でも、動き始めたら今度は「現実と違う挙動」が気になり始める。ワープする電車、ゴーストのようにすり抜ける電車、永遠に働く運転士…。バグなんだけど、どこか面白い。

次のStage 3でゲームの「目的」が明確になるはず。楽しみ。


開発環境:RockyLinux 9 + Apache + p5.js
開発時間:約3時間(交通制御システムの実装に時間がかかった)
コード行数:512行(前回の271行から大幅増加)
バグ修正回数:8回(ワープ、追い越し、描画順序など)

それでは、また次回の開発日記でお会いしましょう!
運転士たちがちゃんと休憩を取れる世界を目指して…🚂

P.S. 紫色の矢印を見るたびに「あ、”閉そく”しとる」と思うようになった。

※鉄道用語である「閉そく」の意味が、いまいちピンときていない方は、是非今の機会に調べてみてほしい。あなたもこれで、鉄道関係者の仲間入り(大げさ)。

最後にこんな感じで動くよっ!っていう動画は貼り付けておく。


コメント

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です