Java 康威';s生命游戏更新(下一代)
我正在研究Conway的GameofLife java代码,我正在与我的更新方法(也称为下一代创建者)进行斗争。我将发布到目前为止我编写的代码,请让我知道我可以做什么来修复更新方法 如果在时间T时没有细胞,则生成细胞 正好有三个邻居还活着 如果在时间T,则现有单元保持活动状态 有两三个邻居 如果在时间T时,细胞因隔离而死亡 只有不到两个邻居Java 康威';s生命游戏更新(下一代),java,conways-game-of-life,Java,Conways Game Of Life,我正在研究Conway的GameofLife java代码,我正在与我的更新方法(也称为下一代创建者)进行斗争。我将发布到目前为止我编写的代码,请让我知道我可以做什么来修复更新方法 如果在时间T时没有细胞,则生成细胞 正好有三个邻居还活着 如果在时间T,则现有单元保持活动状态 有两三个邻居 如果在时间T时,细胞因隔离而死亡 只有不到两个邻居 public class GameOfLife { private char [][] grid; private int rows;
public class GameOfLife {
private char [][] grid;
private int rows;
private int columns;
public GameOfLife(int rows, int columns) {
grid=new char[rows][columns];
for(int i=0;i<grid.length;i++)
{
for(int j=0;j<grid[i].length;j++)
grid[i][j]=' ';
}
}
public int numberOfRows() {
int countRows=0;
for(int i=0;i<grid.length;i++){
countRows++;
rows=countRows;
}
return rows;
}
public int numberOfColumns() {
int countColumns=0;
for(int i=0;i<1;i++){
for(int j=0;j<grid[i].length;j++)
countColumns++;
columns=countColumns;
}
return columns;
}
public void growCellAt(int row, int col) {
for(int i=0;i<grid.length;i++){
for(int j=0;j<grid[i].length;j++)
grid[row][col]='O';
}
}
public boolean cellAt(int row, int col) {
for(int i=0;i<grid.length;i++){
for(int j=0;j<grid[i].length;j++)
if(grid[row][col]=='O')
return true;
}
return false;
}
public String toString() {
String result="";
for(int i=0;i<rows;i++){
for(int j=0;j<columns;j++)
result+=grid[i][j];
}
return result;
}
public int neighborCount(int row, int col) {
int count=0;
int i=row;
int j=col;
int left;
int right;
int up;
int down;
if(i > 0)
up = i-1;
else
up = grid.length-1;
if(i < (grid.length-1))
down = i+1;
else
down = 0;
if(j > 0)
left = j-1;
else
left = grid[i].length - 1;
if(j < (grid[i].length-1))
right = j+1;
else
right = 0;
if(grid[up][left] == 'O')
count++;
if(grid[up][j] == 'O')
count++;
if(grid[up][right] == 'O')
count++;
if(grid[i][left] == 'O')
count++;
if(grid[i][right] == 'O')
count++;
if(grid[down][left] == 'O')
count++;
if(grid[down][j] == 'O')
count++;
if(grid[down][right] == 'O')
count++;
return count;
}
public void update() {
for(int i=0;i<grid.length;i++){
for(int j=0;j<grid[i].length;j++){
if(grid[i][j]==' ' && neighborCount(i,j)==3)
grid[i][j]='O';
if(neighborCount(i,j)<2 || neighborCount(i,j)>3)
grid[i][j]= ' ';
if(grid[i][j]=='O' && neighborCount(i,j)==2 || neighborCount(i,j)==3)
grid[i][j]='O';
}
}
}
}
如果在时间T时,细胞因过度拥挤而死亡
有三个以上的邻居
public class GameOfLife {
private char [][] grid;
private int rows;
private int columns;
public GameOfLife(int rows, int columns) {
grid=new char[rows][columns];
for(int i=0;i<grid.length;i++)
{
for(int j=0;j<grid[i].length;j++)
grid[i][j]=' ';
}
}
public int numberOfRows() {
int countRows=0;
for(int i=0;i<grid.length;i++){
countRows++;
rows=countRows;
}
return rows;
}
public int numberOfColumns() {
int countColumns=0;
for(int i=0;i<1;i++){
for(int j=0;j<grid[i].length;j++)
countColumns++;
columns=countColumns;
}
return columns;
}
public void growCellAt(int row, int col) {
for(int i=0;i<grid.length;i++){
for(int j=0;j<grid[i].length;j++)
grid[row][col]='O';
}
}
public boolean cellAt(int row, int col) {
for(int i=0;i<grid.length;i++){
for(int j=0;j<grid[i].length;j++)
if(grid[row][col]=='O')
return true;
}
return false;
}
public String toString() {
String result="";
for(int i=0;i<rows;i++){
for(int j=0;j<columns;j++)
result+=grid[i][j];
}
return result;
}
public int neighborCount(int row, int col) {
int count=0;
int i=row;
int j=col;
int left;
int right;
int up;
int down;
if(i > 0)
up = i-1;
else
up = grid.length-1;
if(i < (grid.length-1))
down = i+1;
else
down = 0;
if(j > 0)
left = j-1;
else
left = grid[i].length - 1;
if(j < (grid[i].length-1))
right = j+1;
else
right = 0;
if(grid[up][left] == 'O')
count++;
if(grid[up][j] == 'O')
count++;
if(grid[up][right] == 'O')
count++;
if(grid[i][left] == 'O')
count++;
if(grid[i][right] == 'O')
count++;
if(grid[down][left] == 'O')
count++;
if(grid[down][j] == 'O')
count++;
if(grid[down][right] == 'O')
count++;
return count;
}
public void update() {
for(int i=0;i<grid.length;i++){
for(int j=0;j<grid[i].length;j++){
if(grid[i][j]==' ' && neighborCount(i,j)==3)
grid[i][j]='O';
if(neighborCount(i,j)<2 || neighborCount(i,j)>3)
grid[i][j]= ' ';
if(grid[i][j]=='O' && neighborCount(i,j)==2 || neighborCount(i,j)==3)
grid[i][j]='O';
}
}
}
}
公共类游戏人生{
私有字符[][]网格;
私有int行;
私有int列;
公共生活游戏(整数行,整数列){
网格=新字符[行][列];
对于(int i=0;i,看起来您正试图修改正在循环的同一个网格。在循环网格时,应根据网格的先前状态进行更改。请尝试构建新网格,而不是在旧网格上进行写入。。
注意,这是C++11实现
template<std::size_t X, std::size_t Y>
class GameOfLife {
private:
std::pair<int, int> neighbors[8];
public:
typedef std::array<std::array<uint16_t,Y>,X> Grid;
private:
uint16_t getCellStatus(Grid const& conway, int x, int y) {
uint16_t liveCount = 0;
for(auto&& neighbor: neighbors) {
int nX = x + neighbor.first;
int nY = y + neighbor.second;
if(nX>=0 && nX<X && nY>=0 && nY<Y){
if(conway[nX][nY]>0) liveCount++;
}
}
if(conway[x][y]>0){
if(liveCount==2 ||liveCount == 3) return 1;
}
else {
if(liveCount==3) return 1;
}
return 0;
}
public:
GameOfLife() {
size_t index = 0;
for(int i=-1; i<=1; ++i) {
for(int j=-1; j<=1; ++j){
if((i|j)==0) continue;
neighbors[index].first = i;
neighbors[index++].second = j;
}
}
}
Grid getNextConway(Grid const& conway) {
Grid output;
for(size_t i=0; i<X; ++i)
for(size_t j=0; j<Y; ++j) output[i][j]=getCellStatus(conway,i,j);
return output;
}
Grid printGrid(Grid const& conway) {
for (int i = 0; i < X; ++i){
for (int j = 0; j < Y; ++j) {
if(conway[i][j]==0) std::cout<<"0";
else std::cout<<"1";
}
std::cout<<std::endl;
}
std::cout<<std::endl;
}
};
int main() {
size_t const DIM = 8;
size_t const NUM_GENS = 10;
typedef GameOfLife<DIM,DIM> Game;
typename Game::Grid gameGrid;
for (int i = 0; i < DIM; ++i) {
for (int j = 0; j < DIM; ++j) {
gameGrid[i][j] = rand()%2;
}
}
Game conway;
conway.printGrid(gameGrid);
for (int i = 0; i < NUM_GENS; ++i) {
gameGrid = conway.getNextConway(gameGrid);
conway.printGrid(gameGrid);
}
return 0;
}
模板
生命类{
私人:
std::配对邻居[8];
公众:
typedef std::阵列网格;
私人:
uint16_t getCellStatus(网格常数&康韦,整数x,整数y){
uint16_t liveCount=0;
用于(自动和邻居:邻居){
int nX=x+邻居。第一;
int-nY=y+neighbor.second;
如果(nX>=0&&nX=0&&nY0)liveCount++;
}
}
如果(康威[x][y]>0){
if(liveCount==2 | | liveCount==3)返回1;
}
否则{
if(liveCount==3)返回1;
}
返回0;
}
公众:
生命的游戏(){
尺寸指数=0;
对于(inti=-1;i),您的问题到底是什么?