2016-09-09 2 views
0

저는 Game of Life 프로그램을 아주 단순한 (그러나 어쩌면 틀린) 방법으로 만들려고 노력해 왔습니다. 기술적으로는 작동하는 것처럼 보이지만 일부 테스트 케이스를 실행하려고하면 결과가 온라인 예제에 적합하지 않습니다.Game of Life in Java 프로그램

다음은 메인 클래스입니다 :

package gameOfLife;import java.applet.*; 
import java.awt.Frame; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Image; 
import java.awt.Rectangle; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 

import gameOfLife.Cell.State; 

public class CreateGame extends Applet implements Runnable, MouseListener, KeyListener { 


private enum GameState { 
    SETTING, START 
} 

private GameState state = GameState.SETTING; 
private Image image; 
private Graphics second; 
private Cell[][] cells = new Cell[200][120]; 
private int indexI = 1; 
private int indexJ = 1; 

@Override 
public void init() { 
    setSize(1000, 600); 
    setFocusable(true); 
    Frame frame = (Frame) this.getParent().getParent(); 
    frame.setResizable(false); 
    frame.setTitle("Game of Life - Settings"); 

    for (int i = 0; i < cells.length; i++) { 
     for (int j = 0; j < cells[0].length; j++) { 
      cells[i][j] = new Cell(i * 5, j * 5); 
     } 
    } 
    addMouseListener(this); 
    addKeyListener(this); 
    super.init(); 
} 

@Override 
public void start() { 
    Thread thread = new Thread(this); 
    thread.start(); 
    super.start(); 
} 

@Override 
public void run() { 
    while (true) { 
     if (state == GameState.START) { 
      for(int i=1; i<cells.length-1; i++){ 
       for(int j=1; j<cells[0].length-1; j++){ 
        update(i, j); 
       } 
      } 
     } 
     repaint(); 
     try { 
      Thread.sleep(125); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

public void update(int i, int j) { //updating the cells into ALIVE/DEAD state 
    int[] neighbors = new int[8]; 
    int sum = 0; 
    for (int index = 0; index < 8; index++) 
     neighbors[index] = 0; 
    if (cells[i - 1][j - 1].state == State.ALIVE) 
     neighbors[0] = 1; 
    if (cells[i][j - 1].state == State.ALIVE) 
     neighbors[1] = 1; 
    if (cells[i + 1][j - 1].state == State.ALIVE) 
     neighbors[2] = 1; 
    if (cells[i - 1][j].state == State.ALIVE) 
     neighbors[3] = 1; 
    if (cells[i + 1][j].state == State.ALIVE) 
     neighbors[4] = 1; 
    if (cells[i - 1][j + 1].state == State.ALIVE) 
     neighbors[5] = 1; 
    if (cells[i][j + 1].state == State.ALIVE) 
     neighbors[6] = 1; 
    if (cells[i + 1][j + 1].state == State.ALIVE) 
     neighbors[7] = 1; 
    for (int index = 0; index < 8; index++) 
     sum += neighbors[index]; 
    if ((sum < 2 || sum > 3) && cells[i][j].state == State.ALIVE) 
     cells[i][j].state = State.DEAD; 
    else { 
     if (sum == 3 && cells[i][j].state == State.DEAD) 
      cells[i][j].state = State.ALIVE; 
    } 
} 

@Override 
public void paint(Graphics g) { 
    Graphics2D g2d = (Graphics2D) g; 
    Rectangle r; 
    for (int i = 0; i < cells.length; i++) { 
     for (int j = 0; j < cells[0].length; j++) { 
      if (cells[i][j].state == State.ALIVE) { 
       r = cells[i][j].getCell(); 
       g.fillRect((int) r.getX(), (int) r.getY(), (int) r.getWidth(), (int) r.getHeight()); 
      } 
     } 
    } 
    super.paint(g); 
} 

@Override 
public void update(Graphics g) { 
    if (image == null) { 
     image = createImage(this.getWidth(), this.getHeight()); 
     second = image.getGraphics(); 
    } 

    second.setColor(getBackground()); 
    second.fillRect(0, 0, getWidth(), getHeight()); 
    second.setColor(getForeground()); 
    paint(second); 

    g.drawImage(image, 0, 0, this); 
} 

@Override 
public void mousePressed(MouseEvent e) { 
    if (state == GameState.SETTING) { 
     int x = e.getX() - e.getX() % 5; 
     int y = e.getY() - e.getY() % 5; 

     cells[x/5][y/5].born(); 
    } 
} 

@Override 
public void mouseEntered(MouseEvent e) { 
    // TODO Auto-generated method stub 

} 

@Override 
public void mouseExited(MouseEvent e) { 
    // TODO Auto-generated method stub 

} 

@Override 
public void mouseClicked(MouseEvent e) { 
    // TODO Auto-generated method stub 

} 

@Override 
public void mouseReleased(MouseEvent e) { 
    // TODO Auto-generated method stub 

} 

@Override 
public void keyPressed(KeyEvent e) { 
    if (e.getKeyCode() == KeyEvent.VK_SPACE) { 
     if(state == GameState.START) 
      state = GameState.SETTING; 
     else 
      state = GameState.START; 
    } 

} 

@Override 
public void keyReleased(KeyEvent arg0) { 
    // TODO Auto-generated method stub 

} 

@Override 
public void keyTyped(KeyEvent arg0) { 
    // TODO Auto-generated method stub 

} 

}

내가 스페이스 키를 눌러 당신이 (SETTING 세포를 만들 수있는 화면을 클릭에서 게임 상태를 변경하는 방식으로 프로그램을 제작하는 게임을 일시 중지합니다.) 그리고 START는 게임 자체를 실행합니다. ,

package gameOfLife; 

import java.awt.Rectangle; 

public class Cell { 

final int Measure = 5; 
public static enum State{ 
    DEAD, ALIVE 
} 

private Rectangle cell; 
private int x, y; 

public State state; 

public void born(){ 
    state = State.ALIVE; 
} 

public Cell(int x, int y){ 
    state = State.DEAD; 
    cell = new Rectangle(x, y, Measure, Measure); 
    this.x = x; 
    this.y = y; 
} 

public Rectangle getCell(){ 
    return this.cell; 
} 

}

사람이 그것을 테스트하고 좋을 것이다 프로그램 로직 뭐가 잘못 됐는지 말해 줄 수 있다면, 때문에 전체의 작업 : 셀은 사각형과 상태를 포함 내가 만든 클래스입니다 하지만 나사를 조이면 안되는 사소한 문제가 있습니다.

+6

이 http://codereview.stackexchange.com/ –

+0

당신은 샘플 입력으로 재현 예를 만드는 경우가 여기에 해당 될 수있다에 더 적합 할 수 있습니다 보인다

개정 코드가 작동하는 예상 출력 설명 및 잘못된 출력 샘플. "여기에 코드가 있습니다. 오류를 찾으십시오."사람들이 일반적으로 여기에 응답하는 것이 아닙니다. –

+0

글쎄, 미안하지만,이 장소가 어떻게 작동하는지 정말로 모르겠다. 나는 내가 한 것처럼 그것을 게시 할 수있을 것이라고 생각했고, 필요한 출력에 대한 설명이나 예가 있으면 주석에 게시 할 것입니다. – user3917631

답변

2

그리드를 반복하면서 각 셀의 상태를 새로 고침하는 오류가 발생했으나 올바른 방법은 반복 중에 새로운 셀 상태의 표를 만든 다음 기존 셀 상태를 설정하는 것입니다. 그것이 의미가있는 경우에, 1 개의 새로운 세포 국가에. ,

public class CreateGame 
    extends Applet 
    implements Runnable, MouseListener, KeyListener 
{ 

    private enum GameState 
    { 
    SETTING, START 
    } 

    private GameState state = GameState.SETTING; 

    private Image image; 

    private Graphics second; 

    private Cell[][] cells = new Cell[200][120]; 

    private int indexI = 1; 

    private int indexJ = 1; 

    @Override 
    public void init() 
    { 
    setSize(1000, 600); 
    setFocusable(true); 
    Frame frame = (Frame) this.getParent().getParent(); 
    frame.setResizable(false); 
    frame.setTitle("Game of Life - Settings"); 

    for (int i = 0; i < cells.length; i++) 
    { 
     for (int j = 0; j < cells[0].length; j++) 
     { 
     cells[i][j] = new Cell(i * 5, j * 5); 
     } 
    } 
    addMouseListener(this); 
    addKeyListener(this); 
    super.init(); 
    } 

    @Override 
    public void start() 
    { 
    Thread thread = new Thread(this); 
    thread.start(); 
    super.start(); 
    } 

    @Override 
    public void run() 
    { 
    while (true) 
    { 
     if (state == GameState.START) 
     { 
     Cell[][] newCells = new Cell[200][120]; 

     for (int i = 0; i < newCells.length; i++) 
     { 
      for (int j = 0; j < newCells[0].length; j++) 
      { 
      newCells[i][j] = new Cell(i * 5, j * 5); 
      } 
     } 

     for (int i = 1; i < cells.length - 1; i++) 
     { 
      for (int j = 1; j < cells[0].length - 1; j++) 
      { 
      update(newCells, i, j); 
      } 
     } 

     cells = newCells; // update all cell states in one go 
     } 
     repaint(); 
     try 
     { 
     Thread.sleep(125); 
     } 
     catch (InterruptedException e) 
     { 
     e.printStackTrace(); 
     } 
    } 
    } 

    public void update(Cell[][] newCells, int i, int j) 
    { // updating the cells into ALIVE/DEAD state 

    int[] neighbors = new int[8]; 
    int sum = 0; 
    for (int index = 0; index < 8; index++) 
     neighbors[index] = 0; 
    if (cells[i - 1][j - 1].state == State.ALIVE) 
     neighbors[0] = 1; 
    if (cells[i][j - 1].state == State.ALIVE) 
     neighbors[1] = 1; 
    if (cells[i + 1][j - 1].state == State.ALIVE) 
     neighbors[2] = 1; 
    if (cells[i - 1][j].state == State.ALIVE) 
     neighbors[3] = 1; 
    if (cells[i + 1][j].state == State.ALIVE) 
     neighbors[4] = 1; 
    if (cells[i - 1][j + 1].state == State.ALIVE) 
     neighbors[5] = 1; 
    if (cells[i][j + 1].state == State.ALIVE) 
     neighbors[6] = 1; 
    if (cells[i + 1][j + 1].state == State.ALIVE) 
     neighbors[7] = 1; 
    for (int index = 0; index < 8; index++) 
     sum += neighbors[index]; 

    if (cells[i][j].state == State.ALIVE) 
    { 
     if ((sum < 2 || sum > 3)) 
     { 
     newCells[i][j].state = State.DEAD; 
     } 
     else // sum == 2 or 3 
     { 
     newCells[i][j].state = State.ALIVE; 
     } 
    } 
    else if (cells[i][j].state == State.DEAD) 
    { 
     if (sum == 3) 
     { 
     newCells[i][j].state = State.ALIVE; 
     } 
    } 
    } 

    @Override 
    public void paint(Graphics g) 
    { 
    Graphics2D g2d = (Graphics2D) g; 
    Rectangle r; 
    for (int i = 0; i < cells.length; i++) 
    { 
     for (int j = 0; j < cells[0].length; j++) 
     { 
     if (cells[i][j].state == State.ALIVE) 
     { 
      r = cells[i][j].getCell(); 
      g.fillRect((int) r.getX(), (int) r.getY(), (int) r.getWidth(), (int) r.getHeight()); 
     } 
     } 
    } 
    super.paint(g); 
    } 

    @Override 
    public void update(Graphics g) 
    { 
    if (image == null) 
    { 
     image = createImage(this.getWidth(), this.getHeight()); 
     second = image.getGraphics(); 
    } 

    second.setColor(getBackground()); 
    second.fillRect(0, 0, getWidth(), getHeight()); 
    second.setColor(getForeground()); 
    paint(second); 

    g.drawImage(image, 0, 0, this); 
    } 

    @Override 
    public void mousePressed(MouseEvent e) 
    { 
    if (state == GameState.SETTING) 
    { 
     int x = e.getX() - e.getX() % 5; 
     int y = e.getY() - e.getY() % 5; 

     cells[x/5][y/5].born(); 
    } 
    } 

    @Override 
    public void mouseEntered(MouseEvent e) 
    { 
    // TODO Auto-generated method stub 

    } 

    @Override 
    public void mouseExited(MouseEvent e) 
    { 
    // TODO Auto-generated method stub 

    } 

    @Override 
    public void mouseClicked(MouseEvent e) 
    { 
    // TODO Auto-generated method stub 

    } 

    @Override 
    public void mouseReleased(MouseEvent e) 
    { 
    // TODO Auto-generated method stub 

    } 

    @Override 
    public void keyPressed(KeyEvent e) 
    { 
    if (e.getKeyCode() == KeyEvent.VK_SPACE) 
    { 
     if (state == GameState.START) 
     state = GameState.SETTING; 
     else 
     state = GameState.START; 
    } 

    } 

    @Override 
    public void keyReleased(KeyEvent arg0) 
    { 
    // TODO Auto-generated method stub 

    } 

    @Override 
    public void keyTyped(KeyEvent arg0) 
    { 
    // TODO Auto-generated method stub 

    } 

} 
+0

도움을 주셔서 대단히 감사드립니다! 당신의 코멘트를 upvote하려고했지만 seemntly 나는 그것에 대한 더 많은 평판이 필요합니다. 한 가지 더, 프로그램이 제대로 작동하는 것처럼 보입니다.하지만 무한 루프에서 실행해야하는이 테스트 케이스를 실행하려고했습니다. https://en.wikipedia.org/wiki/Gun_(cellular_automaton)## /media/File:Game_of_life_glider_gun.svg 그것이 작동하지 않았다면 코드 로직에 문제가 있습니까? – user3917631

+0

문제 없어요, 제가 도울 수있어서 기뻤습니다. 논리 오류가 여전히있을 수 있습니다. 나머지 코드는 확인하지 않았습니다. 작동하지 않는 테스트 패턴을 어떻게 설정하고 있습니까? 코드로 또는 수동으로 패턴을 생성하고 있습니까? 초기 구성에서 하나의 다른 셀로 인해 매우 다른 동작이 발생하기 때문에 묻습니다. 또한 어떻게 실패 하는가? – phil76

+0

han으로 패턴을 설정했습니다. 이제 코드 설정 작업을합니다. 나는 그것을 정확하게 설정했다. (몇 번하고 여러 번 체크했다.) 패턴은 "우주선"촬영 후 떨어지게됩니다. 끝 부분에 어떻게 보이는지에 대한 이미지가 있습니다. http://www.siz.co.il/my.php?i=nd5jq5jzmktu.png – user3917631

관련 문제