どのような状況でアルゴリズムが便利ですか
最近、私はタスクに直面しました。3次元のランドスケープで簡単な戦略を書くことです。 現在、C ++でのプログラミング経験がほとんどないため、「diamond-square」を作成しようとすると、突然エラーが発生しました(「diamond-square」に関する記事へのリンクも最後にあります)。 現実的な風景を与えない、簡単に作成できるアルゴリズムが必要だったため、この方法は最初に初心者に役立ちます。
アルゴリズムと結果
アルゴリズム自体を説明する前に、その結果を共有します。
アルゴリズムは、ランダムな座標のプログラムがランダムなサイズの長方形でマップを埋めることです。 マップは、風景の高さのマップを表す2次元配列の形をしています。
簡単にするために、長方形構造を作成します。
struct tRect { int x1, y1, x2, y2; }
変数x1およびy1は長方形の左下座標、x2およびy2は右上座標です。
させてください:
-マップはHM [mapsizex] [mapsizey]の配列として表示されます。
-mapsizeyおよびmapsizex-マップのサイズを決定する変数。
-genStep-長方形の数を決める変数。
-zscale-高さのカードの特定の膨張係数。 数字に置き換えることができます。
-recSizexとrecSizeyは、長方形のサイズの制限です。
次に、マップを四角形で塗りつぶす必要があります。
for (int i=0; i<genStep; i++) { genRect.x1 = rand()%mapsizex; genRect.y1 = rand()%mapsizey; genRect.x2 = genRect.x1 + recSizex / 4 + rand()%recSizex; genRect.y2 = genRect.y1 + recSizey / 4 + rand()%recSizey; if (genRect.y2 > mapsizey) genRect.y2 = mapsizey; if (genRect.x2 > mapsizex) genRect.x2 = mapsizex; for (int i2 = genRect.x1; i2<genRect.x2; i2++) for (int j2 = genRect.y1; j2<genRect.y2; j2++) Map.HM[i2][j2]+= float(zscale) / float(genStep) + rand()%50 / 50.0; }
スクリーンショットからの救済は、値によって得られました。
genStep = 1024
zscale = 512
mapsizexおよびmapsizey = 128
recSize = 10
次に、可能な限りの方法で画面に地図を表示します。 私の場合、openGl + glfw。
アルゴリズムの長所と短所
利点:
- アルゴリズム自体の記述の単純さと速度
- アルゴリズム実行速度
短所:
- 原始性
- マップを埋める小さなステップで、風景は「正方形」になります
- 高さマップの生成中に地形をバイオームに分割する可能性はありません
この方法は、すでに前述したように、初心者や時間に非常に制限がある人に主に適しています。
この記事がお役に立てば幸いです。
→ ゲームレベルの生成に関する記事
→ 「ダイヤモンドスクエア」に関する記事