C言語入門|STEP8:マップ探索の実装-2次元配列でフィールドを歩き回る

はじめに:RPGらしさを生むのは「探索」

STEP7では、アイテムと装備システムを実装しました。
STEP8では、いよいよ プレイヤーが世界を歩き回る「マップ探索」 を扱います。

RPGにおいて探索は、

  • 次にどこへ行くか考える楽しさ
  • 敵や宝箱に出会うワクワク感
  • ボスに近づいていく緊張感

を生み出す、とても重要な要素です。

このSTEPでは、

  • マップの表現方法
  • プレイヤーの移動処理
  • マスごとのイベント判定

を順番に見ていきましょう。

今回のRPGにおけるマップの仕様

まずは、マップの基本仕様を整理します。

項目内容
サイズ縦25 × 横25
表現方法文字の2次元配列
移動方式上下左右のみ
通過不可
イベントマスの記号で判定

シンプルですが、
RPGとして必要十分な構成 になっています。

2次元配列でマップを表現する考え方

今回のマップは、
char型の2次元配列 で表現されています。

考え方はとてもシンプルです。

文字意味
#
空白通路
E
T宝箱
I宿
C教会
Bボス

「1マス=1文字」と考えることで、
マップを直感的に扱えるようになります。

マップをテンプレートとして用意する理由

マップは、
あらかじめ完成した形をテンプレートとして用意 しています。

これにより、

  • 毎回同じ地形で遊べる。
  • デバッグがしやすい。
  • 宝箱やボスの位置を固定できる。

といったメリットがあります。

学習用RPGとして、とても扱いやすい設計です。

プレイヤー位置を数値で管理する

プレイヤーの位置は、

  • 縦方向
  • 横方向

2つの整数値 で管理しています。

位置管理のイメージ

変数意味
px縦方向の位置
py横方向の位置

マップ配列の添字と一致しているため、
位置判定やイベント処理がとても簡単になります。

移動操作の考え方

移動操作は、昔ながらの テンキー方式 です。

入力移動方向
8
2
4
6

入力に応じて、

  • 仮の移動先を計算
  • マップ範囲内かチェック
  • 壁でなければ移動確定

という流れで処理しています。

壁判定を入れる理由

移動処理で最も重要なのが 壁判定 です。

壁判定を入れないと、

  • マップ外に出てしまう
  • 壁をすり抜けてしまう

といった問題が起こります。

そのため、

  • マップ範囲チェック
  • 壁文字かどうかの確認

を必ず行っています。

マップの描画処理の考え方

マップ表示は、

  • 上から順に
  • 左から右へ

2重ループで描画しています。

描画時には、

  • プレイヤー位置なら @
  • それ以外はマップの文字

を表示します。

さらに、
記号ごとに色を変えて表示 することで、
視認性を高めています。

マスに入ったときのイベント判定

プレイヤーが移動したあと、
今いるマスの文字を調べてイベントを発生 させます。

マス発生する処理
T宝箱を開く
I宿で回復
C教会で復活
E敵とバトル
Bボス戦

この仕組みがあることで、
マップとゲーム進行が自然につながる ようになります。

宝箱を一度きりにしている理由

宝箱を開けたあとは、
そのマスを 空白に書き換え ています。

これにより、

  • 同じ宝箱を何度も開けられない。
  • 一度きりのイベントになる。

という、RPGらしい挙動になります。

敵の再出現処理について

敵と戦って勝利すると、

  • そのマスの敵は消える。
  • 別の場所に新しい敵が配置される。

という処理が行われます。

これにより、

  • マップが敵だらけにならない。
  • 探索と戦闘のバランスが保たれる。

ようになっています。

ボスマスを特別扱いする理由

ボスがいるマスは、

  • 通常の敵とは別処理
  • 勝利するとエンディングへ

という 特別な扱い をしています。

ただし、

  • 移動
  • マップ判定

の仕組み自体は同じなので、
プログラムが複雑になりすぎません。

マップ探索がゲーム全体をつないでいる

STEP8までで分かるように、
マップ探索は、

  • バトル
  • アイテム
  • 回復
  • ボス戦

といった すべての要素をつなぐハブ になっています。

2次元配列というシンプルな仕組みでも、
ここまでRPGらしい世界を作れるのは、
C言語学習としても大きなポイントです。

STEP8で理解しておきたいポイントまとめ

STEP8で押さえておきたいポイントはこちらです。

  • マップは2次元配列で表現できる。
  • プレイヤー位置は数値で管理する。
  • 移動前に範囲と壁チェックが必須
  • マスの文字でイベントを判定する。
  • 探索がRPG全体の流れを支えている。

ここまで来ると、
RPGとしての骨格はほぼ完成 しています 👍