Spiel des Lebens

  • Themenstarter Themenstarter gregg001
  • Beginndatum Beginndatum
G

gregg001

Gast
Hallo zusammen,

ich hänge gerade bei dem Spiel des Lebens



Diese Klasse war vorgegeben:

Java:
package Info1;
 
 
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
 
public class SDL extends MiniJava {
    private static final Object syncObj = new Object();
    private static final int w = 20;
 
    private static class But extends JButton {
        boolean[][] arena;
        int i,j;
 
        But(boolean[][] _arena, int _i, int _j) {
            arena = _arena;
            i = _i;
            j = _j;
            setLabel();
            addActionListener(new ActionListener(){
                public void actionPerformed(ActionEvent e) {
                    arena[i][j] = !arena[i][j];
                    setLabel();
                }
            });
            setLocation(w*j,w*i);
        }
 
        void setLabel() {
            if (arena[i][j])
                setBackground(Color.RED);
            else
                setBackground(Color.BLUE);
            setSize(w,w);
        }
    }
 
    private static class UpdateArenaFrm extends JFrame {
        UpdateArenaFrm(boolean[][] arena) {
            JPanel panel = new JPanel(null);
            panel.setPreferredSize(new Dimension(400,400));
            panel.setMinimumSize(new Dimension(400,400));
            JButton okBut = new JButton("Weiter!");
            getContentPane().add(BorderLayout.SOUTH, okBut);
            okBut.addActionListener(new ActionListener(){
                public void actionPerformed(ActionEvent e) {
                    dispose();
                    synchronized(syncObj) {
                        syncObj.notifyAll();
                    }
                }
            });
            addWindowListener(new WindowAdapter() {
                public void windowClosing(WindowEvent e) {
                    System.exit(0);
                }
            });
            getContentPane().add(panel);
            for (int i=0; i<arena.length; i++)
                for (int j=0; j<arena[i].length; j++) {
                    panel.add(new But(arena,i,j));
                }
            pack();
        }
    }
 
    private static JFrame frm;
 
    public static void updateArena(boolean[][] arena) {
        UpdateArenaFrm frm = new UpdateArenaFrm(arena);
        frm.setVisible(true);
        synchronized (syncObj) {
            try {
                syncObj.wait();
            } catch(Exception e) {
                //nichts zu tun
            }
        }
    }
 
    public static void update(boolean[][] arena) {
        updateArena(arena);
    }
 
}




Das habe ich bisher selber programmiert.
Er gibt mir aber nicht die richtigen Positionen für die Lebenden und die Toten.
Auch müsste irgendwo etwas endlos durchlaufen.
Momentan komm ich aber einfach nicht drauf, wie ich es verändern soll.
Java:
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Info1;
 
/**
 *
 * @author Wu
 */
public class SpieldesLebens extends SDL {
 
    public static void main(String[] args) {
 
        boolean zustand; // true ist lebendig, false ist tot
        zustand = false;
        boolean[][] spielfeld; // Deklaration
        int anzahlzeilen = read("Anzahl der Zeilen");
        int anzahlspalten = read("Anzahl der Spalten");
        spielfeld = new boolean[anzahlzeilen][anzahlspalten];
 
//Eingabe der Konfiguration
        write("Konfigurieren sie Ihre Felder");
 
 
        update(spielfeld);
 
 
        for (int i = 0; i < anzahlzeilen; i++) {
            for (int j = 0; j < anzahlspalten; i++) {
 
                zaehleNachbarn(spielfeld, i, j);
 
            }
        }
        //update(spielfeld);
 
 
    }
 
    public static boolean isLebendig(boolean[][] spielfeld, int i, int j) {
 
        if (spielfeld[i][j] = true) {
 
            return true;
 
 
        }
        return false;
 
    }
 
    public static int zaehleNachbarn(boolean[][] spielfeld, int i, int j) {
 
        int anzahllebendig = 0;
 
        int k = i - 2;
        int l = i;
        int m = j - 2;
        int n = j;
        for (i = k; i <= l; i++) {
            for (j = m; j <= n; j++) {
                if (i == -1 || j == -1) {
                    i = 1;
                    j = 1;
                }
                if (i == -2 || j == -2) {
                    i = 0;
                    j = 0;
 
                }
                if (isLebendig(spielfeld, i, j) == true) {
 
                    anzahllebendig++;
 
                }
            }
 
        }
        if (spielfeld[i][j] == true && (anzahllebendig == 2 || anzahllebendig == 3)) {
 
            spielfeld[i][j] = true;
 
        } else {
            spielfeld[i][j] = false;
        }
 
        if (spielfeld[i][j] == false && anzahllebendig == 3) {
 
            spielfeld[i][j] = true;
 
        } else {
            spielfeld[i][j] = false;
        }
 
        update(spielfeld);
        return anzahllebendig;
 
 
 
    }
}
 
Ich denke, es muss ein Fehler in der Methode zaehleNachbarn sein.

Hat jemand eine Idee, wie ich diese noch implementieren könnte?

Vielen Dank
 
Hab mir den Code nicht genau angeschaut. Aber eventuelle Probleme könnten daran liegen, dass in der Methode zaehleNachbarn die übergebenen Variablen für die Indizes (i und j) zunächst als Zählvariablen in den for-Schleifen (miss)braucht werden, später aber mit diesen Indizes Prüfungen gemacht werden.

Hinweis:
statt
Code:
spielfeld[i][j] == true
geht auch kurz
Code:
spielfeld[i][j]

In folgendem Fall würde ich es auf jeden Fall kürzen, da der Methodenname ja schon erkennen lässt, dass ein Prüfung auf true gemacht wird:
Code:
isLebendig(spielfeld, i, j) == true
-->
Code:
isLebendig(spielfeld, i, j)
 
[c]if (spielfeld[j] = true)[/c] macht nicht das, was du denkst, dass es macht: Es weist dem entsprechenden Feld den Wert true zu. = ist der Zuweisungsoperator, == einer der Vergleichsoperatoren.

Also entweder wie schon vorgeschlagen [c]if (spielfeld[j])[/c] oder, wenn du es wirklich ausführlich willst (was ich hier aber nicht als guten Stil ansehen würde) [c]if (spielfeld[j] == true)[/c]
 

Zurück
Oben