3

プロジェクトの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;
}

}

これは、単一のタイル(それを拡張する3つのクラスがある)のコードでした。どうやって地図をまとめて作成するのか、まだわかりません。

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

4

8 に答える 8

9

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

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

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

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

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

マップの生成に関しては、乱数ジェネレーターといくつかの「常識」を使用してください。隣接するタイルを見てください。それらがすべて都市の場合、このタイルもおそらく都市です。平野も同様。丘は特異な項目であり、頻度は最も低いです。

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

于 2009-06-22T12:41:56.393 に答える
3

マトリックスを使用せずにこのようなマップを生成するには、中央のタイルから始めて、変更された幅優先探索アルゴリズムを使用してマップを外側に配置することをお勧めします。まず、隣接するタイルのリストよりも少し優れたものが必要になります。次のタイルを格納する各方向に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);

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

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.
}

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

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

于 2009-06-22T13:10:18.067 に答える
2

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

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

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

于 2011-03-24T22:29:25.557 に答える
1

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

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

于 2009-06-28T09:14:22.827 に答える
1

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

何かのようなもの

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) 

ループを使用してエッジをチェックするポイントは、4 つではなく 2 つまたは 3 つのリンクを持つエッジを除いて、タイルごとに上下左右にリンクする必要があるということです。

于 2009-06-22T12:55:44.133 に答える
1

コードが正しくなければならないということは、実際には機能要件ではないため、ゲーム/マップについて詳しく知らなければ、何が正しいかを正確に言うのは困難です。

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

順序付けられた隣接関係を持つ非マトリックス ソリューションが必要な場合、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 つの次元があるため、このようにモデル化するのは自然なことです。欠点は、タイルが設定されると、マトリックスを変更せずに隣接関係を変更できないことです。これはあなたが教授に提案したことではないので、やりたくないかもしれませんが、(静的) 順序付けされた隣接関係がある場合は、これが最も簡単な方法かもしれません。

于 2009-06-22T13:58:43.413 に答える
0

Aaronが言ったように、最初にマッピング座標がどのようになるかを決定する必要があります。

ただし、XYZ 座標系に制約されることはありません。たとえば、各タイルをマップ上の他のタイルにリンクできます。それはすべて、どのように構築したいかによって異なります。

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

ゲームのマップを設計する際には、文字通り、何十もの質問をする必要があります。

コーディングを開始する前に、まず十分に計画する必要があります。

于 2009-06-22T12:55:21.060 に答える
0

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

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

于 2009-06-22T12:51:15.110 に答える