当前位置: 首页 > 知识库问答 >
问题:

康威的人生游戏新价值观

缪修德
2023-03-14

问题围绕康威的人生游戏,以及如何为新一代同时实施所有规则。这个游戏遵循三条新世代的规则:一个只有三个活邻居的死细胞变为活细胞,一个只有一个活邻居的活细胞变为死细胞,一个有三个以上活邻居的活细胞变为死细胞。原始世代是随机的。我认为,我的问题在于,我的新一代正在一次一个地实施规则,而不是一次全部实施,这是一种方法:

public static int[][] nextgeneration(int[][] lastgen){
    int[][] nextgen = new int[lastgen.length][lastgen[0].length];
    for(int i = 0; i < lastgen.length; i++){
        for(int j = 0; j < lastgen[i].length; j++){
             if(aliveneighbors(lastgen, i, j) == 3){
                nextgen[i][j] = 1;
            }
        else if(aliveneighbors(lastgen, i, j) == 1){
                nextgen[i][j] = 0;
            }
        else if(aliveneighbors(lastgen, i, j) >  3){
                nextgen[i][j] = 0;
            }         
        else    nextgen[i][j] = lastgen[i][j];
        }
    }
    return nextgen;

以下是我的完整代码,以防问题不在该方法中:

import java.util.Random;
public class Life {
public static int[][] origin(int a, int b) {
    int[][] randomMatrix = new int [a][b];
    for (int i = 0; i < a; i++) {
        for (int j = 0; j < b; j++) {
            Random random = new Random();
            int abc = random.nextInt(2);
        randomMatrix[i][j] = abc;
        }
    }
    return randomMatrix;
    }
public static void print(int[][] a) {
    for(int i = 0; i < a.length; i++){
        for(int j = 0; j < a.length; j++){
             System.out.print(a[i][j] + " ");
        }
        System.out.println();
    }
}
public static void show(int[][] b) {
    int N = b.length;
    StdDraw.setXscale(0, N-1);
    StdDraw.setYscale(0, N-1);
    for(int i = 0; i < b.length; i++){
        for(int j = 0; j < b.length; j++){
            if(b[i][j] == 1){
                StdDraw.setPenColor(StdDraw.RED);
                StdDraw.filledSquare(j, N-i-1, .5);

            }
            else if(b[i][j] == 0){
                StdDraw.setPenColor(StdDraw.BLACK);
                StdDraw.filledSquare((double)j, (double)-i, .5);
            }
        }
    }
}
public static int[][] nextgeneration(int[][] lastgen){
    int[][] nextgen = new int[lastgen.length][lastgen[0].length];
    for(int i = 0; i < lastgen.length; i++){
        for(int j = 0; j < lastgen[i].length; j++){
             if(aliveneighbors(lastgen, i, j) == 3){
                nextgen[i][j] = 1;
            }
        else if(aliveneighbors(lastgen, i, j) == 1){
                nextgen[i][j] = 0;
            }
        else if(aliveneighbors(lastgen, i, j) >  3){
                nextgen[i][j] = 0;
            }         
        else    nextgen[i][j] = lastgen[i][j];
        }
    }
    return nextgen;
}
public static int aliveneighbors(int[][] board, int x, int y){
    int count = 0;
    int up;
    int down;
    int left;
    int right;
    {
    if(x > 0)   
        up = x - 1;
    else
        up = board.length - 1;

    if(x < (board.length - 1))
        down = x + 1;
    else
        down = 0;

    if(y > 0) 
        left = y - 1;
    else
        left = board[x].length - 1;

    if(y < (board[x].length - 1))
        right = y + 1;
    else
        right = 0;
    //Count the live neighbors
    if(board[up][left] == 1)
        count++;

    if(board[up][y] == 1)
        count++;

    if(board[up][right] == 1)
        count++;

    if(board[x][left] == 1)
        count++;

    if(board[x][right] == 1)
        count++;

    if(board[down][left] == 1)
        count++;

    if(board[down][y] == 1)
        count++;

    if(board[down][right] == 1)
        count++;

    return count;
}
}
public static void main(String[] args) {
    int[][] b = origin(5, 5);
    int gens = 5;
    for (int i = 0; i < gens; i++) {
        System.out.println();
        int nextboard[][] = nextgeneration(b);
        b = nextboard; //I feel like this could be a problem as well
        System.out.println("Generation " + i + ":");
        print(nextgeneration(b));
        show(nextgeneration(b)); //This line of code seems useless
        //print(b); This one also seems useless and makes output confusing
        show(b);
    }
}
}

以下是我的输出:

Generation 0:
0 1 1 0 0 
0 1 1 0 0 
0 0 0 1 1 
1 1 0 1 1 
1 0 0 0 0 

Generation 1:
1 0 1 0 0 
1 1 0 0 0 
0 0 0 0 0 
0 1 1 1 0 
0 0 0 1 0 

Generation 2:
1 0 1 0 1 
1 1 0 0 0 
1 0 0 0 0 
0 0 1 1 0 
0 0 0 1 1 

Generation 3:
0 0 1 0 0 
0 0 0 0 0 
1 0 1 0 1 
0 0 1 1 0 
1 1 0 0 0 

Generation 4:
0 1 0 0 0 
0 1 0 1 0 
0 1 1 0 1 
0 0 1 1 0 
0 1 0 1 0 

我期待这样的事情:

Generation 0:
0 1 1 0 0 
0 1 1 0 0 
0 0 0 1 1 
1 1 0 1 1 
1 0 0 0 0 

Generation 1:
0 1 1 0 0 
0 1 0 0 0 
1 0 0 0 1 
1 1 1 1 1 
1 1 0 0 0 

Generation 2:
0 1 1 0 0 
1 1 1 0 0 
1 0 0 0 1 
0 0 1 1 1 
1 0 0 1 0

在我的游戏动画中,活着的细胞在动画中保持活着,这不应该发生。这不是我的主要问题,但是如果你知道如何解决这个问题,它也会有所帮助。

共有1个答案

仇和蔼
2023-03-14

我看你的产量不错。注意,你实际上做了边界的“环绕”,所以这个

Generation 0:
0 1 1 0 0 

将此作为上边框:

1 0 0 0 0 

和左边框:

0
0
1
1
0

对于计算,它看起来像:

0 1 0 0 0 0 
0 0 1 1 0 0 
0 0 1 1 0 0 

所以这个输出:

Generation 1:
1 0 1 0 0 
1 1 0 0 0 

对于环绕来说是正确的。但是,从预期结果来看,您似乎希望将其视为实际边界。我的意思是:

010年

000

当x=1,y=0时,只有5个邻居。

在这种情况下,你需要这样的东西:

    public static int aliveneighbors(int[][] board, int x, int y){
    int width = board.length;
    int height = board[0].length;
    int count = 0;
     
     
    boolean isNotLower =  (y-1) >= 0;
    boolean isNotUpper = (y+1) < height;
        
    if (x-1 >= 0) {
        
       if( isNotLower && (board[x-1][y-1] == 1) )
        count++;
       if(board[x-1][y] == 1)
        count++;
       if(isNotUpper && (board[x-1][y+1] == 1) )
        count++;            
    }
    
    if (x+1 < width) {
       if( isNotLower && (board[x+1][y-1] == 1) )
        count++;
       if(board[x+1][y] == 1)
        count++;
       if( isNotUpper && (board[x+1][y+1] == 1) )
        count++;            
    }
    
    if( isNotUpper && (board[x][y+1] == 1) )
        count++;
    if(isNotLower && (board[x][y-1] == 1) )
        count++;
        
     return count;
}
 类似资料:
  • 我正在制作康威的生活游戏,就像几乎所有其他初学者一样。我的主要问题是我不知道如何执行游戏规则,这些规则是:一个有三个活邻居的死细胞变成活细胞,一个有一个活邻居的活细胞变成死细胞,一个有三个以上活邻居的活细胞变得死了。我以前从未操纵过矩阵,所以我不知道从哪里开始。我所在的类还不允许我们使用非静态方法,而且我们也不能使用java库。这是我目前所拥有的: 我现在收到的输出是我最初一代游戏所需要的。我想我

  • 我的问题很难描述,所以我会尽可能简洁地解释。 在康威的《生活游戏》中,假设我有一张这样的地图: 与其在每个单元格上循环,包括不可能相关的死单元格,不如让我将第0代中的每个活单元格放在

  • 我试图为康威的生活游戏写一个计数邻居方法。如果一个死细胞与2或3个活细胞相邻,它应该会活过来。然而,我的代码没有正确计算所有的邻居。如果我给输入坐标(10, 10), (10, 11), (10, 12)这将产生 该程序将下一代打印为 坐标在(10,11)和(11,11)。但是,在(9,11)也应该有一个点。我知道问题发生在这个函数中,对于点(9,11),函数不包括3个邻居。

  • 我正在做一个多人游戏。每个客户端都有一个在共享环境中移动的字符。 我使用socket.io创建rooms,使用peer.js创建客户端之间的点对点连接。 我正在尝试做的是使每个客户端能够更新他的地图中其他玩家的角色的位置。 为此,每个客户端应该拥有其他玩家的键盘光标(箭头键)的状态,以便他能够用行走动画移动他们对应的角色。 p2p:我正在考虑在客户端之间创建双工流,这样每个客户端将拥有其他玩家的键

  • 每2个玩家,服务器将创建1个房间(我的游戏是PvP,一对一) 每个房间处理游戏逻辑 我将使用作为我的游戏循环 服务器FPS=5 每个房间都可以处理玩家的移动和一些物理操作 关于实际问题: 基于下面的点数,我应该使用什么样的游戏循环?下面每种类型的游戏循环的利弊是什么。 null

  • 我正在使用JavaScript中的套接字io创建一个多人游戏。除了客户端插值之外,游戏目前的工作非常完美。现在,当我从服务器获得一个数据包时,我只需将客户端的位置设置为服务器发送的位置。以下是我尝试做的: 所以我设定了球员的目标位置。然后在玩家更新方法中我简单地做了这样的操作: 这基本上使玩家以固定的速度向目标的方向移动。问题是玩家在下一个信息从服务器到达之前或之后到达目标。 编辑:我刚刚读了Ga