こんにちは!鉄道星の神様、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. 紫色の矢印を見るたびに「あ、”閉そく”しとる」と思うようになった。
※鉄道用語である「閉そく」の意味が、いまいちピンときていない方は、是非今の機会に調べてみてほしい。あなたもこれで、鉄道関係者の仲間入り(大げさ)。
最後にこんな感じで動くよっ!っていう動画は貼り付けておく。
コメントを残す