Servus und Aloha!
Ich hab für die Uni (2. Semster) die Aufgabe ein TicTacToe-Spiel mit einem Computergegner auszustatten.
Leider Gottes hänge ich an einem "dezenten" Problem.
Und zwar bekomme ich es nicht hin, das die KI "klickt" also ein Klick für den ActionListener simuliert.
Das "Spieler gegen Spieler" Prinzip funktioniert einwandfrei und wird auch korrekt ausgewertet - nur beim Versuch gegen die KI zu spielen, läuft alles schief das nur schief laufen kann.
Das "Spiel" startet erst, wenn man auf die Stelle klickt wo eigentlich das X des Com-Gegners sein sollte dann kann man sein O setzen und ab da ist Schicht. Er zählt zwar die Klicks (nach 9Klicks ohne Siegerfüllung wird das Spiel als Unentschieden gewertet) aber setzt sie nicht um.
Irgendein Bestandteil fehlt mir offensichtlich um der KI die Fähigkeit zu verpassen, Buttons zu "klicken"
Ich habs bereits mit ".setSelected(true)" und ".doClick()" probiert allerdings ohne Ergebnis
Anbei der JavaCode von meinem TicTacToe (samt den bisher eingefügten KI-Elementen)
Hoffe ihr könnt mir helfen =/
MfG
Ceryin
Ich hab für die Uni (2. Semster) die Aufgabe ein TicTacToe-Spiel mit einem Computergegner auszustatten.
Leider Gottes hänge ich an einem "dezenten" Problem.
Und zwar bekomme ich es nicht hin, das die KI "klickt" also ein Klick für den ActionListener simuliert.
Das "Spieler gegen Spieler" Prinzip funktioniert einwandfrei und wird auch korrekt ausgewertet - nur beim Versuch gegen die KI zu spielen, läuft alles schief das nur schief laufen kann.
Das "Spiel" startet erst, wenn man auf die Stelle klickt wo eigentlich das X des Com-Gegners sein sollte dann kann man sein O setzen und ab da ist Schicht. Er zählt zwar die Klicks (nach 9Klicks ohne Siegerfüllung wird das Spiel als Unentschieden gewertet) aber setzt sie nicht um.
Irgendein Bestandteil fehlt mir offensichtlich um der KI die Fähigkeit zu verpassen, Buttons zu "klicken"
Ich habs bereits mit ".setSelected(true)" und ".doClick()" probiert allerdings ohne Ergebnis
Anbei der JavaCode von meinem TicTacToe (samt den bisher eingefügten KI-Elementen)
Hoffe ihr könnt mir helfen =/
MfG
Ceryin
Java:
/* Worum geht es?
*
* Ziel des Programm ist das Spiel TicTacToe zu bauen
* In diesem Spiel spielen zwei Spieler gegeneinander und setzen abwechselnd
* ein X bzw O in ein 3x3 Spielfeld
*
* Gewonnen hat der Spieler, der als Erstes eine 3er Reihe diagonal, waagerecht oder senkrecht
* mit seinem Symbol (X oder O) gefüllt hat.
*
* Das Spiel endet Unentschieden, wenn alle Felder besetzt sind und kein Spieler
* einen Sieg erringen konnte
*
* Analyse der Anforderungen
*
* Anzahl Spieler = 2
* Spielfeld 3x3 Matrix
*
* Starten?
* Spiel soll durch Klicken auf Button (Auswahl des Startspielers) gestartet werden
*
* Ende?
* Spiel soll durch Sieg oder Unentschieden enden und das Spielende soll angezeigt
* bzw sichtbar sein.
* durch PopUp-Fenster
* durch farbliche Markierung der Reihen
*
* Sieg?
* Ein Sieg ist kann durch 2x 8 verschiedene Möglichkeiten erreicht werden
* 3 gleiche Symbole diagonal
* 3 gleiche Symbole waagerecht
* 3 gleiche Symbole senkrecht
* Wenn keine Siegbedingung eintrifft, ist es automatisch ein Unentschieden
* Damit müssen also 17 Möglichkeiten abgedeckt sein
*
* Spielablauf?
* Das Spiel startet durch Auswahl des 1. Spielers
* Bemerkung: Freie Auswahl des Symbols für den Spieler?
* Farbcodierung für die Symbole?
* Die Spieler wechseln sich automatisch ab. Sobald ein Symbol gesetzt wurde,
* ist der Spielzug des Spielers beendet und der andere Spieler darf sein Symbol setzen
* Beide wechseln sich ab bis ein Endszenario ausgelöst wurde bzw wird.
*/
//Import
import java.awt.Color;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JToggleButton;
/*Status:
* Player VS Player erledigt und funktionsfähig
* Verkündung des Gewinners erfolgt Fehlerfrei
* Unentschieden wird richtig gewertet
* Neustart des Spieles nach Spielende erfolgt einwandfrei
*
* Computergegner Problematisch - Start des Computers erst mit Klick vom "Anwender"
* Computer-Spielerwechsel vollzieht sich wie geplant
* Es werden jedoch die vom Computer gewählten Buttons nicht umgestellt
* folglich kann das Spiel nicht weitergespielt werden und wird nach insgesamt 9Klicks mit "Unentschieden" gewertet
*/
public class TicTacToe extends JFrame implements ActionListener
{
/* Da ein TicTacToe Feld gemeinhin IMMER ein 3x3 Feld aufweist,
* kann eine feste / fixierte Variable benutzt werden um die Arraygröße für die Buttons
* sowie die Berechnung der Siegbedingung zu erledigen
*/
final int SEITE=3; //fixe Variable zur Berechnung der Arraygröße und Überprüfung der Siegbedingungen etc
JFrame optik = new JFrame("TicTacToe"); //erzeugt Hauptfenster und vergibt den Namen
static JFrame panel = new JFrame("Auswahl"); //Frameerzeugung für das Auswahlfenster
JToggleButton[] button = new JToggleButton[SEITE*SEITE]; //erzeugt Array für die Buttons anhand der festen Variable
private String buchstabe = ""; //Variable zum Füllen der Buttons
int Zug = 0; //Zählt die Züge (bei 9 Zügen und keiner Siegbedingungserfüllung = Unentschieden)
boolean Sieg = false; //Variable um Siegbedingung zu prüfen - Standartmäßig auf False um Fehler zu vermeiden
static boolean wer; //sagt welches Symbol anfängt und gerade dran ist
static boolean com; // fängt ab, ob ein Spiel gegen ein Computer gestartet wurde
static boolean player; //für das Spiel mit Computergegner
public static void Auswahl() //Auswahlfenster - vorgeschaltet um Spielart zu bestimmen
{
//Custom Text in den Buttons
Object[] options = {"Spieler vs Spieler: X startet", "Spieler vs Spieler: O startet","Computer vs. Spieler", "Beenden"};
//PopUp Fenster samt Auswahlmöglichkeiten
int Whoisit = JOptionPane.showOptionDialog(panel, "Spielmodus wählen:"+"\nSpieler vs. Spieler welches Symbol soll starten? Bei Computer vs. Spieler startet der Computer mit X","Auswahl",
JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE, null, options, options[2]);
// ??, Fragetext, Titel des PopUps, Art/KLassifizierung der Buttons, Was für eine Fensterart ist es?, Was steht in den Buttons
//Auswertung des Knopfdrucks
if (Whoisit == 0) // X
{
wer = true;
}else if (Whoisit == 1) //O
{
wer = false;
}else if (Whoisit == 2) // Spiel gegen Computergegner als X
{
com = true;
}else if (Whoisit == 3) //exit
{
System.exit(0);
}
}
public TicTacToe() //definiert Hauptfenster
{
Auswahl(); //Verweis auf Auswahl
optik.setSize(350,350); //Spielfeldgröße
optik.setLocation(350,175); //Wo ist das Fenster auf dem Bildschirm
optik.setLayout(new GridLayout(SEITE,SEITE)); //Layoutdefinition
optik.setVisible(true); //Sichtbarkeit
optik.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //was passiert bei Drücken auf X
Font font = new Font("Arial",Font.BOLD,80); //Verändert Schriftart, Schriftgröße und Schrifttyp
//Schriftfarbe ändern?
for(int i=0;i<SEITE*SEITE;i++)
{
button[i] = new JToggleButton("");
optik.add(button[i]); //fügt Buttons zum Panel hinzu
button[i].setFont(font); //verändert Buttonschriftart zum Vorgegebenen Wert
// button[i].setFont(Color.white); Schriftfarbe??
button[i].addActionListener(this);
}
/* Aufbau des Spielfeldes / des Arrayfeldes
*
* [0] [1] [2]
* [3] [4] [5]
* [6] [7] [8]
*
*/
}
public static void main(String[] args)
{
// TODO Auto-generated method stub
new TicTacToe();
}
@Override
public void actionPerformed(ActionEvent arg0)
{
if (com == false) //"Normales Spiel" ohne Computer
{
Zug++; //zählt die Züge um festzustellen, wann das Spielfeld "voll" ist (für Unentschieden wichtig)
if (wer == true)//prüft welcher Spieler gerade am Zug war und
{
wer = false; //switcht die Reihenfolge und
buchstabe = "X"; //setz Buchstabe auf X
//wäre vlt optional möglich ein Icon statt des Buchstabens einzufügen
}
else if (wer == false)
{
wer = true; //switcht die Reihenfolge und
buchstabe = "O"; //setz Buchstabe auf O
//wäre vlt optional möglich ein Icon statt des Buchstabens einzufügen
}
JToggleButton genutzerBut = (JToggleButton)arg0.getSource();
if (buchstabe == "X")
{
genutzerBut.setText(buchstabe); // setzt den Button auf einen Wert (Wert wird oben bestimmt)
genutzerBut.setBackground(Color.red); //färbt Button
genutzerBut.setEnabled(false); //sorgt dafür das gewählte Buttons nicht geändert werden können
}else
{
genutzerBut.setText(buchstabe); // setzt den Button auf einen Wert (Wert wird oben bestimmt)
genutzerBut.setBackground(Color.green); //färbt Button
genutzerBut.setEnabled(false); //sorgt dafür das gewählte Buttons nicht geändert werden können
}
}else //Spiel gegen den Computer
{
Zug++; //zählt die Züge um festzustellen, wann das Spielfeld "voll" ist (für Unentschieden wichtig)
JToggleButton genutzerBut = (JToggleButton)arg0.getSource();
if (player == false) //für den aller ersten Zug - um das Spiel zu eröffnen
{
buchstabe = "X"; //wird umgeschaltet um die Siegbedingungsüberprüfung zu gewährleisten
if (Zug == 1)
{
/* [0] [1] [2]
* [X] [4] [5]
* [6] [7] [8]
*/
button[3].doClick();
button[3].setText("X"); //macht den ersten Zug und setzt Button auf X
button[3].setBackground(Color.red); //färbt Button
button[3].setEnabled(false); //sperrt Button
player = true; //wechsel wer gerade am Zug ist - Übergibt Zug an Spieler
}else if (Zug == 3) //alle nachfolgenden Spielzüge des Computers
{
if (!(button[0].getText()=="O"))
{
/* [X] [1] [2]
* [X] [4] [5]
* [6] [7] [8]
*/
button[0].doClick();
button[0].setText("X");
button[0].setBackground(Color.red); //färbt Button
button[0].setEnabled(false);
player = true;
}else if (!(button[4].getText()=="O"))
{
/* [0] [1] [2]
* [X] [X] [5]
* [6] [7] [8]
*/
button[4].doClick();
button[4].setText("X");
button[4].setBackground(Color.red); //färbt Button
button[4].setEnabled(false);
player = true;
}else if (!(button[6].getText()=="O"))
{
/* [0] [1] [2]
* [X] [4] [5]
* [X] [7] [8]
*/
button[6].doClick();
button[6].setText("X");
button[6].setBackground(Color.red); //färbt Button
button[6].setEnabled(false);
player = true;
}
}else if (Zug == 5)
{
if((button[1].getText() == "O" && button[2].getText() == "O"))
{
/* [0] [_] [_]
* [3] [4] [5]
* [6] [7] [8]
*/
button[0].doClick();
button[0].setText("X");
button[0].setBackground(Color.red); //färbt Button
button[0].setEnabled(false); //sperrt Button
player = true; //übergibt den Zug an den Spieler
}else if(button[0].getText() == "O" && button[1].getText() == "O")
{
/* [_] [_] [2]
* [3] [4] [5]
* [6] [7] [8]
*/
button[2].doClick();
button[2].setText("X");
button[2].setBackground(Color.red); //färbt Button
button[2].setEnabled(false); //sperrt Button
player = true; //Übergibt den Zug an den Spieler
}else if(button[6].getText()=="O" && button[7].getText()=="O")
{
/* [0] [1] [2]
* [3] [4] [5]
* [_] [_] [8]
*/
button[8].doClick();
button[8].setText("X");
button[8].setBackground(Color.red); //färbt Button
button[8].setEnabled(false); //sperrt Button
player = true; //Übergibt den Zug an den Spieler
}else if(button[7].getText()=="O" && button[8].getText()=="O")
{
/* [0] [1] [2]
* [3] [4] [5]
* [6] [_] [_]
*/
button[6].doClick();
button[6].setText("X");
button[6].setBackground(Color.red); //färbt Button
button[6].setEnabled(false); //sperrt Button
player = true; //Übergibt den Zug an den Spieler
}else if(button[1].getText() == "O" && button[4].getText() == "O")
{
/* [0] [_] [2]
* [3] [_] [5]
* [6] [7] [8]
*/
button[7].doClick();
button[7].setText("X");
button[7].setBackground(Color.red); //färbt Button
button[7].setEnabled(false); //sperrt Button
player = true; //übergibt den Zug an den Spieler
}else if(button[4].getText() == "O" && button[7].getText() == "O")
{
/* [0] [1] [2]
* [3] [_] [5]
* [6] [_] [8]
*/
button[1].doClick();
button[1].setText("X");
button[1].setBackground(Color.red); //färbt Button
button[1].setEnabled(false); //sperrt Button
player = true; //Übergibt den Zug an den Spieler
}else if(button[2].getText() == "O" && button[5].getText() == "O")
{
/* [0] [1] [_]
* [3] [4] [_]
* [6] [7] [8]
*/
button[8].doClick();
button[8].setText("X");
button[8].setBackground(Color.red); //färbt Button
button[8].setEnabled(false); //sperrt Button
player = true; //Übergibt den Zug an den Spieler
}else if(button[5].getText() == "O" && button[8].getText() == "O")
{
/* [0] [1] [2]
* [3] [4] [_]
* [6] [7] [_]
*/
button[2].doClick();
button[2].setText("X");
button[2].setBackground(Color.red); //färbt Button
button[2].setEnabled(false); //sperrt Button
player = true; //Übergibt den Zug an den Spieler
}else if(button[0].getText() == "O" && button[4].getText() == "O")
{
/* [_] [1] [2]
* [3] [_] [5]
* [6] [7] [8]
*/
button[8].doClick();
button[8].setText("X");
button[8].setBackground(Color.red); //färbt Button
button[8].setEnabled(false); //sperrt den Button
player=true; //wechselt wer gerade am Zug ist - Übergibt Zug an Spieler
}else if(button[4].getText() == "O" && button[8].getText() == "O")
{
/* [0] [1] [2]
* [3] [_] [5]
* [6] [7] [_]
*/
button[0].doClick();
button[0].setText("X");
button[0].setBackground(Color.red); //färbt Button
button[0].setEnabled(false); //sperrt den Button
player=true; //wechselt wer gerade am Zug ist - Übergibt Zug an Spieler
}else if (button[4].getText() == "O" && button[6].getText()=="O")
{
/* [0] [1] [2]
* [3] [_] [5]
* [_] [7] [8]
*/
button[2].doClick();
button[2].setText("X");
button[2].setBackground(Color.red);
button[2].setEnabled(false);
player = true;
}else if (button[2].getText()=="O" && button[4].getText()=="O")
{
/* [0] [1] [_]
* [3] [_] [5]
* [6] [7] [8]
*/
button[6].doClick();
button[6].setText("X");
button[6].setBackground(Color.red);
button[6].setEnabled(false);
player = true;
}
}else if (Zug == 7)
{
}
}else if (player == true) //fängt die Spielereingaben ab und setzt die entsprechenden Buttons auf "O"
{
buchstabe = "O"; //wird umgeschaltet um die Siegbedingungsüberprüfung zu gewährleisten
genutzerBut.setText("O"); // setzt den Button auf einen Wert (Wert wird oben bestimmt)
genutzerBut.setBackground(Color.green); //färbt Button
genutzerBut.setSelected(true);
genutzerBut.setEnabled(false); //sorgt dafür das gewählte Buttons nicht geändert werden können
player = false; //wechselt wer gerade am Zug ist - Übergibt an Computer
}
}
/* In der kommenden Schleife wird die Siegbedingung geprüft.
* Wenn die Buttons in einer Reihe ein gleiches Symbol haben,
* wird der Zähler i hochgeschaltet bis er der fixen Variable Seite entspricht
* dann wird die SiegBoolean umgeschaltet
*/
for(int i=0;i<SEITE;i++)
{
if(button[SEITE*i].getText() == buchstabe && button[SEITE*i+1].getText() == buchstabe && button[SEITE*i+2].getText() == buchstabe)
//Überprüfung für Waagerecht
{
Sieg = true;
}else if(button[i].getText() == buchstabe && button[i+SEITE].getText() == buchstabe && button[i+SEITE+SEITE].getText() == buchstabe)
//Überprüfung für Senkrecht
{
Sieg = true;
}
}
if(button[0].getText() == buchstabe && button[4].getText() == buchstabe && button[8].getText() == buchstabe)
//Überprüfung für Diagonal von rechts unten nach links oben
{
Sieg = true;
}
if(button[6].getText() == buchstabe && button[4].getText() == buchstabe && button[2].getText() == buchstabe)
//Überprüfung für Diagonal von links unten nach rechts oben
{
Sieg = true;
}
// Wenn die Sieg Boolean auf True geschaltet wurde, wird das Spielende mittels eines PopUpFensters verkündet
if(Sieg == true)
{
//PopUp Dialogfenster mit Auswahlmöglichkeiten
if (buchstabe == "X") //wenn X der zuletz' eingegebene Buchstabe
{
// Variable wird für PopUp erzeugt und fängt Eingabe ab
int endeingabe = JOptionPane.showConfirmDialog(null,"X hat gewonnen!" + "\nNoch eine Runde spielen?","Spielende", JOptionPane.OK_CANCEL_OPTION);
if (endeingabe != 0)
{
System.exit(0); //Programm schließt sich
}else
{
optik.dispose(); //altes Fenster schließt sich
new TicTacToe(); //neues Fenster öffnet sich
}
}else if (buchstabe == "O") //Wenn O der zuletzt eingegebene Buchstabe
{
// Variable wird für PopUp erzeugt und fängt Eingabe ab
int endeingabe = JOptionPane.showConfirmDialog(null,"O hat gewonnen!" + "\nNoch eine Runde spielen?","Spielende", JOptionPane.OK_CANCEL_OPTION);
if (endeingabe != 0)
{
System.exit(0); //Programm schließt sich
}else
{
optik.dispose(); //altes Fenster schließt sich
new TicTacToe(); //neues Fenster öffnet sich
}
}
} else if(Zug == SEITE*SEITE && Sieg == false) //wenn alle Felder voll, kein Sieger
{
// PopUp-Dialogfenster mit Auswahlmöglichkeiten
//Variable wird erzeugt und fängt Eingabe ab
int endeingabe = JOptionPane.showConfirmDialog(null,"Unentschieden!" + "\nNoch eine Runde spielen?","Spielende", JOptionPane.OK_CANCEL_OPTION);
if (endeingabe != 0) //was passiert bei der Eingabe
{
System.exit(0); //Programm schließt sich
}else
{
optik.dispose(); //altes Fenster schließt sich
new TicTacToe(); //neues Fenster öffnet sich
}
}
}
}