4 Op Een Rij - van console naar GUI

Status
Niet open voor verdere reacties.

ellendm

Gebruiker
Lid geworden
6 dec 2008
Berichten
38
Hallo,

ik heb een volledig werkende versie van vier op een rij voor de console. Nu zou ik dat in een mooie gui willen krijgen.

Ik gebruik een klasse Bordpanel extends JPanel, in die klasse maak ik een 2D-array van JLabels en vul die in de panel.

Code:
raster = new JLabel[rijen][kolommen];
        for (int x = 0; x < rijen; x++){
            for (int y = 0; y < kolommen; y++){
                raster[x][y] = new JLabel(leeg);
                raster[x][y].setBorder(new LineBorder(Color.BLACK));
                super.add(raster[x][y]);
            }
        }

Nu is ik zoek een manier om mijn consolebord (een 2D-array) te kunnen "synchroniseren" met mijn array van Jlabels.

Consolebord
Code:
public void setBeginBord() {
        for (int indexRij = 0; indexRij < rijen; indexRij++) {
            for (int indexKolom = 0; indexKolom < kolommen; indexKolom++) {
                bord[indexRij][indexKolom] = leeg;
            }
        }
    }
Code:
public String toon() {
        String s = "";
        for (int indexRij = 0; indexRij < rijen; indexRij++) {               //print de nummers voor de eerste rij
            s += String.format("%d ", rijen - indexRij);
            for (int indexKolom = 0; indexKolom < kolommen; indexKolom++) {
                s += String.format("%c ", bord[indexRij][indexKolom]);
            }
            s += String.format("\n");
        }
        s += "  ";
        for(int index = 1; index <= kolommen; index++)
            s += "" + index + " ";
        return s;
    }


Hier is ook mijn volledig project:
Bekijk bijlage 4oprij.rar
 
Er wordt gespeeld als er geklikt wordt op een bepaalde kolom neem ik aan.

Zorg dat je model en view elkaar kennen.

Als je een class VierOpEenRijLabel extends JLabel aanmaakt kan je deze zijn rijnummer meegeven of je je doet gewoon JLabel.setName(kolomnr) bij het aanmaken van de JLabel.
Koppel je VierOpEenRijLabel of je JLabel aan een mouselistener. Op het moment dat je klikt op een Label roept de mouselistener je model aan die het kolomnummer uit je JLabel haalt. Je model doet daarop de nodige berekeningen en vraagt dan terug aan de GUI de JLabel op die hij wilt wijzigen en zegt hem welke kleur er in moet
Code:
getRaster()[x][y].setImage("pathNaarDeImageMetDeJuisteKleur");

Dit gezegd zijnde, dit is NIET volgens het mooie MVC (model-view-controller) principe. Nu moet je veranderingen aan je model aanbrengen om over te schakelen van je console naar je 2D UI en dat zou niet mogen. Als je hier meer informatie over wilt moet je maar eens roepen.
 
Ik heb je raad opgevolgd door een klasse BordLabel extends JLabel te maken en zo ook de coordinaten kunnen teruggeven als er op geklikt word.

Maar het probleem is dat ik liefst niets aan mijn code voor console verander. Misschien nog tips hoe ik dat zou doen? Alvast bedankt voor reactie.
 
Ik weet niet hoe je model in elkaar steekt, in je rar steken geen source files en op mijn laptop kan (en mag) ik geen rars openen. Maar, wat moet je hebben?

Eerst en vooral moet je alles wat input/output is uit je model halen (misschien had je dat al gedaan)

Ik heb even wat in elkaar geflanst (niet volledig uitgewerkt en waarschijnlijk staan er wel fouten in) om als voorbeeld te gebruiken.

Je start je programma in eerste instantie op vanuit een console. Die geeft je 2 keuzes, ofwel doorgaan in de console ofwel een UI starten. (dit heb ik niet gemaakt maar dat kan je zelf ook wel)
1) verder in console: je maakt een instantie van de class "GameConsoleController" die doet de afhandeling van alles wat grafisch weergegeven wordt in je controller.
2) open een JFrame: je maakt een instantie van de class "GameFrameController"

van beide roep je start() op.
Beiden werken met hetzelfde model, dat de nodige berekingen doet ("GameAccess").

Class GameConsoleController:
PHP:
package fourInARow.controller;

import fourInARow.model.GameAccess;
import fourInARow.view.GameConsole;

/*
 * dit is de link tussen de console en het spel
 */

public class GameConsoleController {

    private GameConsole console;
    private GameAccess spel;

    public GameConsoleController() {
        console = new GameConsole();
        spel = new GameAccess();
    }

    public void start() {
        int i = console.vraagNieuwSpelVoortdoenOfExit(spel.isEersteSpel());
        if (i == 9) {
            spel.stopSpel();
        } else if (i == 1) {
            spel.startNieuwSpel();
            spel.setSpeler(0, console.vraagNaamSpeler(0));
            spel.setSpeler(1, console.vraagNaamSpeler(1));
            speel();
        } else if (i == 3){
            if (spel.isEersteSpel()) {
                start();
            } else {
                spel.volgendeSpel();
                speel();
            }
        } else {
            start();
        }
    }

    public void speel() {
        while (!spel.isBeëindigd()) {
            String spelerAanZet = spel.getNaamSpelerAanZet();
            int i = console.vraagKolom(spelerAanZet);
            spel.doeZet(i);
            console.toonSpeelveld(spel.getVeld());
        }
        console.toonResultaat(spel.getResultaat());
    }

}

class GameFrameController:
PHP:
package fourInARow.controller;

import fourInARow.model.GameAccess;
import fourInARow.view.BordLabel;
import fourInARow.view.GameFrame;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.ImageIcon;

/*
 * Dit is de link tussen de 2D interface en het spel
 */
public class GameFrameController implements MouseListener {

    private GameFrame frame;
    private GameAccess spel;
    private char[][] veld;

    public GameFrameController() {
        frame = new GameFrame();
        spel = new GameAccess();
    }

    public void start() {
        int i = frame.vraagNieuwSpelVoortdoenOfExit(spel.isEersteSpel());
        if (i == 9) {
            spel.stopSpel();
        } else if (i == 1) {
            spel.startNieuwSpel();
            spel.setSpeler(0, frame.vraagNaamSpeler(0));
            spel.setSpeler(1, frame.vraagNaamSpeler(1));
            speel();
        } else if (i == 3) {
            if (spel.isEersteSpel()) {
                start();
            } else {
                spel.volgendeSpel();
                speel();
            }
        } else {
            start();
        }
    }

    public void speel() {
        veld = spel.getVeld();
        frame.maakSpeelveld(this);
    }

    public void mouseClicked(MouseEvent e) {
        if (e.getSource() instanceof BordLabel) {
            int x = ((BordLabel) e.getSource()).getKolom();
            spel.doeZet(x);
            for (int i = 0; i < 6; i++) {
                for (int j = 0; j < 7; j++) {
                    if (veld[i][j] != spel.getVeld()[i][j]) {
                        String path = "";
                        switch (spel.getVeld()[i][j]) {
                            case 'X':
                                path = "path/Naar/AfbeeldingRodeCirkel.gif";
                                break;
                            case 'O':
                                path = "path/Naar/AfbeeldingGeleCirkel.gif";
                                break;
                            case 'G':
                                path = "path/Naar/GewonnenCirkel.gif";
                                break;
                            default:
                                path = "";
                                break;
                        }
                        if (!path.equals("")) {
                            frame.getLabels()[i][j].setIcon(new ImageIcon(path));
                        }
                    }
                }
            }
            if (spel.isBeëindigd()) {
                frame.toonResultaat(spel.getResultaat());
                start();
            } else {
                frame.toonSpelerAanZet(spel.getNaamSpelerAanZet());
            }
        }
    }

    public void mousePressed(MouseEvent e) {}
    public void mouseReleased(MouseEvent e) {}
    public void mouseEntered(MouseEvent e) {}
    public void mouseExited(MouseEvent e) {}
}

Het spel zelf (dus je model, dat heb je al), Class GameAccess:
PHP:
package fourInARow.model;

/*
 * Dit is de toegang naar het model van je spel,
 * hier kunnen alle vragen gesteld worden i.v.m. het verloop van het spel
 * of je alles hier berekent of onderverdeeld over andere classes is jouw
 * vrije keuze
 */

public class GameAccess {

    private String[] spelers = new String[2];
    private int spelerAanZet;
    private char[][] veld;
    private boolean beëindigd;
    private String resultaat;
    private boolean eersteSpel;

    public void startNieuwSpel() {
        /*
         * zet alles terug op zijn initiële waarde
         *
         */
    }

    public void volgendeSpel() {
        /*
         * maak het speelveld leeg maar nu mag de andere speler beginnen
         * (dus de spelernamen worden bijgehouden alsook de stand)
         *
         */
    }
    
    public void doeZet(int kolom) {
        /*
         * bereken welke kleur waar komt,
         * of er gewonnen is
         * en indien niet gewonnen, verander speler
         */
    }

    public void setSpeler(int i, String spelernaam) {
        spelers[i] = spelernaam;
    }

    public String getNaamSpelerAanZet() {
        return spelers[spelerAanZet];
    }

    public int getSpelerAanZet() {
        return spelerAanZet;
    }

    public boolean isBeëindigd() {
        return beëindigd;
    }

    public boolean isEersteSpel() {
        return eersteSpel;
    }

    public char[][] getVeld() {
        return veld;
    }

    public String getResultaat() {
        /*
         * Wie heeft het laatste spel gewonnen?
         * Wat is de tussenstand?
         */
        return resultaat;
    }

    public void stopSpel() {
        System.exit(0);
    }

}

de view in Console -hier heb je eigenlijk alle code van-, Class GameConsole:
PHP:
package fourInARow.view;

/*
 * hier gebeurt alles wat grafisch weergegeven wordt in de console
 * om het geheel overzichtelijk te houden wordt hier niets berekend,
 * enkel input/output.
 */

public class GameConsole {

    public String vraagNaamSpeler(int spelernummer) {
        String naam = "";
        //TODO read input
        return naam;
    }

    public int vraagNieuwSpelVoortdoenOfExit(boolean eersteSpel) {
        int optie = 0;
        //als eersteSpel == true wordt de optie voortdoen niet getoond
        //TODO read input
        return optie;
    }
    
    public int vraagKolom(String spelernaam) {
        int kolom = 0;
        //TODO read input
        return kolom;
    }

    public void toonSpeelveld(char[][] veld) {
        //TODO write output
    }

    public void toonResultaat(String resultaat) {
        //TODO write output
    }

}

en dan de nieuwe 2D interface, Class GameFrame:
PHP:
package fourInARow.view;

import java.awt.event.MouseListener;
import javax.swing.JFrame;

/*
 * hier gebeurt alles wat grafisch weergegeven wordt in de 2D interface
 * om het geheel overzichtelijk te houden wordt hier niets berekend,
 * enkel input/output.
 */

public class GameFrame extends JFrame {

    private BordLabel[][] labels;    
    
    public String vraagNaamSpeler(int spelernummer) {
        String naam = "";
        //TODO read input
        return naam;
    }

    public int vraagNieuwSpelVoortdoenOfExit(boolean eersteSpel) {
        int optie = 0;
        //als eersteSpel == true wordt de optie voortdoen niet getoond
        //TODO read input
        return optie;
    }

    public void toonSpelerAanZet(String spelernaam) {
        //TODO
    }
    
    public void maakSpeelveld(MouseListener listener) {
        //TODO bouw je speelveld uit BordLabels
    }

    public BordLabel[][] getLabels() {
        return labels;
    }

    public void toonResultaat(String resultaat) {
        //TODO 
    }

}

en deze gebruikt, zoals je weet, een eigen aangepaste JLabel, Class BordLabel:
PHP:
package fourInARow.view;

import java.awt.event.MouseListener;
import javax.swing.JLabel;

public class BordLabel extends JLabel{

    private int rij, kolom;

    public BordLabel(int rij, int kolom, MouseListener ml) {
        this.rij = rij;
        this.kolom = kolom;
        addMouseListener(ml);
    }

    public int getKolom() {
        return kolom;
    }

    public int getRij() {
        return rij;
    }

}

Zo, ik zou eerst proberen te kijken wat ik heb geprobeerd (en vooral waarom) om dan eens te zien hoe je jouw code nu kan aanpassen. Veel succes:thumb: en als je vragen hebt...
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan