rcursion(再帰プログラム)の練習のためにjavaで地形生成するプログラムを書いています。
2Dの配列にランダムで生成した値を入れる段階で苦戦しています。
ダイアモンドスクエアアルゴリズムという方法を使いたいのですが、全くわかりません。
プログラムの構造なのですが、ユーザーに四隅の値(地形の高さ)を入力させます。(画像で左端の段階)
そのあと、四隅の平均の値が真ん中。(画像で左から2番目の段階)
両端の平均の値が4辺の中心の値。(画像で左から3番目の段階)
という風に値が決まっていきます。
この時点で小さい正方形がもう一度できたので、同じことを繰り返す。
というようなプログラムを書きたいのです。
java
1getTopLeft(), getTopRight(),getBottomLeft(), getBottomRight()
は、それぞれ四隅の値を所得するメソッドで
java
1private HeightShifter shift;
は、配列に高さを入れるためのクラスのオブジェクトで、
java
1public double randShift(double origVal)
というメソッドを持っています。
今の所、recursionを使用する箇所のプログラムはこんな感じです↓
java
1public boolean generateTerrain() 2 { 3 return generateTerrainHelper(getTopLeft(), getTopRight(), 4 getBottomLeft(), getBottomRight(), 0); 5 } 6 7public boolean generateTerrainHelper(double topLeft, double topRight, 8 double bottomLeft, double bottomRight, int counter) 9 { 10 //Base Case (Arrayのindexが隣同士) 11 12 //General Case1 (四角の値をとる場合) 13 //Middle 14 shift.randShift(map[(counter + map.length) / 2][(counter + map.length) / 2] 15 = (topLeft + topRight + bottomLeft + bottomRight) / 4); 16 17 //General Case2 (2つの間の値をとる場合) 18 return false; 19 }
常に四隅の値を返したりする事でどうにかできないかなぁ、と考えたりしたのですが、良い方法が浮かびませんでした。
お力添えをお願いします。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/10/26 23:40