Java-приложение не отображается правильно

Я делаю базовую версию «Игры жизни» на Java, но не могу заставить ячейки отображаться правильно. Ниже приведены только два класса в пакете.

Это первый класс:

package gameLogics;

import java.awt.BorderLayout;
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics2D;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferStrategy;

import javax.swing.JFrame;

@SuppressWarnings("serial")
public class Game extends Canvas implements Runnable {

    public static final int width = 128;
    public static final int height = 96;
    public static final String name = "The Game of Life";
    public static final int cellWidth = 6;

    private JFrame frame;

    public static boolean running = false;

    public static ObjCell[] objCell = new ObjCell[width * height];

    public Game() {

        setPreferredSize(new Dimension(width * cellWidth, height * cellWidth));

        frame = new JFrame(name);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLayout(new BorderLayout());
        frame.add(this, BorderLayout.CENTER);
        frame.pack();
        frame.setResizable(false);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);

        // addKeyListener(this);

        for (int i = 0; i < objCell.length; i++) {
            objCell[i] = new ObjCell(i % Game.height, (int) Math.floor(i
                    / Game.height));
            objCell[i].on = Math.random() < 0.5;
        }

    }

    public static void main(String[] args) {

        new Game().start();

    }

    private void start() {

        running = true;
        new Thread(this).start();

    }

    public void run() {

        while (running) {

            // for (int i = 0; i < objCell.length; i++) {
            // if (objCell[i] == null) {
            // System.out.println("objCell[" + i
            // + "] was the first null value.");
            // break;
            // }
            // }

            for (int i = 0; i < objCell.length; i++)
                objCell[i].countNeighbours();
            for (int i = 0; i < objCell.length; i++)
                objCell[i].changeState();

            render();

            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

        }

    }

    public void render() {

        BufferStrategy bs = getBufferStrategy();

        if (bs == null) {
            createBufferStrategy(3);
            bs = getBufferStrategy();
        }

        Graphics2D g = (Graphics2D) bs.getDrawGraphics();

        // Draw background
        g.setPaint(Color.white);
        g.fill(new Rectangle2D.Double(0, 0, width * cellWidth, height
                * cellWidth));

        // Draw cells
        g.setPaint(Color.black);
        for (int i = 0; i < objCell.length; i++) {
            if (objCell[i].on)
                g.fill(new Rectangle2D.Double(objCell[i].x * cellWidth,
                        objCell[i].y * cellWidth, cellWidth, cellWidth));
        }

        g.dispose();

        bs.show();

    }

}

Это второй класс:

package gameLogics;

public class ObjCell {

    public int x, y;
    public boolean on = false;

    private short neighbours;

    public ObjCell(int x, int y) {

        this.x = x;
        this.y = y;

    }

    public void countNeighbours() {

        neighbours = 0;
        if (inScreen(x - 1, y - 1)
                && Game.objCell[x - 1 + (y - 1) * Game.height].on)
            neighbours++;
        if (inScreen(x, y - 1) && Game.objCell[x + (y - 1) * Game.height].on)
            neighbours++;
        if (inScreen(x + 1, y - 1)
                && Game.objCell[x + 1 + (y - 1) * Game.height].on)
            neighbours++;
        if (inScreen(x + 1, y) && Game.objCell[x + 1 + y * Game.height].on)
            neighbours++;
        if (inScreen(x + 1, y + 1)
                && Game.objCell[x + 1 + (y + 1) * Game.height].on)
            neighbours++;
        if (inScreen(x, y + 1) && Game.objCell[x + (y + 1) * Game.height].on)
            neighbours++;
        if (inScreen(x - 1, y + 1)
                && Game.objCell[x - 1 + (y + 1) * Game.height].on)
            neighbours++;
        if (inScreen(x - 1, y) && Game.objCell[x - 1 + y * Game.height].on)
            neighbours++;

    }

    public void changeState() {

        on = neighbours == 2 && on || neighbours == 3;

    }

    private boolean inScreen(int x, int y) {

        return x >= 0 && x < Game.width && y >= 0 && y < Game.height;

    }

}

Мне жаль, что я не могу предоставить больше информации, но я действительно понятия не имею, что не так.

Заранее спасибо.


person Ontonator    schedule 06.11.2013    source источник


Ответы (1)


Как вы имеете в виду, что вы не можете заставить ячейки отображаться правильно?

Возможны несколько проблем (однако без полного понимания вашего кода я не смогу дать четкий ответ - на самом деле это больше подходит в качестве комментария, но я не могу комментировать):

  • Устанавливаете ли вы все значения «on» равными false/true раньше (я предполагаю, что есть начальные семена, которые вам нужно заполнить?)
  • Вы определяете одномерный массив... ObjCell[]... вы могли бы использовать двумерный массив (ObjCell[width][height] или аналогичный) и изменить логику проверки соседей?

Эта ссылка может помочь: Игра жизни на Java, перенаселение, но не могу понять почему

person Richie Hughes    schedule 06.11.2013
comment
Спасибо за ваш отзыв. Я только что сделал массив 2D, и это, похоже, исправило ситуацию. Я не знаю, почему я вообще сделал это 1D, но в то время это казалось логичным. - person Ontonator; 07.11.2013