Hi bin recht neu in Java und programmiere im Moment immer noch mein 1.Spiel TicTacToe. Nun habe ich mal verscuht eine mittelmäßige Ki zu erstellen, die wenigstens versucht zu gewinnen und Versuche meinerseits verhindern soll. Ich glaube mein Code is ziemlich simpel aber nun habe ich ein Problem:
Manchmal meistens wenn nur noch 2 Käschen übrig sind zum aufdecken macht die Ki auf einmal nichts mehr.Woran kann das liegen??Aber auch manchmal einfach so. Ist das Porgramm vll. überfordert oder so oder liegts am code?
Hier der Code für die Klasse Kimedium
Manchmal meistens wenn nur noch 2 Käschen übrig sind zum aufdecken macht die Ki auf einmal nichts mehr.Woran kann das liegen??Aber auch manchmal einfach so. Ist das Porgramm vll. überfordert oder so oder liegts am code?
Hier der Code für die Klasse Kimedium
Java:
public class Kimedium extends JPanel {
/**
*
*/
private static final long serialVersionUID = 1L;
private Gamewindow gw;
private JButton[] b= new JButton[9];
private int []feld ={0,0,0,0,0,0,0,0,0};
private JLabel label = new JLabel("Player1:");
private JLabel label2 = new JLabel("Ki:");
private boolean zug1=true,zug2=false;
private int sieg=0,siegs=0,siegs2=0;
public Kimedium(Gamewindow gw)
{
this.gw = gw;
for(int i=0;i<9;i++)
{
if(i<3)
{
b[i] = new JButton();
}
else if(i<6)
{
b[i] = new JButton();
}
else if (i<9)
{
b[i] = new JButton();
}
b[i].addActionListener(new Actionhandler());
gw.add(b[i]);
gw.add(label);
gw.add(label2);
}
}
private class Actionhandler implements ActionListener{
public void actionPerformed(ActionEvent e) {
if(e.getSource()==b[0])
{
b[0].setText("X");
feld[0]=1;
b[0].setEnabled(false);
gewinnabfrage();
if(zug1)
{RandomMove();zug1=false;zug2=true;}
else if(zug2)
Doppelpr();
}
if(e.getSource()==b[1])
{
b[1].setText("X");
feld[1]=1;
b[1].setEnabled(false);
gewinnabfrage();
if(zug1)
{RandomMove();zug1=false;zug2=true;}
else if(zug2)
Doppelpr();
}
if(e.getSource()==b[2])
{
b[2].setText("X");
feld[2]=1;
b[2].setEnabled(false);
gewinnabfrage();
if(zug1)
{RandomMove();zug1=false;zug2=true;}
else if(zug2)
Doppelpr();
}
if(e.getSource()==b[3])
{
b[3].setText("X");
feld[3]=1;
b[3].setEnabled(false);
gewinnabfrage();
if(zug1)
{RandomMove();zug1=false;zug2=true;}
else if(zug2)
Doppelpr();
}
if(e.getSource()==b[4])
{
b[4].setText("X");
feld[4]=1;
b[4].setEnabled(false);
gewinnabfrage();
if(zug1)
{RandomMove();zug1=false;zug2=true;}
else if(zug2)
Doppelpr();
}
if(e.getSource()==b[5])
{
b[5].setText("X");
feld[5]=1;
b[5].setEnabled(false);
gewinnabfrage();
if(zug1)
{RandomMove();zug1=false;zug2=true;}
else if(zug2)
Doppelpr();
}
if(e.getSource()==b[6])
{
b[6].setText("X");
feld[6]=1;
b[6].setEnabled(false);
gewinnabfrage();
if(zug1)
{RandomMove();zug1=false;zug2=true;}
else if(zug2)
Doppelpr();
}
if(e.getSource()==b[7])
{
b[7].setText("X");
feld[7]=1;
b[7].setEnabled(false);
gewinnabfrage();
if(zug1)
{RandomMove();zug1=false;zug2=true;}
else if(zug2)
Doppelpr();
}
if(e.getSource()==b[8])
{
b[8].setText("X");
feld[8]=1;
b[8].setEnabled(false);
gewinnabfrage();
if(zug1)
{RandomMove();zug1=false;zug2=true;}
else if(zug2)
Doppelpr();
}
}
}
//DER Zug der gemacht werden soll wenn der Ki weder gewinnen noch verlieren kann
public void RandomMove()
{
int y = new Random().nextInt(9);
if (b[y].getText().equals("X")||b[y].getText().equals("O")) {
RandomMove();
}
else {
b[y].setText("O");
b[y].setEnabled(false);
feld[y]=2;
}
}
//Das ist die Methode die immer ausgeführt wird wenn der Spieler auf einen Button klickt.Zuerst wird //überpfrüft ob der Ki gewinnen kann wenn nicht ob der Spieler gewinnt. feld[] bezieht sich auf //buttons und dann ==2 das es von ki geklickt wurde,==1 das es vom menschlichen Spieler betätigt //wurde
public void Doppelpr()
{
//Kann ich gewinnen????!!!!!!!!!!!!!!!!!!!!
//für feld 2
if(feld[0]==2&&feld[1]==2&&feld[2]!=1||feld[5]==2&&feld[8]==2&&feld[2]!=1||feld[6]==2&&feld[4]==2&&feld[2]!=1)
{
b[2].setText("O");
b[2].setEnabled(false);
feld[2]=2;
gewinnabfrage();
return;
}
//für feld 1
else if(feld[0]==2&&feld[2]==2&&feld[1]!=1||feld[4]==2&&feld[7]==2&&feld[1]!=1)
{
b[1].setText("O");
b[1].setEnabled(false);
feld[1]=2;
gewinnabfrage();
return;
}
//für feld 0
else if(feld[1]==2&&feld[2]==2&&feld[0]!=1||feld[4]==2&&feld[8]==2&&feld[0]!=1||feld[6]==2&&feld[3]==2&&feld[0]!=1)
{
b[0].setText("O");
b[0].setEnabled(false);
feld[0]=2;
gewinnabfrage();
return;
}
//für feld 3
else if(feld[0]==2&&feld[6]==2&&feld[3]!=1||feld[4]==2&&feld[5]==2&&feld[3]!=1)
{
b[3].setText("O");
b[3].setEnabled(false);
feld[3]=2;
gewinnabfrage();
return;
}
//für feld 4
else if(feld[1]==2&&feld[7]==2&&feld[4]!=1||feld[3]==2&&feld[5]==2&&feld[4]!=1||feld[0]==2&&feld[8]==2&&feld[4]!=1||feld[6]==2&&feld[2]==2&&feld[4]!=1)
{
b[4].setText("O");
b[4].setEnabled(false);
feld[4]=2;
gewinnabfrage();
return;
}
//für feld 5
else if(feld[2]==2&&feld[8]==2&&feld[5]!=1||feld[3]==2&&feld[4]==2&&feld[5]!=1)
{
b[5].setText("O");
b[5].setEnabled(false);
feld[5]=2;
gewinnabfrage();
return;
}
//für feld 6
else if(feld[0]==2&&feld[3]==2&&feld[6]!=1||feld[7]==2&&feld[8]==2&&feld[6]!=1||feld[4]==2&&feld[2]==2&&feld[6]!=1)
{
b[6].setText("O");
b[6].setEnabled(false);
feld[6]=2;
gewinnabfrage();
return;
}
//für feld 7
else if(feld[4]==2&&feld[1]==2&&feld[7]!=1||feld[6]==2&&feld[8]==2&&feld[7]!=1)
{
b[7].setText("O");
b[7].setEnabled(false);
feld[7]=2;
gewinnabfrage();
return;
}
//für feld 8
else if(feld[2]==2&&feld[5]==2&&feld[8]!=1||feld[6]==2&&feld[7]==2&&feld[8]!=1||feld[4]==2&&feld[0]==2&&feld[8]!=1)
{
b[8].setText("O");
b[8].setEnabled(false);
feld[8]=2;
gewinnabfrage();
return;
}
//Gegner gewinnt????!!!!!!!!!!!!!!!!!!!!
//für feld 2
else if(feld[0]==1&&feld[1]==1||feld[5]==1&&feld[8]==1||feld[6]==1&&feld[4]==1)
{
b[2].setText("O");
b[2].setEnabled(false);
feld[2]=2;
return;
}
//für feld 1
else if(feld[0]==1&&feld[2]==1||feld[4]==1&&feld[7]==1)
{
b[1].setText("O");
b[1].setEnabled(false);
feld[1]=2;
return;
}
//für feld 0
else if(feld[1]==1&&feld[2]==1||feld[4]==1&&feld[8]==1||feld[6]==1&&feld[3]==1)
{
b[0].setText("O");
b[0].setEnabled(false);
feld[0]=2;
return;
}
//für feld 3
else if(feld[0]==1&&feld[6]==1||feld[4]==1&&feld[5]==1)
{
b[3].setText("O");
b[3].setEnabled(false);
feld[3]=2;
return;
}
//für feld 4
else if(feld[1]==1&&feld[7]==1||feld[3]==1&&feld[5]==1||feld[0]==1&&feld[8]==1||feld[6]==1&&feld[2]==1)
{
b[4].setText("O");
b[4].setEnabled(false);
feld[4]=2;
return;
}
//für feld 5
else if(feld[2]==1&&feld[8]==1||feld[3]==1&&feld[4]==1)
{
b[5].setText("O");
b[5].setEnabled(false);
feld[5]=2;
return;
}
//für feld 6
else if(feld[0]==1&&feld[3]==1||feld[7]==1&&feld[8]==1||feld[4]==1&&feld[2]==1)
{
b[6].setText("O");
b[6].setEnabled(false);
feld[6]=2;
return;
}
//für feld 7
else if(feld[4]==1&&feld[1]==1||feld[6]==1&&feld[8]==1)
{
b[7].setText("O");
b[7].setEnabled(false);
feld[7]=2;
return;
}
//für feld 8
else if(feld[2]==1&&feld[5]==1||feld[6]==1&&feld[7]==1||feld[4]==1&&feld[0]==1)
{
b[8].setText("O");
b[8].setEnabled(false);
feld[8]=2;
return;
}
//Was soll ich sonst tuen?
else RandomMove();
}
public void gewinnabfrage()
{
//Gewinnen für Spieler 1
if(feld[0]==1&&feld[1]==1&&feld[2]==1)
{ JOptionPane.showMessageDialog(null,"Spieler 1 hat gewonnen");sieg=1;restart();
}
else if(feld[3]==1&&feld[4]==1&&feld[5]==1)
{ JOptionPane.showMessageDialog(null,"Spieler 1 hat gewonnen");sieg=1;restart();
}
else if(feld[6]==1&&feld[7]==1&&feld[8]==1)
{ JOptionPane.showMessageDialog(null,"Spieler 1 hat gewonnen");sieg=1;restart();
}
else if(feld[0]==1&&feld[3]==1&&feld[6]==1)
{ JOptionPane.showMessageDialog(null,"Spieler 1 hat gewonnen");sieg=1;restart();
}
else if(feld[1]==1&&feld[4]==1&&feld[7]==1)
{ JOptionPane.showMessageDialog(null,"Spieler 1 hat gewonnen");sieg=1;restart();
}
else if(feld[2]==1&&feld[5]==1&&feld[8]==1)
{ JOptionPane.showMessageDialog(null,"Spieler 1 hat gewonnen");sieg=1;restart();
}
else if(feld[0]==1&&feld[4]==1&&feld[8]==1)
{ JOptionPane.showMessageDialog(null,"Spieler 1 hat gewonnen");sieg=1;restart();
}
else if(feld[6]==1&&feld[4]==1&&feld[2]==1)
{ JOptionPane.showMessageDialog(null,"Spieler 1 hat gewonnen");sieg=1;restart();
}
//Gewinnen für Spieler 2
if(feld[0]==2&&feld[1]==2&&feld[2]==2)
{ JOptionPane.showMessageDialog(null,"Spieler 2 hat gewonnen");sieg=2;restart();
}
else if(feld[3]==2&&feld[4]==2&&feld[5]==2)
{ JOptionPane.showMessageDialog(null,"Spieler 2 hat gewonnen");sieg=2;restart();
}
else if(feld[6]==2&&feld[7]==2&&feld[8]==2)
{ JOptionPane.showMessageDialog(null,"Spieler 2 hat gewonnen");sieg=2;restart();
}
else if(feld[0]==2&&feld[3]==2&&feld[6]==2)
{ JOptionPane.showMessageDialog(null,"Spieler 2 hat gewonnen");sieg=2;restart();
}
else if(feld[1]==2&&feld[4]==2&&feld[7]==2)
{ JOptionPane.showMessageDialog(null,"Spieler 2 hat gewonnen");sieg=2;restart();
}
else if(feld[2]==2&&feld[5]==2&&feld[8]==2)
{ JOptionPane.showMessageDialog(null,"Spieler 2 hat gewonnen");sieg=2;restart();
}
else if(feld[0]==2&&feld[4]==2&&feld[8]==2)
{ JOptionPane.showMessageDialog(null,"Spieler 2 hat gewonnen");sieg=2;restart();
}
else if(feld[6]==2&&feld[4]==2&&feld[2]==2)
{ JOptionPane.showMessageDialog(null,"Spieler 2 hat gewonnen");sieg=2;restart();
}
else if(feld[0]!=0&&feld[1]!=0&&feld[2]!=0&&feld[3]!=0&&feld[4]!=0&&feld[5]!=0&&feld[6]!=0&&feld[7]!=0&&feld[8]!=0)
{JOptionPane.showMessageDialog(null,"Unentschieden");restart();}
}
public void restart()
{ if (sieg==1)
{siegs+=1;
label.setText("Player1: "+siegs);
sieg=0;
}
else if(sieg==2)
{
siegs2+=1;
label2.setText("Ki: "+siegs2);
sieg=0;
}
resetFelder();
}
public void resetFelder()
{
feld[0]=feld[1]=feld[2]=feld[3]=feld[4]=feld[5]=feld[6]=feld[7]=feld[8]=0;
b[0].setText("");b[1].setText("");b[2].setText("");b[3].setText("");b[4].setText("");b[5].setText("");b[6].setText("");b[7].setText("");b[8].setText("");
b[0].setEnabled(true);b[1].setEnabled(true);b[2].setEnabled(true);b[3].setEnabled(true);b[4].setEnabled(true);b[5].setEnabled(true);b[6].setEnabled(true);b[7].setEnabled(true);b[8].setEnabled(true);
double x=Math.random();
if(x<0.5)
zug2=false;
else zug2=true;
zug1=true;
}
}