Hallo, ich habe ein kleines Problem.
Ich programmiere einen kleinen TicTacToe Simulator, indem 2 Bots gegeneinander spielen ( immoment sind die Bots beide noch relativ dumm und spielen ohne Hintergedanken
)
Mein Problem ist, dass ich zwischen den Zügen der Bots X und O den Thread für 1.5 sek schlafenlege und dies jedoch bewirkt, dass man das, was die Bots tippen nicht mehr sieht.
Also habe ich es mit validate des JFrames probiert, nur erfrischen sich die Subkomponenten nur, wenn ich das Fenster minimiereund wieder maximiere, was ja nicht Sinn der Sache ist :meld:
Ich führe das ganze auf Eclipse heraus aus ( bin am Laptop meines Vaters, da is kein JDK drauf, konnte es also noch nicht als Jar verpacken ???:L )
Die SpielFeldKlasse;
Die JPanel Klasse für die Kreuze bzw. Kreise:
Die Bots:
Und der Ausführcode:
So.
Ja, ich weiß, ist ein bischen lang, aber des ist der ganze Quelltext :roll:
Vielleicht weiß ja jemand woran es liegt, ohne sich durch diesen Dschungel von Zeichen zu kämpfen, :wink:
Gruß, Luca
Ich programmiere einen kleinen TicTacToe Simulator, indem 2 Bots gegeneinander spielen ( immoment sind die Bots beide noch relativ dumm und spielen ohne Hintergedanken
Mein Problem ist, dass ich zwischen den Zügen der Bots X und O den Thread für 1.5 sek schlafenlege und dies jedoch bewirkt, dass man das, was die Bots tippen nicht mehr sieht.
Also habe ich es mit validate des JFrames probiert, nur erfrischen sich die Subkomponenten nur, wenn ich das Fenster minimiereund wieder maximiere, was ja nicht Sinn der Sache ist :meld:
Ich führe das ganze auf Eclipse heraus aus ( bin am Laptop meines Vaters, da is kein JDK drauf, konnte es also noch nicht als Jar verpacken ???:L )
Die SpielFeldKlasse;
Code:
package game;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.Toolkit;
import javax.swing.*;
public class TTTSpielfeld
{
private String gewinner = "";
private JFrame f;
public static OX[][] ox = new OX[3][3];
public BotO botO;
public BotX botX;
public TTTSpielfeld()
{
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
f = new JFrame("TicTacToe Challange");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setSize(500,500);
f.setLocation((screenSize.width-f.getWidth())/2,(screenSize.height-f.getHeight())/2);
JPanel raster = new JPanel(new GridLayout(3,3,10,10));
f.add(raster);
for (int i = 0; i < 3; i++)
{
for (int x = 0; x < 3; x++)
{
ox[i][x] = new OX();
raster.add(ox[i][x]);
}
}
f.setVisible(true);
this.botStart();
this.startMatch();
}
public void botStart()
{
botO = new BotO();
botX = new BotX();
}
public boolean matchWon()
{
if (ox[0][0].checkWin(ox[0][1],ox[0][2])){return true;}
if (ox[1][0].checkWin(ox[1][1],ox[1][2])){return true;}
if (ox[2][0].checkWin(ox[2][1],ox[2][2])){return true;}
//waagerecht
if (ox[0][0].checkWin(ox[1][0],ox[2][0])){return true;}
if (ox[0][1].checkWin(ox[1][1],ox[2][1])){return true;}
if (ox[0][2].checkWin(ox[1][2],ox[2][2])){return true;}
//senkrecht
if (ox[0][0].checkWin(ox[1][1],ox[2][2])){return true;}
if (ox[2][0].checkWin(ox[1][1],ox[0][2])){return true;}
return false;
}
public void startMatch() // HIER IST DAS PROBLEM!!!
{
byte t = 0;
while(true)
{
botO.setzeKreis();
try {Thread.sleep(1500);} catch (Exception e) {e.printStackTrace();}
f.validate();
if (this.matchWon())
{gewinner = "Bot_Kreis"; break;}
t++;
if (t == 9)
{break;}
botX.setzeKreuz();
try {Thread.sleep(1500);} catch (Exception e) {e.printStackTrace();}
f.validate();
if (this.matchWon())
{gewinner = "Bot_Kreuz"; break;}
t++;
if (t == 9)
{break;}
}
if (t == 9)
{
JOptionPane.showMessageDialog(null,"Unentschieden.");
}
else
{
JOptionPane.showMessageDialog(null,"Gewinner ist: " + gewinner + ".");
}
f.setVisible(false);
f.dispose();
}
}
Die JPanel Klasse für die Kreuze bzw. Kreise:
Code:
package game;
import java.awt.*;
import javax.swing.*;
public class OX extends JPanel
{
private byte test = 0;
//0 = unbesetzt
//1 = Kreis
//2 = Kreuz
public OX()
{
super();
}
public void setTest(byte newTest)
{
test = newTest;
}
public int getTest()
{
return test;
}
public void paintComponent (Graphics g)
{
g.setColor(Color.WHITE);
g.fillRect(0,0,this.getWidth(),this.getHeight());
g.setColor(Color.BLACK);
if (test == 1)
{
g.drawOval(5,5,this.getWidth()-10,this.getHeight()-10);
}
if (test == 2)
{
g.drawLine(5,5,this.getWidth()-10,this.getHeight()-10);
g.drawLine(this.getWidth()-10,5,5,this.getHeight()-10);
}
}
public boolean equals (Object o)
{
if (o == null){ return false; }
if (o == this){ return true; }
if (o instanceof OX)
{
if (((OX) o).getTest() > 0)
{
if (((OX) o).getTest() == this.getTest())
{
return true;
}
else { return false; }
}
else { return false; }
}
else { return false; }
}
public boolean checkWin(Object o, Object o2)
{
if (this.equals(o))
{
if (this.equals(o2))
{
return true;
}
else { return false; }
}
else { return false; }
}
}
Die Bots:
Code:
package game;
public class BotX
{
public void setzeKreuz()
{
while(true)
{
byte setzR1 = (byte)(Math.random()*3);
byte setzR2 = (byte)(Math.random()*3);
if(TTTSpielfeld.ox[setzR1][setzR2].getTest() == 0)
{
TTTSpielfeld.ox[setzR1][setzR2].setTest((byte)2);
break;
}
}
}
}
Code:
package game;
public class BotO
{
public void setzeKreis()
{
while(true)
{
byte setzR1 = (byte)(Math.random()*3);
byte setzR2 = (byte)(Math.random()*3);
if(TTTSpielfeld.ox[setzR1][setzR2].getTest() == 0)
{
TTTSpielfeld.ox[setzR1][setzR2].setTest((byte)1);
break;
}
}
}
}
Und der Ausführcode:
Code:
package game;
public class Exec
{
public static void main(String[] args)
{
TTTSpielfeld startfeld = new TTTSpielfeld();
}
}
So.
Ja, ich weiß, ist ein bischen lang, aber des ist der ganze Quelltext :roll:
Vielleicht weiß ja jemand woran es liegt, ohne sich durch diesen Dschungel von Zeichen zu kämpfen, :wink:
Gruß, Luca