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...