-1

「生命のゲーム」の独自のバージョンを処理3でコーディングしたいが、私は理解していないようなエラーに遭遇した。コードが実行されるたびに、画面は数ピクセルの変化で白黒になりますが、ゲームのようには見えません。生命の中のゲーム

助けが必要ですか?

int windowW, windowH, percentAlive, gen; 
//windowW is the width of the window, windowH is the height 
//percentVlive is the initial percent of alive pixel 
//gen is the counter for the generation 
color alive, dead;//alive is white and dead is black to represent their respective colors 
boolean[][] cells0, cells1;//two arrays for the state of the cells, either alive or dead 
boolean zeroOrOne = true;//this is to check which array should be iterated over 

void setup() { 
    size(700, 700); 

    int width = 700; 
    int height = 700; 

    windowW = width; 
    windowH = height; 

    percentAlive = 15; 

    alive = color(255, 255, 255); 
    dead = color(0, 0, 0); 

    cells0 = new boolean[width][height]; 
    cells1 = new boolean[width][height]; 

    frameRate(2); 

    background(alive); 

    for (int x=0; x<width; x++) {//set the percent of live pixels according to the precentAlive varriable 
    for (int y=0; y<height; y++) { 
     int state = (int)random (100); 
     if (state > percentAlive) 
     cells0[x][y] = true; 
     else 
     cells0[x][y] = false; 
    } 
    } 
} 



void draw() { 
    gen += 1;//increases the generation every time it draws 
    drawLoop(zeroOrOne); 
    WriteGeneration(gen); 

    if(zeroOrOne){//changes the zeroOrOne value to change the array being iterated over 
    zeroOrOne = false; 
    } 
    else { 
    zeroOrOne = true; 
    } 
} 

void WriteGeneration(int number) {//changes the label on top 
    fill(0); 
    rect(0, 0, windowW, 100); 
    fill(255); 
    textFont(loadFont("BerlinSansFB-Reg-100.vlw")); 
    text("Generation " + number, 10, 90); 
} 

void drawLoop(boolean check) { 
    loadPixels(); 
    if (check) {//checks which array to iterate thrgough 

    for (int x = 0; x < windowW; x++) {//iterates through the array 
     for (int y = 0; y < windowH; y++) { 
     if (cells0[x][y]) {//checks wether the pixel is alive or dead 
      pixels[x * 700 + y] = alive;//gets the current pixel 
      int lives = lives(x, y, check);//checks how many cells are alive around the current cell 

      if (lives<2) {//these are supposed to put in place the game of life rules 
      cells1[x][y] = false; 
      } else if (lives>4) { 
      cells1[x][y] = false; 
      } else { 
      cells1[x][y] = true; 
      } 
     } else { 
      pixels[x * 700 + y] = dead;//gets the current pixel 
      int lives = lives(x, y, check);//checks how many cells are alive around the current cell 
      if (lives == 3) {//turns the pixel alive if the condition is met 
      cells1[x][y] = true; 
      } 
     } 
     } 
    } 
    } else {//the same as the top but instead the arrays being updated and read are switched 

    for (int x = 0; x < windowW; x++) { 
     for (int y = 0; y < windowH; y++) { 
     if (cells1[x][y]) { 
      pixels[x * 700 + y] = alive; 
      int lives = lives(x, y, check); 
      if (lives<2) { 
      cells0[x][y] = false; 
      } else if (lives>4) { 
      cells0[x][y] = false; 
      } else { 
      cells0[x][y] = true; 
      } 
     } else { 
      pixels[x * 700 + y] = dead; 
      int lives = lives(x, y, check); 
      if (lives == 3) { 
      cells0[x][y] = true; 
      } 
     } 
     } 
    } 
    } 
    updatePixels(); 
} 

int lives(int x, int y, boolean check) {//this just checks how many live pixels are around a given pixel 
    int lives = 0; 
    if (x > 1 && y >1 && x < 699 && y < 699) { 
    if (check) { 
     if (cells0[x-1][y-1]) 
     lives++; 
     if (cells0[x][y-1]) 
     lives++; 
     if (cells0[x+1][y-1]) 
     lives++; 
     if (cells0[x-1][y]) 
     lives++; 
     if (cells0[x+1][y]) 
     lives++; 
     if (cells0[x-1][y+1]) 
     lives++; 
     if (cells0[x][y+1]) 
     lives++; 
     if (cells0[x+1][y+1]) 
     lives++; 
    } else { 
     if (cells1[x-1][y-1]) 
     lives++; 
     if (cells1[x][y-1]) 
     lives++; 
     if (cells1[x+1][y-1]) 
     lives++; 
     if (cells1[x-1][y]) 
     lives++; 
     if (cells1[x+1][y]) 
     lives++; 
     if (cells1[x-1][y+1]) 
     lives++; 
     if (cells1[x][y+1]) 
     lives++; 
     if (cells1[x+1][y+1]) 
     lives++; 
    } 
    } 
    return lives; 
} 
+0

「人生のゲームのようには見えない」というのは、ほとんど問題の説明ではありません。あなたはデバッグを試みましたか?それとも、それは遅く実行させますか? – f1sh

+0

'zeroOrOne'と' cells0'/'cells1'というものは、私が見るところです。あなたは2つの異なるゲームを同時に走っているのですか、それとも何か?それは確かに2つの異なったものの間で交互に見えるスクリーンを説明するでしょう...あなたが一度に2つをやってみる前に1つを実行してください。 –

+0

私はそれをゆっくりと実行しようとしました、私が与えることができる最も良い説明は、画面が1回の反復で黒くなり、その後、人生のゲームのように見える別のバージョンで白に戻ります。これは毎回これを行います –

答えて

2

コードをMCVEとして送信してください。あなたのコードを実行しようとすると、59行目にロードしようとしているフォントファイルがないので、エラーが発生します。そのフォントはあなたの問題とは関係がないので、質問を投稿する。

このコードでは多くのことが起こっています。私はなぜ2つの配列を持っているのか理解していますが、両方をスケッチレベルで使用すると、コードが複雑になります。そのような配列を常に切り替える必要はありません。代わりに、私はあなたのコードを次のように整理します:

  • スケッチレベルで1つの配列しか持たないようにしてください。変数zeroOrOneも取り除くことができます。
  • 必要に応じて配列を初期化します。
  • 現在の配列に基づいて新しい配列を返すnextGeneration()を作成します。これはおそらく、近隣とその他のものを数えるための他の関数を呼び出すでしょう。しかし、重要な点は、2つのグローバルアレイを切り替える代わりに、毎回新しいアレイを作成できることです。
  • これにより、複製されたロジックがすべて削除されます。

一般的な注意事項:隣人をチェックするために8つのif文を持つ

  • はやり過ぎのビットです。ループをネストしたforループを使用しないのはなぜですか?
  • 適切な命名規則に従う必要があります。関数は小文字で始まり、変数は説明的なものでなければなりません。checkは本当に読者に何も言わないのです。

まだ動作しない場合は、デバッグを行う必要があります。 print()ステートメントを追加するか、Processingエディターのデバッガーを使用してコードをステップ実行します。あなたが期待するものとはどのような振る舞いをしていますか?その後、その行のMCVE(およびその行為を示すために必要なハードコードされた変数)を投稿することができます。そこから移動します。がんばろう。あなたが持っている

+0

ありがとうございました。 –

0

の問題が2つあります:

  1. あなたが干渉し、一つだけをしたいとき、二つの別々のゲームを作るた2つのセルアレイ。

  2. 変更が必要なものを確認する前に、配列内のセルを更新しています。

両方の問題を一度に解決する方法は、cells1アレイを再利用することです。それを毎回チェックする代わりに、完全にfalseに設定された配列にしてください。次に、cells0の正方形を変更する場合は、cells1の位置をtrueに設定し、変更する各セルのマーカーを作成した後、drawLoop()の末尾にある別のforループを使用してすべてのマーカーを一度に変更します方法。これは、両方の問題を一挙に解決します。

これを実行したら、もう不要になるので、checkzeroAndOneの変数を削除することができます。

void drawLoop() { 
    loadPixels(); 
    for (int x = 0; x < windowW; x++) { 
    for (int y = 0; y < windowH; y++) { 
     if (cells0[x][y]) { 
     pixels[x * 700 + y] = alive; 
     int lives = lives(x, y); 
     if (lives<2) { 
      cells1[x][y] = true; 
     } else if (lives>4) { 
      cells1[x][y] = true; 
     } 
     } else { 
     pixels[x * 700 + y] = dead; 
     int lives = lives(x, y); 
     if (lives == 3) { 
      cells1[x][y] = true; 
     } 
     } 
    } 
    } 
    for (int x = 0; x < windowW; x++) { 
    for (int y = 0; y < windowH; y++) { 
     if (cells1[x][y]) { 
     cells0[x][y] = !cells0[x][y]; 
     cells1[x][y] = false; 
     } 
    } 
    } 
    updatePixels(); 
} 

私はあなたが残りを把握することができます確信している:これは私がお勧めの修正をした後、私はdrawLoop()方法のために得たものです。がんばろう!

関連する問題