2013-12-17 69 views
1

我正在爲康威的一個學校項目的生命遊戲工作。我不直接尋找代碼。我正在查找我的代碼出了什麼問題。JAVA - 康威的生命遊戲會刪除所有活細胞?

在康威的生命遊戲中,如果一個細胞擁有3個活着的鄰居,它就會從死亡到活着。如果它有兩三個活着的鄰居,它就會保持活力。如果這些都不是真的,它就是死的。

我的LifeView類有一個方法,顯示細胞模擬,然後顯示有多少活細胞在給定點周圍。

這是我得到的輸出:

How many rows is your simulation? 
5 
How many columns is your simulation? 
5 
How many generations is your simulation? 
3 
xxxxx 
xxxxx 
xx0xx 
xx0xx 
xx0xx 

00000 
01110 
02120 
03230 
02120 


xxxxx 
xxxxx 
xxxxx 
xxxxx 
xxxxx 

00000 
00000 
00000 
00000 
00000 


xxxxx 
xxxxx 
xxxxx 
xxxxx 
xxxxx 

00000 
00000 
00000 
00000 
00000 

這是錯誤的,因爲第二代應該是活細胞穿越了第一代的活細胞中心的水平線。不是穿過那個中心,所有的細胞都會死亡。我很難理解爲什麼它不起作用。

主類:

package gameOfLife; 

import java.util.Scanner; 

public class Main { 

/** 
* @param args the command line arguments 
*/ 
public static void main(String[] args) 
{ 
    Scanner numReader = new Scanner(System.in); 
    System.out.println("How many rows is your simulation?"); 
    int rows = numReader.nextInt(); 
    System.out.println("How many columns is your simulation?"); 
    int columns = numReader.nextInt(); 
    System.out.println("How many generations is your simulation?"); 
    int generations = numReader.nextInt(); 


    LifeModel model = new LifeModel(rows,columns); 
    LifeView life = new LifeView(model); 

    for(int i=0; i<generations; i++) 
    { 
     life.displayLife(); 
     model.nextGeneration(); 
    } 

} 

朗視類:

package gameOfLife; 

import java.util.Scanner; 

public class LifeView { 

private LifeModel model; 

public LifeView(LifeModel model) 
{ 
    this.model = model; 
} 


public void displayLife() 
{ 
    for(int i=0; i < model.getWorld().length; i++) 
    { 
     for(int j=0; j < model.getWorld()[0].length; j++) 
     { 

      if(model.getWorld()[i][j]) 
      { 
       System.out.print("0"); 
      } 
      else 
      { 
       System.out.print("x"); 
      } 
     } 
     System.out.println(""); 
    } 
    System.out.println(""); 

    for(int i=0; i < model.getWorld().length; i++) 
    { 
     for(int j=0; j < model.getWorld()[0].length; j++) 
     { 

      System.out.print(model.numLivingNeighbors(i,j)); 
     } 
     System.out.println(""); 
    } 
    System.out.println(""); 
    System.out.println(""); 
} 
} 

LifeModel類: 包gameOfLife;

public class LifeModel 
{ 
private boolean[][] world; 
private int numRows; 
private int numCols; 
private boolean[][] tempWorld; 



public LifeModel(int rows, int cols) 
{ 
    this.numRows=rows; 
    this.numCols=cols; 
    world = new boolean[rows][cols]; 
    initWorld(); 
    tempWorld = world; 
} 

private void initWorld() 
{ 

    boolean done = false; 

    while(!done) 
    { 
     int i = (int) (Math.random()*numRows); 
     int j = (int) (Math.random()*numCols); 
     if(j>0 && i>0 && i<numRows-1 && j<numCols-1) 
     { 
      /* 
      world[i-1][j-1] = true; 
      world[i-1][j] = true; 
      world[i-1][j+1] = true; 
      world[i][j+1] = true; 
      world[i+1][j] = true; 
      */ 
      world[i][j]=true; 
      world[i+1][j]=true; 
      world[i-1][j]=true; 
      done = true; 
     } 
    } 


} 

public void nextGeneration() 
{ 
    //tempWorld = new boolean[numRows+2][numCols+2]; 

    int rows = world.length; 
    int columns = world[0].length; 

    for(int i=0; i < rows; i++) 
    { 
     for(int j = 0; j < columns; j++) 
     { 
      toggleCell(i,j); 
     } 
    } 
    world = tempWorld; 
} 

public void toggleCell(int r, int c) 
{ 
    int count = numLivingNeighbors(r,c); 
    if(!world[r][c] && count==3) 
    { 
     tempWorld[r][c] = true; 
    } 
    else if(world[r][c] && (count>=2 && count<=3)) 
    { 
     tempWorld[r][c] = true; 
    } 
    else 
    { 
     tempWorld[r][c] = false; 
    } 
} 

public int numLivingNeighbors(int r, int c) 
{ 
    int count = 0; 
    boolean newCells[][] = world; 
    for(int i = -1; i<=1; i++) 
    { 
     for(int j = -1; j<=1; j++) 
     { 
      if(i!=0 || j!=0) 
      { 
       int row = r + i; 
       int column = c + j; 
       if(row>=0 && row < newCells.length && column>=0 && column<newCells[0].length && newCells[row][column]) 
       { 
        count++; 
       } 
      } 
     } 
    } 
    return count; 
} 

public void userChange() 
{ 

} 

public boolean[][] getWorld() 
{ 
    return world; 
} 


} 

任何幫助非常感謝!

回答

4

你的LifeModel類只是一些小問題。

在您的構造函數中,您將tempWorld設置爲引用與實際遊戲世界相同的數組。這將導致對tempWorld的任何修改也影響gameWorld。

public LifeModel(int rows, int cols) 
{ 
    this.numRows=rows; 
    this.numCols=cols; 
    world = new boolean[rows][cols]; 
    initWorld(); 
    //tempWorld = world; // You can remove this line. 
} 

然後,在下一代你有線 「// tempWorld =新的布爾[+ numRows行2] [數numCols + 2];」評論說。你真的需要在這裏創建一個新的臨時數組,所以你在閱讀時不會改變遊戲板。但是,我不確定+2應該是什麼,所以我刪除了它。你應該有:

public void nextGeneration() 
{ 
    tempWorld = new boolean[numRows][numCols]; // Keep it the same size 

    int rows = world.length; 
    int columns = world[0].length; 

    for(int i=0; i < rows; i++) 
    { 
     for(int j = 0; j < columns; j++) 
     { 
      toggleCell(i,j); 
     } 
    } 
    world = tempWorld; 
} 

當我做出這些改變後,它完全適合我。我在我的機器上使用了低於我使用的完整LifeModel類。

package gameOfLife; 

public class LifeModel 
{ 
private boolean[][] world; 
private int numRows; 
private int numCols; 
private boolean[][] tempWorld; 



public LifeModel(int rows, int cols) 
{ 
    this.numRows=rows; 
    this.numCols=cols; 
    world = new boolean[rows][cols]; 
    initWorld(); 
} 

private void initWorld() 
{ 

    boolean done = false; 

    while(!done) 
    { 
     int i = (int) (Math.random()*numRows); 
     int j = (int) (Math.random()*numCols); 
     if(j>0 && i>0 && i<numRows-1 && j<numCols-1) 
     { 
      /* 
      world[i-1][j-1] = true; 
      world[i-1][j] = true; 
      world[i-1][j+1] = true; 
      world[i][j+1] = true; 
      world[i+1][j] = true; 
      */ 
      world[i][j]=true; 
      world[i+1][j]=true; 
      world[i-1][j]=true; 
      done = true; 
     } 
    } 


} 

public void nextGeneration() 
{ 
    tempWorld = new boolean[numRows][numCols]; 

    int rows = world.length; 
    int columns = world[0].length; 

    for(int i=0; i < rows; i++) 
    { 
     for(int j = 0; j < columns; j++) 
     { 
      toggleCell(i,j); 
     } 
    } 
    world = tempWorld; 
} 

public void toggleCell(int r, int c) 
{ 
    int count = numLivingNeighbors(r,c); 
    if(!world[r][c] && count==3) 
    { 
     tempWorld[r][c] = true; 
    } 
    else if(world[r][c] && (count>=2 && count<=3)) 
    { 
     tempWorld[r][c] = true; 
    } 
    else 
    { 
     tempWorld[r][c] = false; 
    } 
} 

public int numLivingNeighbors(int r, int c) 
{ 
    int count = 0; 
    boolean newCells[][] = world; 
    for(int i = -1; i<=1; i++) 
    { 
     for(int j = -1; j<=1; j++) 
     { 
      if(i!=0 || j!=0) 
      { 
       int row = r + i; 
       int column = c + j; 
       if(row>=0 && row < newCells.length && column>=0 && column<newCells[0].length && newCells[row][column]) 
       { 
        count++; 
       } 
      } 
     } 
    } 
    return count; 
} 

public void userChange() 
{ 

} 

public boolean[][] getWorld() 
{ 
    return world; 
} 


} 
0

檢查numLivingNeighbors是否爲世界上的每個單元返回適當的值。

同時檢查你的代碼

public LifeModel(int rows, int cols) 
{ 
    this.numRows=rows; 
    this.numCols=cols; 
    world = new boolean[rows][cols]; 
    initWorld(); 
    tempWorld = world; 
} 

活着

0

嘿,你已經做了一個簡單的錯誤步驟,這是LifeModel構造。 在這個構造函數中,你還需要初始化tempworld。你不應該把你的世界分配給溫度世界。 修改後,這塊代碼將變成這樣....

public LifeModel(int rows, int cols) 
{ 
this.numRows=rows; 
this.numCols=cols; 
world = new boolean[rows][cols]; 
tempWorld = new boolean[rows][cols]; 
initWorld(); 
} 

在這之後你的輸出將是正確的。