2017-11-03 10 views
2

私は20ishで20ishの "グリッド"を持っていると仮定します。私はランダムに食べ物を起動方法は、次の式である:Javascript Snake Game(魚の産卵場所)

Math.floor(Math.random() * ((max - min)/20) + 1) + 20 * min; 

これは基本的に食品がグリッドセルの1つにきちんと出現するようになります。

私はヘビの体の上に食べ物を産むのを避けたいと思います。分散ランダム性を維持しながらこれを行う最善の方法は見つけられていません。かなりの仕事をしません

ソリューション:

私は何人かの人々がこれを行う見てきましたが、それは動作しません、それは食べ物がヘビに出現しないことを保証するものではありませんので、それはちょうどそれが少なくなりますおそらく。 getRandomPoint()はまだ私にヘビのランダムなポイントを与えるかもしれません。

for (let i = 0; i < snake.length; i++) { 
    if (foodPosition.x === snake[i].x && foodPosition.y === snake[i].y) { 
     foodPosition.x = getRandomPoint(); 
     foodPosition.y = getRandomPoint(); 
    } 
} 

食品は、まだ、まだ確認されていないヘビの任意のセルに出現することができますので、この次はどちらか動作しません。たとえば、i = 0のときは、foodPosition.xとfoodPosition.yがsnake [0] .xおよびsnake [0] .yと等しいかどうかだけを確認します。このループの繰り返しで、i = 0のとき、snake [2] .x、snake [2] .yで占められていたセルで食べ物を生み出すことができます。

for (let i = 0; i < snake.length; i++) { 
    while (foodPosition.x === snake[i].x && foodPosition.y === snake[i].y) { 
     foodPosition.x = getRandomPoint(); 
     foodPosition.y = getRandomPoint(); 
    } 
} 

私が試したことがいくつかありますが、それを残しておきます。私がしようとしているようなことをする良い方法は何ですか?

答えて

1

私はあなたのソリューションにフラグを追加したいし、それが

let colliding = true; 

let new_x, new_y; 

while(colliding) { 
    colliding = false; 
    new_y = getRandomPoint(); 
    new_x = getRandomPoint(); 

    for (let box of snake) { 
     if (new_x == box.x && new_y == box.y) { 
      colliding = true; 
      break; 
     } 
    } 
} 

foodPosition.x = new_x; 
foodPosition.y = new_y; 
+0

このようなことをやめました。提案していただきありがとうございます。 – embracethefuture

2

私は、食品が産卵できる場所のリストを生成します。すべての場所のセットから蛇の身体の場所のセットを差し引いたもののようなもの。

私はJavaScriptとp5.jsのMinesweeperと同様のことをしました。 2つの鉱山で同じセルを占有することはできません。私が鉱山を作り出したとき、私は地雷の可能性のある場所のリストから地雷を取り除いた。それは、これらの値のいずれかが大きい場合繰り返し実行するために、非効率的になりますので、これは、numRows * numColumns * snake.length * 2操作を取ること

let numRows = 20; 
let numColumns = 20; 

let possibleFoodLocations = []; 

for (let row = 0; row < numRows; row++) { 
    for (let column = 0; column < numColumns; column++) { 
     let isLocationValid = snake.every(bodyPart => { 
      return row !== bodyPart.y || column !== bodyPart.x; 
     }); 

     if (isLocationValid) { 
      possibleFoodLocations.push({ x: column, y: row }); 
     } 
    } 
} 

注意。私が考える最良の方法は、これらの値が大きいときにこれを組み合わせ、これらの値が小さいときにランダムな点を選択することです。

+1

はあなたが気にしない場合は、それを達成する方法をのコードの例を表示することができます動作しますか? – embracethefuture

+0

@embracethefuture追加情報で私の答えを更新しました。 – Xeraqu

1

あなたのランダムなポイントを取得して、それがどんなヘビのポイントとも一致しないことを確認するのに役立ちますか?そうであれば、別のランダムな点を得ることができます。