java和条件(生命游戏)的问题

时间:2011-01-08 17:33:28

标签: java arrays

我正试图在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();

  }



 }

}

1 个答案:

答案 0 :(得分:2)

我认为,问题在于数组分配。你在这做什么?

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

您应该创建新数组[row][column],然后根据来自世界的数据填充它。

还有更多

  • 在Java中你可以像anArray.lengthanArray[0].length那样做,所以你不需要行和列变量
  • 你应该用低位字母命名所有方法,例如sumNeighbours()而不是SumNeighbours()

更新:第二个建议中有拼写错误:已修复