Moin zusammen.
Ich habe die Aufgabe als Übung ein simples Mühle-Programm zu schreiben bei dem das Spielfeld in einem Fenster gezeichnet wird.
Es funktioniert erstmal auch alles, allerdings gibt es folgendes Problem:
Wenn ein Stein verschoben wird, wird das Fenster mittels repaint komplett neu gezeichnet. Dazu wird eine Tabelle abgefragt in der jeder gesetzte Stein eingetragen ist, so dass nur die Steine gezeichnet werden die aktuell gesetzt sind. Sonst müsste ich bei Bewegungen von Steinen den alten Stein aus der Grafik immer löschen, war mir zu umständlich.
Jedenfalls in der Theorie klappt das soweit, und Kollegen versicherten mir auch dass diese Ansatzweise soweit sinnig ist.
Problem:
Beim neuzeichnen des Fensters, wird nur das alte Bild "überzeichnet". Sprich wo vorher ein Stein war, ist der weiterhin zu sehen, nur die Feldlinien und Eckpunkte des Mühlefelds überlagern den.
Eigentlich sollte vom vorigen Stein, wenn er bewegt wurde, dann nichts mehr zu sehen sein.
Erstmal der Konstruktor:
Hier mal die for-Schleife mit der paint alle gesetzten Steine zeichnet.
Nachfolgend die methode CPMove die den Stein des Computers bewegt.
Das ganze programmiere ich unter MacOS mit Eclipse.
Hier mal zwei Screenshots:
So sieht es aus wenn nach dem Spielstart alle Steine gesetzt wurden. Soweit noch alles in Ordnung.
Jetzt setze ich als Spieler (weiß) den Stein an Stelle 1 auf die Stelle 10:
Wie ihr seht ist der Stein an Stelle 1 jetzt noch zu sehen, auch wenn die neugezeichneten Feldmarkierungen ihn überdecken.
Wie kann ich es anstellen dass der alte Stein vom Hintergrund überdeckt wird, bzw. dass er nichtmehr sichtbar ist?
Hab schon einige Quellen zu Rate gezogen, aber nichts gefunden das mir half. Muss aber zugeben dass mein Verständnis von paint() noch recht lückenhaft ist.
Hoffe aber hier weiß jemand Rat.
Ich habe die Aufgabe als Übung ein simples Mühle-Programm zu schreiben bei dem das Spielfeld in einem Fenster gezeichnet wird.
Es funktioniert erstmal auch alles, allerdings gibt es folgendes Problem:
Wenn ein Stein verschoben wird, wird das Fenster mittels repaint komplett neu gezeichnet. Dazu wird eine Tabelle abgefragt in der jeder gesetzte Stein eingetragen ist, so dass nur die Steine gezeichnet werden die aktuell gesetzt sind. Sonst müsste ich bei Bewegungen von Steinen den alten Stein aus der Grafik immer löschen, war mir zu umständlich.
Jedenfalls in der Theorie klappt das soweit, und Kollegen versicherten mir auch dass diese Ansatzweise soweit sinnig ist.
Problem:
Beim neuzeichnen des Fensters, wird nur das alte Bild "überzeichnet". Sprich wo vorher ein Stein war, ist der weiterhin zu sehen, nur die Feldlinien und Eckpunkte des Mühlefelds überlagern den.
Eigentlich sollte vom vorigen Stein, wenn er bewegt wurde, dann nichts mehr zu sehen sein.
Erstmal der Konstruktor:
Java:
public Mühle() throws IOException
{
super("Eine Partie Mühle");
this.setResizable(false);
addWindowListener(new WindowClosingAdapter(true));
setBackground(Color.orange);
setSize(intWSize,intWSize);
setVisible(true);
}
Hier mal die for-Schleife mit der paint alle gesetzten Steine zeichnet.
Java:
public void paint(Graphics g)
{
//Zuerst werden alle Linien und Eckpunkte gezeichnet. Nachfolgend werden die aktuell gesetzten Steine gezeichnet
for (int i = 0; i <25; i++){
if (htSteinListe.get(i) != null){
int x = intPosList[i][0];
int y = intPosList[i][1];
if (htSteinListe.get(i) == "Computer"){
g.fillOval(x-8, y-8,16,16);
}
if (htSteinListe.get(i) == "Spieler"){
g.setColor (Color.white);
g.fillOval(x-8, y-8,16,16);
g.setColor (Color.black);
}
}
}
}
Nachfolgend die methode CPMove die den Stein des Computers bewegt.
Java:
public void moveCPStone(){
int intCPStartPosition = 99;
while (htSteinListe.get(intCPStartPosition) != "Computer"){
intCPStartPosition = (int)(Math.random()*25);
}
int intCPNewPosition = 99;
System.out.println("Computer nimmt Stein " + intCPStartPosition);
for (int i = 0; i< 4; i++){
if (intMoveList[intCPStartPosition][i] != 0 && htSteinListe.get(intMoveList[intCPStartPosition][i]) != "Computer"
&& htSteinListe.get(intMoveList[intCPStartPosition][i]) != "Spieler"){
intCPNewPosition = intMoveList[intCPStartPosition][i];
System.out.println("Computer bewegt Stein " + intCPStartPosition + " auf Position " + intCPNewPosition);
htSteinListe.put(intCPNewPosition, "Computer");
htSteinListe.remove(intCPStartPosition);
i = 4; //Schleife wird hiermit beendet.
repaint();
}
}
if (intCPNewPosition == 99){
System.out.println("Computer wollte einen Stein bewegen der eingekeilt war. Spieler ist wieder am Zug.");
}
}
Das ganze programmiere ich unter MacOS mit Eclipse.
Hier mal zwei Screenshots:

So sieht es aus wenn nach dem Spielstart alle Steine gesetzt wurden. Soweit noch alles in Ordnung.
Jetzt setze ich als Spieler (weiß) den Stein an Stelle 1 auf die Stelle 10:

Wie ihr seht ist der Stein an Stelle 1 jetzt noch zu sehen, auch wenn die neugezeichneten Feldmarkierungen ihn überdecken.
Wie kann ich es anstellen dass der alte Stein vom Hintergrund überdeckt wird, bzw. dass er nichtmehr sichtbar ist?
Hab schon einige Quellen zu Rate gezogen, aber nichts gefunden das mir half. Muss aber zugeben dass mein Verständnis von paint() noch recht lückenhaft ist.
Hoffe aber hier weiß jemand Rat.