はじめに

 今日からRCCアドベントカレンダーが始まります。RCC会員の個性的な記事をお楽しみください! 記念すべき1日目は、1回生のふかだが担当します。大学から情報系の勉強を始めました。

 ゲーム、面白いですよね。僕はとあるゲームにはまりすぎて、高校時代は勉強そっちのけでプレイしていました。特に、実力と運のバランスが良いゲームは何度もやりたくなります。このようなリプレイ性の高いゲームの例として、ローグライクがあります。

ローグライクとは

 ゲームジャンルの一つです。日本だと「不思議のダンジョンシリーズ」で有名ですね。代表例として、トルネコの大冒険や風来のシレンなどが挙げられます。「1000回遊べるRPG」というキャッチコピーで知られた、これらのゲーム。かの有名な「ドラゴンクエスト」も、ウルティマやウィザードリィを参考に作られたものであるのと同様に、「不思議のダンジョンシリーズ」にも原点があります。

不思議のダンジョンシリーズの例

 ローグライクの原点は、1980年に初版が公表された「ローグ」というダンジョン探索型のRPGです。このとき既に、入るたびに変わる地形・ターン性・死んだらおしまいといった基本的なルールは固まっていました。当時のコンピュータゲームは制約が多く、ボリュームが限られていました。そんな中、飽きられにくく、リプレイ性の高いゲームを目指したので、多くの要素をランダム化しています。

ローグライクの原点「ローグ」

 特に画期的だったのは、ダンジョン自動生成だと思います。地形の変化は、アイテムの入手機会の変動などとは異なり、ビジュアル面の新鮮さが期待できます。これは「1000回遊べるRPG」というキャッチコピーを如実に表しているように思います。今回、Javaでこれを作ってみました。(ソースコードは登場しません)

自動生成の手順

 今回、区域分割法を用いました。大きく3つのパートに分けられます。

  1. マップを分割する
  2. 部屋を生成する
  3. 部屋同士をつなげる

1.マップを分割する

 部屋が重ならないようにするために、まずはマップをいくつかの区画に分割します。親区画を縦に分割して、小さいほうをListにaddし、大きいほうを親区画にする関数を作ります。横の分割も同じように作って、これをそれぞれ交互に再帰呼び出しします。ある程度、親区画が小さくなったら、再帰処理から抜けます。

2.部屋を生成する

 一つの区画に対して一つの部屋を生成します。大きさは、事前に決めた最大値・最小値に則ってランダムに決定します。このとき、最低限の通路の余白を考慮します。

3.部屋同士をつなげる

 ここまでくればあと少し! マップを分割したときに、Listで管理したことが生きてきます。Listのindexが "1" 違うということは、必ず隣接していることと同義です。2つの隣接した部屋から、通路のスタート地点をそれぞれ決定し、区画の境界目指して伸ばし、境界を通路化します。すべてのリストでこれを行えば、すべての部屋がつながることの保証されたダンジョンの完成です。

(4.もう少し改良する)

 今のままだとダンジョンは1本道であるため、プレイヤーはその法則性にすぐ気づきます。やっぱりプレイヤーには、どの道を進むか迷ってほしいところです。そこで、分割の仕方によってはListのindexが "2" 違う区画も隣接することを利用します。通路を追加したら、部屋が孤立しない範囲で通路を消去します。これでほんとに完成!

例えばこんな感じ

おわりに

 完成したのはマップの枠組みだけです。ほかの部分も作成して、遊べるローグライクにしたいです。

 私はパソコンを触り始めてまだ1年弱ですが、2Dのゲーム制作は、プログラミングの基本文法を学ぶのに適していると思います。ぜひ、興味のあるゲームジャンルを調べてみて、作ってみてはいかがでしょうか。

 明日は2回生のチャムチャムさんです。JD(女子大生)らしく、タピオカ関連 (?) の記事だそうですよ!楽しみですね!

Twitterでフォローしよう

おすすめの記事