2011-01-08 48 views
1

我试图在java中实现生命游戏,作为学习这种语言的练习。Java和条件(生命游戏)的问题

不幸的是我有一个问题,因为我似乎无法让这个程序正常运行。

我实现了一个torodial总和(面是油炸圈饼)没有问题:

int SumNeighbours (int i, int j) { 

    int value = 0; 


    value = world[(i - 1 + row ) % row][(j - 1 + column ) % column]+world[(i - 1 + row ) % row][j]+world[(i - 1 + row ) % row][(j + 1) % column]; 

    value = value + world[i][(j - 1 + column ) % column] + world[i][(j + 1) % column]; 

    value = value + world[(i + 1) % row][(j - 1 + column ) % column] + world[(i + 1) % row][j]+world[ (i+1) % row ][(j + 1) % column]; 


    return value; 
} 

并正确总结时,我测试:

void NextWorldTest() { 

    int count; 

    int [][] nextWorld = new int[row][row]; 

    nextWorld = world; 


    for (int i=0; i<row; i++) { 
    for (int j=0; j<column; j++) { 

    count = SumNeighbours(i,j); 

    System.out.print(" " + count + " ");  


    } 

    System.out.println(); 

    } 

    world=nextWorld; 



} 

不幸的是当我添加的条件生命游戏(出生/死亡)程序停止正常工作,因为它似乎不再能够正确计算邻居中的活细胞。它计数没有的地方,并且在有些地方不计算。例如:它不计算某些活细胞下面的那个。

这是一个非常奇怪的行为,现在已经让我头痛了3天......也许我错过了一些有关变量的基本知识?

在这里你可以找到类。

void NextWorld() { 

    int count; 

    int [][] nextWorld = new int[row][column]; 

    nextWorld = world; 


    for (int i=0; i<row; i++) { 
    for (int j=0; j<column; j++) { 

    count = SumNeighbours(i,j); 

    System.out.print(" " + count + " "); 


    if ( (world[i][j] == 0) && (count == 3) ) { 

    nextWorld[i][j] = 1; 

    } else if ((world[i][j] == 1) && ((count == 3) || (count == 2))) { 

    nextWorld[i][j] = 1; 

    } else { 

    nextWorld[i][j]=0; 

    } 


    } 

    System.out.println(); 

    } 

    world=nextWorld; 



} 

} 

我做错了什么?

下面你可以找到完整的软件包。

package com.GaOL; 

public class GameWorld { 

int [][] world; 

int row; 

int column; 

public int GetRow() { 

    return row; 
} 

public int GetColumn() { 

    return column; 
} 

public int GetWorld (int i, int j) { 


    return world[i][j]; 

} 

void RandomGen (int size, double p1) { 

    double randomCell; 

    row = size; 
    column = size; 

    world = new int[row][column]; 

    for (int i = 0; i<row; i++) { 
    for (int j = 0; j<column; j++) { 

    randomCell=Math.random(); 

    if (randomCell < 1-p1) { 

    world[i][j] = 0; 

    } else { 

    world[i][j] = 1; 

    } 



    } 

    } 

} 

void printToConsole() { 

    double test = 0; 

    for (int i=0; i<row; i++) { 
    for (int j=0; j<column; j++) { 

    if (world[i][j] == 0) { 

    System.out.print(" "); 

    } else { 
    System.out.print(" * "); 

    test++; 

    } 

    } 

    System.out.println(""); 

    } 


    System.out.println("ratio is " + test/(row*column)); 


} 

int SumNeighbours (int i, int j) { 

    int value = 0; 


    value = world[(i - 1 + row ) % row][(j - 1 + column ) % column]+world[(i - 1 + row ) % row][j]+world[(i - 1 + row ) % row][(j + 1) % column]; 

    value = value + world[i][(j - 1 + column ) % column] + world[i][(j + 1) % column]; 

    value = value + world[(i + 1) % row][(j - 1 + column ) % column] + world[(i + 1) % row][j]+world[ (i+1) % row ][(j + 1) % column]; 


    return value; 
} 

void NextWorldTest() { 

    int count; 

    int [][] nextWorld = new int[row][row]; 

    nextWorld = world; 


    for (int i=0; i<row; i++) { 
    for (int j=0; j<column; j++) { 

    count = SumNeighbours(i,j); 

    System.out.print(" " + count + " ");  


    } 

    System.out.println(); 

    } 

    world=nextWorld; 



} 


void NextWorld() { 

    int count; 

    int [][] nextWorld = new int[row][column]; 

    nextWorld = world; 


    for (int i=0; i<row; i++) { 
    for (int j=0; j<column; j++) { 

    count = SumNeighbours(i,j); 

    System.out.print(" " + count + " "); 


    if ( (world[i][j] == 0) && (count == 3) ) { 

    nextWorld[i][j] = 1; 

    } else if ((world[i][j] == 1) && ((count == 3) || (count == 2))) { 

    nextWorld[i][j] = 1; 

    } else { 

    nextWorld[i][j]=0; 

    } 


    } 

    System.out.println(); 

    } 

    world=nextWorld; 



} 

} 

,这里的测试类:

package com.GaOL; 

public class GameTestClass { 


public static void main(String[] args) { 

    GameWorld prova = new GameWorld(); 

    prova.RandomGen(10, 0.02); 

    for (int i=0; i<3; i++) { 

    prova.printToConsole(); 

    prova.NextWorld(); 

    } 



} 

} 
+2

如果a)格式化了您的代码,那么回答您会容易得多; b)你提出了一个* short *的例子。我敢肯定,这里有更多的代码比你需要证明这个问题。 – 2011-01-08 17:35:39

+0

我重新格式化了... StackOverflow编辑器出现了问题...条件运算符标记存在,因为当我添加ifs时,代码会中断... – Mascarpone 2011-01-08 17:38:39

回答

2

我认为,问题出在阵列中分配。你在这里做什么?

int [][] nextWorld = new int[row][row]; 
nextWorld = world; 

您应该创建新阵列[row][column]然后根据世界上的数据填充它。

而且更

    在Java中,你可以做SMT像 anArray.lengthanArray[0].length,所以你不需要的行和列变量
  • 你应该命名你的方法开始低信,像sumNeighbours()代替
  • SumNeighbours()

UPD:有错字在第二提醒:固定