質問

プロジェクトで RPG ゲームを完成させようとしていますが、ゲーム マップの作成方法がわかりません。グラフィカルである必要はありませんが、マップ全体と各タイルのコードが正しい必要があります。

これまでのところ、リンクされたすべてのタイルを含む ArrayList を使用して (教授の要求に応じて) 非行列マップを作成することを考えていました。

public abstract class Casella {
/** 
 * @uml.property name="tabellone"
 * @uml.associationEnd multiplicity="(1 1)" inverse="casella:Tabellone"
 * @uml.association name="contains"
 */

private int id;
private boolean free = true;
private List adjacent;
private List items;
private Tabellone tabellone = null;

public void in(){
    free = false;
}

public void out(){
    free = true;
}

}

これは 1 つのタイル (タイルを拡張する 3 つのクラスを持つ) のコードでした。地図をどのようにまとめて生成するかはまだわかりません。

お時間をいただきありがとうございます。

役に立ちましたか?

解決 6

隣接リストを使用してこれを管理しました。 各セルには、隣接セルのインデックスを含むArrayListがあります。これらのインデックスは、セルのマップArrayListに含まれるセルのインデックスです。

http://en.wikipedia.org/wiki/Adjacency_list

他のヒント

実装から始めるのではなく、マップをどのように使用したいかから始めてください。これにより、実装方法にいくつかの制約が与えられます。例えば:

地図を描くとき、​​どのようにアクセスしますか?コーディネートによって?それとも「タイル X から西に行く」でしょうか?

[編集] RPG ゲームのメインループから始めることをお勧めします。文字/トークンをどこかに配置する必要があります (つまり、タイルと何らかの関係が必要です)。

次に、キャラクターを移動する必要があります。キャラクターは現在のタイル (対戦相手、アイテム、タイプ) を調べることができなければなりません。どのように移動できるかを知る方法が必要です (つまり、右に壁はありますか?)

これにより、マップのインターフェイスが提供されます。ゲーム内の他のオブジェクトに対してレンダリングするサービス。インターフェイスが何を提供する必要があるのか​​がわかれば、マップ (データ構造) を実装する方法もわかるはずです。

マップの生成に関しては、乱数ジェネレーターとある程度の「常識」を使用してください。隣接するタイルを見てください。それらがすべて都市である場合、このタイルも都市である可能性があります。平地でも同様です。ヒルは特異なアイテムであり、最も頻度が低くなります。

このコードを実行し、マップを ASCII ("C"ity、"P"lain、"H"ill) として印刷して、機能するかどうかを確認します。

マトリックスを使用せずにこのようなマップを生成するには、中央のタイルから始めて、修正された幅優先検索アルゴリズムを使用してマップを外側に配置することをお勧めします。まず、隣接するタイルのリストよりも少し優れたものが必要になります。次のように、次のタイルを格納する方向ごとに1つずつ、単純に4つの変数を使用できます。

private Tabellone up = null;
private Tabellone down = null;
private Tabellone left = null;
private Tabellone right = null;

最も中央のタイルから始めましょう。あなたがしなければならないことは、方向の数がnullであるかを把握し、各方向に新しいTablelloneオブジェクトを作成し、この現在のオブジェクトの各変数を設定し、作成されたオブジェクトに適切な反対の変数を設定することです。

Tabellone adj = new Tabellone();
up = adj;
adj.setDown(this);

このタイルのすべての指示を入力したら、作成した他のタイルのいずれかを選択して同じ操作を実行します。これが、幅優先検索アルゴリズムの出番です。キューを使用して、作成した各タイルを調べて、指示を記入することができます。アルゴリズムを停止するには、作成するタイルの数に制限を設定し、カウンターを使用して、作成されたタイルの数を追跡します。

int count = 0;
ArrayList<Tabellone> queue = new ArrayList<Tabellone>()
queue.add(/*center tile*/);
while (count < 100) { //if we want 100 tiles
  //take out the center tile from the beginning of the array list, create a tile for each direction and add those tiles to the array list, then increment count by 1.
}

注:このアルゴリズムは、そのままの形で菱形のマップを作成します。正方形が必要な場合は、各対角線方向の変数も必要になります。

もちろん、これがあなたが望むよりも少し複雑に思える場合は、座標系をお勧めします。

壁、バッグ、エリアは特別なコンテナであり、ゲームのすべての壁、バッグ、エリアを保持します。

private String level =
          "    ######\n"
        + "    ##   #\n"
        + "    ##$  #\n"
        + "  ####  $##\n"
        + "  ##  $ $ #\n"
        + "#### # ## #   ######\n"
        + "##   # ## #####  ..#\n"
        + "## $  $          ..#\n"
        + "###### ### #@##  ..#\n"
        + "    ##     #########\n"
        + "    ########\n";

これはゲームのレベルです。スペースを除いて、5文字があります。ハッシュ(#)は壁を表します。ドル($)は移動するボックスを表します。ドット(。)文字は、ボックスを移動する必要がある場所を表します。アットマーク(@)は倉庫番です。そして最後に、改行文字(\ n)が世界の新しい行を開始します。

速度またはメモリは、このプロジェクトにとって大きな懸念事項ですか?そうでない場合、2D配列を使用しないのはなぜですか?

次のようなもの

Casella map [][] = new Casella[xSize][ySize];

ここから概念化するのは簡単です。各セルがマップ上のタイルであるExcelスプレッドシートとしてそれを描くだけです。

しかし、あなたのやり方はうまくいきますが、時々概念化するのは少し難しいです。隣接するタイルのリストがあります。したがって、マップを作成するときは、おそらく左上から開始し、そこから開始します。

ネストされたforループを使用して、マップをセットアップし、エッジアイテムの決定に役立てることができます。

for(int i = 0; i < XSIZE ; ++i)
    for(int j = 0; j < YSIZE ; ++j)
        if(j==0) //found left edge (i.e. no adjacent ones to the left)
        if(j==(YSIZE)) //found right edge (you get the picture) 

ループを使用し、エッジをチェックするポイントは、エッジを除く各タイルの上下にリンクする必要があることです。エッジでは、2つまたは3つのリンクの代わりに4。

コードを正しくする必要があるのは、実際には機能的な要件ではないため、ゲーム/マップの詳細を知らなくても、正確に正しいものを言うのは困難です。

Xタイルがあり、順序付けられた隣接関係がないマップがあると仮定すると、非マトリックス解が最適です。一般的な解決策は、非対称隣接関係の隣接関係リストまたは対称隣接関係の発生率リストを使用してグラフのようにモデル化することです。インシデントリストを使用する場合は、エッジが接続している頂点を含むエッジオブジェクトが必要です。隣接リストを使用する場合は、 multimap を使用すると便利です。

順序付けられた隣接関係を持つ非行列型のソリューションが必要な場合、AlbertoPLにはそのためのソリューションがあります。

幅がXタイルで高さがYタイルであり、隣り合うタイルが隣接しているマップがあると仮定すると、各タイルには最大4個と最小2個の隣接タイルがあり、マトリックスを使用してタイルにアクセスできますまた、マトリックス隣接によって隣接を表します。考えは、map [Y] [X]はmap [Y + 1] [X]とmap [Y] [X + 1]に隣接し、逆にあるということです。 このソリューションは、タイル[Y + 1] [X + 1]がタイル[Y] [X]に隣接している場合、最大6および最小3のタイル隣接にも適合します。 これの利点は、マップを簡単に解析できることです。2次元なので、このようにモデル化するのが自然です。 欠点は、タイルが設定されると、マトリックスを変更せずに隣接関係を変更できないことです。これは教授が提案したことではないので、やりたくないかもしれませんが、(静的な)隣接関係がある場合、これが最も簡単な方法かもしれません。

タイルベースのマップの場合、各部屋は隣接する部屋と固定の関係にあります。座標を心配する必要はないかもしれませんが(タイルが正方形の方が簡単かもしれませんが)、方向を心配する必要があります。

タイルが正方形の場合、基本的な方向(n、s、e、w)だけで十分です。 16進タイルの場合、出口1〜6に番号を付けることができます(おそらく静的な最終定数を使用して)。次に、隣接する各タイルを、そのタイルと共にそのタイルにリンクできます。

アーロンが言ったように、まずマッピング座標がどのようになるかを決める必要があります。

ただし、X-Y-Z座標系に制約されません。たとえば、各タイルをマップ上の他のタイルにリンクできます。それはすべて、どのように構築したいかに依存します。

RPGゲームを作成していると言ったら、キャラクターの周囲の地形をよく見る必要があります。マルチレベルですか?キャラクターはあるタイルから別のタイルにどのように移動しますか?動きは一方向ですか?

文字通り、ゲーム用のマップを設計するときに尋ねられる質問はたくさんあります。

コーディングを開始する前に、まずそれを非常によく計画する必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top