Guten Abend,
im Rahmen meines Studiums müssen wir als Hausaufgabe ein Vier-Gewinnt spiel mit Java programmieren. Uns wurden zwei Möglichkeiten der Implementierung gegeben:
a) Vier-Gewinnt ohne Computerspieler (also zwei menschliche Spieler gegeneinander)
b) Vier-Gewinnt mit Computerspieler
Ich habe mich für die Variante mit dem Computerspieler entschieden. Zwei Schwierigkeitsgrade stehen zur Auswahl: Einfach und Mittel. Beim einfachen Schwierigkeitsgrad werden Steine durch den Computer per Zufall gesetzt. Die mittlere Schwierigkeitsstufe geht dabei folgendermaßen vor:
1. Kann der Computer durch setzen eines Steines gewinnen? Wenn ja, dann tut er dies.
2. Kann der Computer durch setzen eines Steines den Sieg des menschlichen Spielers verhindern? Wenn ja, dann tut er dies.
3. Falls 1. und 2. nicht zutreffen wird ein Stein zufällig gesetzt.
Das Spiel funktioniert tadellos. Nun möchte ich das Spiel auch grafisch ein wenig ansprechender machen. Momentan wird nach dem Stein setzen des menschlichen Spielers sofort der Stein des Computerspielers gesetzt. Ich würde gerne eine Zeitspanne von einer halben Sekunde dazwischen schalten. Das mit der halben Sekunde funktioniert auch prima, allerdings wartet das Programm die halbe Sekunde ab und setzt dann beide Steine (den des menschlichen Spielers und den des Computers).
Hier sind die entscheidenden Quellcodezeilen:
Klasse PitchModel
und die Methode der View-Klasse, die für das visuelle Setzen der Steine verantwortlich ist:
Vielleicht könntet ihr mir helfen, warum der die GUI nicht vor dem Thread.sleep und danach aktualisiert, sondern erst nach dem Thread.sleep? Wäre euch sehr dankbar.
im Rahmen meines Studiums müssen wir als Hausaufgabe ein Vier-Gewinnt spiel mit Java programmieren. Uns wurden zwei Möglichkeiten der Implementierung gegeben:
a) Vier-Gewinnt ohne Computerspieler (also zwei menschliche Spieler gegeneinander)
b) Vier-Gewinnt mit Computerspieler
Ich habe mich für die Variante mit dem Computerspieler entschieden. Zwei Schwierigkeitsgrade stehen zur Auswahl: Einfach und Mittel. Beim einfachen Schwierigkeitsgrad werden Steine durch den Computer per Zufall gesetzt. Die mittlere Schwierigkeitsstufe geht dabei folgendermaßen vor:
1. Kann der Computer durch setzen eines Steines gewinnen? Wenn ja, dann tut er dies.
2. Kann der Computer durch setzen eines Steines den Sieg des menschlichen Spielers verhindern? Wenn ja, dann tut er dies.
3. Falls 1. und 2. nicht zutreffen wird ein Stein zufällig gesetzt.
Das Spiel funktioniert tadellos. Nun möchte ich das Spiel auch grafisch ein wenig ansprechender machen. Momentan wird nach dem Stein setzen des menschlichen Spielers sofort der Stein des Computerspielers gesetzt. Ich würde gerne eine Zeitspanne von einer halben Sekunde dazwischen schalten. Das mit der halben Sekunde funktioniert auch prima, allerdings wartet das Programm die halbe Sekunde ab und setzt dann beide Steine (den des menschlichen Spielers und den des Computers).
Hier sind die entscheidenden Quellcodezeilen:
Klasse PitchModel
Java:
public void set(int column, Player humanPlayer)
{
if (!this.areColumnsFull()) {
if (!this.isColumnFull(column)) {
// human Player turn
boolean humanVictory = this.setStone(column, humanPlayer);
if (!humanVictory) {
try {
// computer Player turn
this.strategy.setPitch(this);
this.setStone(this.strategy.perform(), this.strategy.getComputerPlayer());
Thread.sleep(500);
}
catch (InterruptedException e) {
}
}
}
}
else {
PitchEvent event = new PitchEvent();
event.setState(ConnectFourConstants.TIED);
this.notify(event);
}
}
public boolean setStone(int column, Player player)
{
PitchEvent event = new PitchEvent();
int affectedRow = 0;
int affectedColumn = column;
for (int i = 0; i < this.rows; i++) {
if (i < this.rows-1) {
if (pitch[i+1][column] == 0) {
continue;
}
else {
pitch[i][column] = player.getId();
affectedRow = i;
break;
}
}
else {
if (pitch[i][column] == 0) {
pitch[i][column] = player.getId();
affectedRow = i;
}
}
}
if (this.isWon(affectedRow, affectedColumn, player)) {
event.setState(ConnectFourConstants.WIN);
event.setPlayer(player);
event.setAffectedRow(affectedRow);
event.setAffectedColumn(affectedColumn);
this.notify(event);
return true;
}
event.setState(ConnectFourConstants.UNDECIDED);
event.setPlayer(player);
event.setAffectedRow(affectedRow);
event.setAffectedColumn(affectedColumn);
this.notify(event);
return false;
}
public void notify(PitchEvent event)
{
this.view.refresh(event);
}
und die Methode der View-Klasse, die für das visuelle Setzen der Steine verantwortlich ist:
Java:
public void refresh(PitchEvent event)
{
if (event.getState() == ConnectFourConstants.WIN) {
ImageIcon stone = event.getPlayer().getStone();
JButton button = this.fields[event.getAffectedRow()][event.getAffectedColumn()];
button.setEnabled(true);
button.setIcon(stone);
if (!event.getPlayer().getName().equals(this.playerNameText.getText())) {
JOptionPane.showMessageDialog(null, "Sie haben leider verloren!");
System.exit(0);
}
else {
JOptionPane.showMessageDialog(null, "Herzlichen Glückwunsch, Sie haben gewonnen!");
System.exit(0);
}
}
if (event.getState() == ConnectFourConstants.TIED) {
JOptionPane.showMessageDialog(null, "Unentschieden!");
System.exit(0);
}
if (event.getState() == ConnectFourConstants.UNDECIDED) {
ImageIcon stone = event.getPlayer().getStone();
JButton button = this.fields[event.getAffectedRow()][event.getAffectedColumn()];
button.setEnabled(true);
button.setIcon(stone);
}
}
Vielleicht könntet ihr mir helfen, warum der die GUI nicht vor dem Thread.sleep und danach aktualisiert, sondern erst nach dem Thread.sleep? Wäre euch sehr dankbar.
Zuletzt bearbeitet: