我在这个生命游戏示例代码中操作数组时遇到了问题。
情况:
“生命游戏”是John Conway发明的蜂窝自动化。它由一个可以根据数学规则生存/死亡/繁殖的细胞网格组成。使用next()
方法操纵此网格中的活细胞和死细胞,其中nPals是网格的初始状态。
问题:
我的问题 - 我知道这是相当基本的问题 - 我如何使用next()
上的nPals
方法给我下一个阶段?
尝试:
到目前为止,我的尝试都是沿着下面的方向 - 两者看起来都很相似。
nPals.next();
int newNPALS[][] = nPals.next(); // and then printing the array newNPALS
任何想法都会非常感激!
代码:
public class GameOfLife {
static int nPals[][] = {
{0,0,0,0,0,0,0},
{0,1,2,3,2,1,0},
{0,2,102,104,102,2,0},
{0,3,104,8,104,3,0},
{0,2,102,104,102,2,0},
{0,1,2,3,2,1,0},
{0,0,0,0,0,0,0}
};
public static void main(String[] args) {
//Initial Stage
System.out.println(" >>First Stage<<");
printMatrix(nPals);
//Second Stage
System.out.println("\n >>Second Stage<<");
printMatrix(nPals);
}//end main
static Stack<Integer>stk=new Stack<Integer>();
static final int LIVE=100;
static final int MAXGRIDSIZE=1024;
public static void next(){
for (int i=0;i<nPals.length;i++){
for(int j=0;j<nPals[i].length;j++){
switch(nPals[i][j]){
case LIVE+0:case LIVE+1:case LIVE+4:
case LIVE+5:case LIVE+6:case LIVE+7:
stk.push(-(i*MAXGRIDSIZE+j)); //death
nPals[i][j]-=LIVE;
break;
case 3:
stk.push(i*MAXGRIDSIZE+j); //life
nPals[i][j]+=LIVE;
break;
}//end switch
}//end for j
}//end for i
while(!stk.isEmpty()){
int k=stk.pop();
if(k>0)inc(k/MAXGRIDSIZE,k%MAXGRIDSIZE);
else{
k=-k;
dec(k/MAXGRIDSIZE,k%MAXGRIDSIZE);
}//end if
}//end while
}//end next
private static void inc(int i, int j) {
}
private static void dec(int i, int j){
if(i!=0){
//3 squares on top
if(j!=0) minus(i-1,j-1);
minus(i-1,j);
if(j!=nPals[i].length-1)minus(i-1,j+1);
}
//2 on either side
if(j!=0)minus(i,j-1);
if(j!=nPals[i].length-1)minus(i,j+1);
if(i!=nPals.length-1){
//3 squares on bottom
if(j!=0)minus(i+1,j-1);
minus(i+1,j);
if(j!=nPals[i].length-1)minus(i+1,j+1);
}
}
private static void minus(int i, int j){
if(nPals[i][j]>0)nPals[i][j]--;
}
private static void plus(int i, int j){
if(nPals[i][j]<=0)nPals[i][j]++;
}
//This is just for explaining printMatrix above, otherwise immaterial
public static <E> void printMatrix(int[][] m){
for(int[] rows:m){
System.out.println(Arrays.toString(rows));
}
}//end printMatrix
}//end GameOfLife
输出:
>>First Stage<<
[0, 0, 0, 0, 0, 0, 0]
[0, 1, 2, 3, 2, 1, 0]
[0, 2, 102, 104, 102, 2, 0]
[0, 3, 104, 8, 104, 3, 0]
[0, 2, 102, 104, 102, 2, 0]
[0, 1, 2, 3, 2, 1, 0]
[0, 0, 0, 0, 0, 0, 0]
>>Second Stage<< /* currently unchanged */
[0, 0, 0, 0, 0, 0, 0]
[0, 1, 2, 3, 2, 1, 0]
[0, 2, 102, 104, 102, 2, 0]
[0, 3, 104, 8, 104, 3, 0]
[0, 2, 102, 104, 102, 2, 0]
[0, 1, 2, 3, 2, 1, 0]
[0, 0, 0, 0, 0, 0, 0]
答案 0 :(得分:1)
你需要有一个类似的方法:
public void doTurn(int [][]m) {
//manipulate matrix
}
并为每个阶段打电话。
答案 1 :(得分:0)
nPals
被声明为整数数组的static
数组(int[][]
),这意味着您的班级中只有一个nPals
。结果是,在您的班级中,您始终可以访问它。因此,在您的情况下,next()
是正确的函数调用。只需在该功能中使用nPals
即可。
这让我想知道为什么你给了printMatrix
一个int[][]
参数..
无论如何,你的主要功能的完整代码:
public static void main(String[] args) {
//Initial Stage
System.out.println(" >>First Stage<<");
printMatrix(nPals);
next();
//Second Stage
System.out.println("\n >>Second Stage<<");
printMatrix(nPals);
}//end main