Hallo,
ich arbeite an einem Schachprogramm und habe folgendes Problem:
Wird vom Anwender ein gültiger Zug eingegeben, dann soll dieser Zug, einschließlich der dafür benötigten Denkzeit, im Info-Bereich ausgegeben werden. Außerdem soll in diesem Bereich die Farbe der nun am Zug befindlichen Seite angezeigt werden. Im Anschluss daran soll das Programm einen Gegenzug suchen und ausführen, es sei denn, die Gegenzugsuche ist explizit ausgeschlossen.
Aus mir unerklärlichen Gründen werden die genannten Infos jedoch nicht unmittelbar nach der Eingabe eines Zuges angezeigt, sondern erst nach Abschluss der Gegenzugsuche. Ausgegeben wird jedoch der Zug selbst, also der Wechsel einer Figur von einem zu einem anderen Feld.
Der Anzeigebereich der Anwendung ist zweigeteilt, einmal ein JPanel für das Schachfeld und eines für das Infofeld. Im Infofeld sind eine Reihe von JTextfields für die diversen Anzeigen.
Hier ein kommentierter Code-Auszug der betroffenen Methoden:
Ich habe es schon mit einem Aufruf von repaint() (cApp.repaint() / cApp.infoPain.repaint()) an unterschiedlichen Stellen versucht, leider jedoch ohne Erfolg.
Hat jemand eine Idee, warum der Aufruf von talk.startMove() die sofortige Anzeige der Infos verhindert?
Danke schon einmal für jede Antwort.
Gruß, kodela
ich arbeite an einem Schachprogramm und habe folgendes Problem:
Wird vom Anwender ein gültiger Zug eingegeben, dann soll dieser Zug, einschließlich der dafür benötigten Denkzeit, im Info-Bereich ausgegeben werden. Außerdem soll in diesem Bereich die Farbe der nun am Zug befindlichen Seite angezeigt werden. Im Anschluss daran soll das Programm einen Gegenzug suchen und ausführen, es sei denn, die Gegenzugsuche ist explizit ausgeschlossen.
Aus mir unerklärlichen Gründen werden die genannten Infos jedoch nicht unmittelbar nach der Eingabe eines Zuges angezeigt, sondern erst nach Abschluss der Gegenzugsuche. Ausgegeben wird jedoch der Zug selbst, also der Wechsel einer Figur von einem zu einem anderen Feld.
Der Anzeigebereich der Anwendung ist zweigeteilt, einmal ein JPanel für das Schachfeld und eines für das Infofeld. Im Infofeld sind eine Reihe von JTextfields für die diversen Anzeigen.
Hier ein kommentierter Code-Auszug der betroffenen Methoden:
Java:
Class InOut:
private void movePiece(int i) {
int color = board.Display[i].color; // Farbe der Figur
if (board.Display[i].piece == 0) { // keine Figur, zweiter Klick
color = -1; // dann leeres Zielfeld
}
if ((lastFild.piece > 0) // bereits Figur markiert
&& (talk.Player != color)) { // keine eigene Figur angeklickt
if (talk.MoveCheck(lastIndex, i)) { // Zug prüfen, falls erfolgreich
// Bei korrektem Zug ist nun bereits die Anzeige des Zuges und des nächsten Players veranlasst.
// Diese Infos werden jedoch noch nicht angezeigt.
if (cApp.Level < L_twoplayer) { // Level mit Zugsuche
talk.startMove(); // Zugsuche einleiten
}
} else { // Zug ist ungültig
PrintPiece( // also Markierung entfernen
lastIndex, lastFild.piece, lastFild.color);
}
}
resetInput(); // zurücksetzen für nächsten Zug
}
Class Talk:
// Nach dem Aufruf von talk.MoveCheck() wird bei einem gültigen Zug diese Methode aufgerufen.
void enterMove(MOT move) {
disp.PrintMove(MoveNo, Player, // >> Zug im Infofenster ausgeben <<
move, tm.getTotalTime(Player));
MakeMove(move); // Zug formal ausführen
board.UpdateBoard(); // Brett neu ausgeben
cApp.showColorToPlay(Player); // >> Ziehenden im Info-Fenster <<
PrintComment(); // ev. erf. Meldung ausgeben
}
// Die Anzeige des Zuges, einschließlich der dafür benötigten Zeit erfolgt über die Klasse Display.
// Die Anzeige des nun am Zug befindlichen Spielers direkt über die Hauptklasse ChessApp.
// Anschließend erfolgt der Rücksprung zu Methode InOut.movePiece(). Die veranlassten Infos
// werden, wenn jetzt durch den Aufruf von talk.StartMove() die Suche eines Gegenzuges eingeleitet
// wird, noch nicht ausgegeben. Sie erfolgt jedoch, wenn auf Grund der Leveleinstellung der Aufruf
// von talk.StartMove() übersprungen wird.
Class Display:
// Der Vollständigkeit halber hier noch die Methode PrintMove() für die Ausgabe des Zuges.
public void PrintMove(int moveno, int color, MOT move, int time) {
printThinkTime(color, time); // Zeit ausgeben
String sMove = "" + (moveno/2+1) + "." + MoveStr(move); // String für den Zug bilden
if (color == WHITE) { // für Weiß?
cApp.tfLastMoveWhite.setText(sMove); // dann in Feld für Weiß
} else {
cApp.tfLastMoveBlack.setText(sMove); // sonst in Feld für Schwarz
}
}
Hat jemand eine Idee, warum der Aufruf von talk.startMove() die sofortige Anzeige der Infos verhindert?
Danke schon einmal für jede Antwort.
Gruß, kodela