2016-11-29 7 views
0

手続き型生成マップをシードする作業をしていますが、実行すると別の色の四角形のマップを表示するはずです。方法は私が助けを必要とする地図上のいくつかのランダムな場所を選択し、ランダムなタイプを出発点として割り当てます。ここ Javaのループで問題が発生しました

は、私は、コードをテストし、私はこのブロックを削除したら、それがうまく働いた

public void seed(){//seeds the map 
double seedNum = (mapWidth*mapHeight*.02);//determine number of seed positions needed 
if((int)seedNum < 1){//will always seed at least 1 square 
    seedNum = 1; 
} 

int seedListX[]= new int[(int)seedNum];//list of seeded coordinates to check for dupilcates 
int seedListY[]= new int[(int)seedNum]; 

int seedX = (int)Math.random()*mapWidth; 
int seedY = (int)Math.random()*mapHeight; 
seedListX[0] = seedX; 
seedListY[0] = seedY; 

for(int i =1; i < (int)seedNum; i++){ 
    int error = 0; 
    seedX = (int)Math.random()*mapWidth; 
    seedY = (int)Math.random()*mapHeight; 
    seedListX[i] = seedX; 
    seedListY[i] = seedY; 

    for(int j = 0; j < seedNum;j++){//goes through seed coordinates list to check for duplicates 
    if(seedX == seedListX[j] || seedY == seedListY[j]){ 
     error = 1; 
    } 
    } 

    int type = (int)Math.random()*5+1;//choose random type 

    if(error != 1){ 
    this.setType(seedX,seedY,type); 
    }else{ 
    i--; 
    }//end inner loop 
} 
}//end outer loop 

全体の方法です

for(int j = 0; j < seedNum;j++){//goes through seed coordinates list to check for duplicates 
    if(seedX == seedListX[j] || seedY == seedListY[j]){ 
     error = 1; 
    } 
    } 

    int type = (int)Math.random()*5+1;//this line is fine 

    if(error != 1){ 
    this.setType(seedX,seedY,type); 
    }else{ 
    i--; 
    }//end inner loop 

イムその無限ループが、私はそれを見ていないです、必ずいずれかの助けを感謝します。

+0

CHループ – qaispak

+0

の閉じ括弧も忘れないでください。小さなコードブロックを使わずに実行すると、常に最初の正方形がタイプ1になります。 –

答えて

0

これがそうforループはたぶん

あなたがインクリメントないと仕上がりん毎回

else{ 
    i--; 
} 

が起きているのは、あなたがしたい

error = 1; 

(そう毎回起こるi != jことを確認してください)休憩

0
for(int j = 0; j < seedNum;j++){//goes through seed coordinates list to check for duplicates 
    if(seedX == seedListX[j] || seedY == seedListY[j]){ 
     error = 1; 
    } 
} 
あなたが自分で衝突しているあなたは本当にあなたがまだ満たされていない座標シードとの衝突をチェックしてはならない、...また

- trueseedX == seedListX[i]ためとseedY == seedListY[i]

i == jための条件が常に得られます。

たとえば、seedNum = 2としましょう。内側のループの最初の繰り返しで、今

i: 0 
seedListX: [12, #JUNK#] 
seedListY: [34, #JUNK#] 
seedX: 12 
seedY: 34 

:最初の反復は、最初のシードを作成 - あなたが最初の第1の座標との座標比較している -

j: 0 
seedListX[j] == seedListX[0] == 12 == seedX 
seedListY[j] == seedListY[0] == 34 == seedY 

問題がクリアされているが、のもちろん彼らは衝突するでしょう!

- 別の問題があります。のは、内側のループの2回目の繰り返しを見てみましょう:それはJavaは、物事を初期化する方法ですが、それはまだジャンクだから、0する

j: 1 
seedListX[j] == seedListX[1] == #JUNK# 
seedListY[j] == seedListY[1] == #JUNK# 

#JUNK#が起こるのだろう - それは、任意の(ただし、行列式)の値が含まれている、をありません実際には、第二シードの座標

あなたが唯一の前の繰り返しで作成された種との衝突をチェックする必要があります(まだ作成されていない!):

for(int j = 0; j < i; j++) { //... 
関連する問題