Swing Deklarierung im MVC

Jinro

Mitglied
Hallo Zusammen,

ich zermatere mir jetzt schon seit einigen Stunden den Kopf, komme aber nicht weiter.
Ich programmiere grad ein Brettspiel. Es verfügt über 2 Player (human) mit jeweils einem "currentPlayer" der am Zug ist. Immer wenn ich das Spiel starte und testen möchte ob sich was geändert hat, wirft er mir meine Exception, dass "Player = null" ist.
Das Spiel ist nach dem MVC aufgebaut und ich vermute, dass ich entweder

a) i-wie die currentPlayer flasch übergebe
b) die currentPlayer falsch initialisiert hab
oder
c) i-was vergessen habe, es aber partout nicht bemerke...

heir mal die code schnipsel, von den ich denke dass sie relevante sind....

mein Model
Java:
public class UiModel extends Observable {

    private static Game game = MerelsGame.createNewGame();
    
    private Player currentPlayer  = game.getFirstPlayer();
    
    public void setGame(Game game) {
        UiModel.game = game;
    }

    /**
     * @return Returns the game.
     */
    public static Game getGame() {
        return game;
    }

    /**
     * @param currentPlayer The currentPlayer to set.
     */
    public void setCurrentPlayer(Player currentPlayer) {
        setChanged();
        this.currentPlayer = currentPlayer;
        notifyObservers();
    }
    
    /**
     * @return Returns the currentPlayer.
     */
    public Player getCurrentPlayer() {
        return currentPlayer;
    }
mein Controller, der die Methode aufruft...
Java:
public class UiController {

    private UiModel model;

    public UiController() {
        UiBoard viewer = new UiBoard(this);
        model = new UiModel();
        model.addObserver(viewer);

    }
     public void changeStartField(Field field) {
        this.model.setStartField(field);
        try {
            Round.executeTurn(UiModel.getGame().getBoard(), model.getCurrentPlayer(), model
                    .getStartField(), model.getEndField());
        } catch (MerelsException e) {
            // TODO: Throw Exception
            System.err.println(e.getMessage());
        }
       
    }
class Round - der Teil der die Exception wirft (gekürzt)
Java:
public class Round {

public static void executeTurn(Board board, Player player, Field startField, Field endField)
            throws MerelsException {
        

        if (player == null) {
            throw new MerelsException("Player is null. -Round");
        }
}

er kommt ja noch gar nicht soweit, die "executeTurn" auszuführen, da ja die Exception geworfen wird..
Tipps und Anstöße nehme ich gern an :)

Grüße
JinRo
 
T

Tomate_Salat

Gast
ist zwar schön viel quellcode, aber ich kapier nicht, wo hier der Einstieg in die Anwenudung ist :-/. Aber ich würde mal so was da ist schätzen, der Fehler liegt bei

[c]game.getFirstPlayer();[/c]
 

Jinro

Mitglied
hm.. ich hatte da auch schon "rumgeschraubt" --> was würdest du evt. ändern?

Java:
public class Game  {

    private Player firstPlayer;

/**
     * @param firstPlayer
     *            The firstPlayer to set.
     */
    public void setFirstPlayer(Player firstPlayer) {
        this.firstPlayer = firstPlayer;
    }

    /**
     * @return Returns the firstPlayer.
     */
    public Player getFirstPlayer() {
        return firstPlayer;
    }
die main
Java:
public class MerelsGame {

    public static void main(String[] args) throws Exception {

        Runnable r = new Runnable() {

            public void run() {
                new UiController();
            }
        };

        SwingUtilities.invokeAndWait(r);
    }

    public static Game createNewGame() {

        Game game = new Game();

        Board board = new Board();
        board.getFields().add(new Field(XAxis.X1, YAxis.Y1));
        board.getFields().add(new Field(XAxis.X1, YAxis.Y4));
        board.getFields().add(new Field(XAxis.X1, YAxis.Y7));
        board.getFields().add(new Field(XAxis.X2, YAxis.Y2));
        board.getFields().add(new Field(XAxis.X2, YAxis.Y4));
        board.getFields().add(new Field(XAxis.X2, YAxis.Y6));
        board.getFields().add(new Field(XAxis.X3, YAxis.Y3));
        board.getFields().add(new Field(XAxis.X3, YAxis.Y4));
        board.getFields().add(new Field(XAxis.X3, YAxis.Y5));
        board.getFields().add(new Field(XAxis.X4, YAxis.Y1));
        board.getFields().add(new Field(XAxis.X4, YAxis.Y2));
        board.getFields().add(new Field(XAxis.X4, YAxis.Y3));
        board.getFields().add(new Field(XAxis.X4, YAxis.Y5));
        board.getFields().add(new Field(XAxis.X4, YAxis.Y6));
        board.getFields().add(new Field(XAxis.X4, YAxis.Y7));
        board.getFields().add(new Field(XAxis.X5, YAxis.Y3));
        board.getFields().add(new Field(XAxis.X5, YAxis.Y4));
        board.getFields().add(new Field(XAxis.X5, YAxis.Y5));
        board.getFields().add(new Field(XAxis.X6, YAxis.Y2));
        board.getFields().add(new Field(XAxis.X6, YAxis.Y4));
        board.getFields().add(new Field(XAxis.X6, YAxis.Y6));
        board.getFields().add(new Field(XAxis.X7, YAxis.Y1));
        board.getFields().add(new Field(XAxis.X7, YAxis.Y4));
        board.getFields().add(new Field(XAxis.X7, YAxis.Y7));

        game.setBoard(board);

        


        System.out.println("Neues Spiel gestartet - MG.java");

        return game;
    }

    public static Field getField(Board board, XAxis x, YAxis y) {

        for (Field field : board.getFields()) {
            if (field.getX() == x && field.getY() == y) {
                return field;
            }
        }

        return null;
    }

}

hilft dir das weiter? wie gesagt, habe schon alles probiert, was mir eingefallen ist... aber bin i-wie der meinung, dass ich i-was übersehe...
 

Jinro

Mitglied
Ich dachte eigentlich, dass das durch die Game() Instanz erledigt wird... da diese ja die "private Player firstPlayer, secondPlayer;" hält.

Wo soll ich die Player-instanzen erstellen??? hab immernochdas brett vorm kopf...
 
Zuletzt bearbeitet:
T

Tomate_Salat

Gast
Java:
    private Player firstPlayer;

hier steht soviel wie:
Java:
private Player firstPlayer = null;

entweder du deklarierst hier schon deinen Player, oder wie ich es machen würde:

Java:
public Player getFirstPlayer() 
{
        return new Player();
}

Obwohl, vllt schaust du dir das mal an, wie Marco13 das in seinem TicTacToe-Beispiel realisiert hat.
 

Jinro

Mitglied
entweder du deklarierst hier schon deinen Player, oder wie ich es machen würde:

Java:
public Player getFirstPlayer() 
{
        return new Player();
}

Obwohl, vllt schaust du dir das mal an, wie Marco13 das in seinem TicTacToe-Beispiel realisiert hat.

hey.. das hat funktioniert, danke.

wo siehst du denn den unterschied, wenn ich es so mache wir du es mit empfohlen hast, bzw. das Erstellen bereits in der initialisierung oder der setFirstPlayer()-Methode umzusetzen...

leider konnte ich mit der Umsetzung von Marco nicht so viel anfangen, da in meinem Fall die Player-Instanzen komplexer sind...und noch einige wichtige informationen halten.
 
T

Tomate_Salat

Gast
keinen wirklichen. Wenn du Attribute setzen willst, kannst du das in beiden fällen noch in der getFirstPlayer. Nur ich händle es aus gewohnheit so, dass ich meine Objekte erst deklariere/initalisiere, wenn ich sie auch wirklich bruach
 

Neue Themen


Oben