# Tictactoe



## Jack1995 (26. Apr 2012)

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


```
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;
	      
	  }

}
```


----------



## Final_Striker (26. Apr 2012)

Jack1995 hat gesagt.:


> Aber auch manchmal einfach so. Ist das Porgramm vll. überfordert oder so oder liegts am code?



Jep, ich denke mal der KI wird es regelmäßig schlecht wenn sie den Code sieht...


```
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);
```

Kennst du keine Schleifen und weißt du nicht wie man sie verwendet? Wenn ja, würde ich mir das Kapitel auf jedem Fall noch mal anschauen. 

Durch den Einsatz von Schleifen und dem Auslagern vom identischen Code in Methoden, könnte man deinen Code gut und gerne auf 10% der bisherigen schrumpfen. Vielleicht würde dann auch jemand durchblicken was du da machst.



> Manchmal meistens wenn nur noch 2 Käschen übrig sind zum aufdecken macht die Ki auf einmal nichts mehr.Woran kann das liegen?



Ausgaben auf der Konsole, Logging oder Debugging an wichtigen Stellen helfen dir dabei solche Probleme zu lösen.


----------



## Jack1995 (26. Apr 2012)

mhh ok,also 1. mal ja ich kenne mich mit schleifen aus;D
Den code den du hier zitierst is ja der reset code den man kürzer fassen könnte aber daran kanns ja nicht liegen. Womit ich halt probleme hab is halt diese KiLogik anders zu schreiben bzw. zu verlagern oder ka;D
das restliche spiel klappt alles perfekt;D


----------



## Jack1995 (27. Apr 2012)

Ok ich hab da Porblem von selber lösen können. ich weiß mein quelltext is noch rcht unordentlich is aber auch mein erstes Spiel;D Wer wissen will vll. wie ichs gelöst hab einfach nachricht schicken.


----------

