# TicTacToe



## felxi (18. Mrz 2009)

Hallo!
In der Schule programmieren wir gerade mittels Java - BlueJ.
Ich wollte ein kleines 2-Spieler TicTacToe programmieren, allerdings läuft's nicht so, wie es soll. Hab vielleicht an manchen Stellen ein wenig geschludert, der Code ist aber auch nur Produkt einer Doppelstunde 

Hier der komplette Code: 

[HIGHLIGHT="Java"]import sum.kern.*;
import sum.werkzeuge.*;

/**
 * @author 
 * @version 
 */



public class TicTac
{
    private boolean Spieler1AmZug;
    private int[][] aFeld = new int[4][4];
    private boolean Spielende;

    Rechner hatRechner;
    Maus hatMaus;
    Buntstift hatBuntstift;

    // Konstruktor
    public TicTac()
    {
      hatRechner = new Rechner();
      hatMaus = new Maus();
      hatBuntstift = new Buntstift();

      Spieler1AmZug = true;
      Spielende = false;
    }

    private int getXFeld(int xpos)
    {
      int x;  
      x = hatRechner.ganzerAnteil((xpos)/150+1); 
      if(x>=4) x=3;
      return x;
    }

    private int getYFeld(int ypos)
    {
      int y;  
      y = hatRechner.ganzerAnteil((ypos)/150+1); 
      if(y>=4) y=3;
      return y;
    }    

    private void Spielerwechsel()
    {
      if(Spieler1AmZug==true)
      {
        Spieler1AmZug = false;
      }  
      else Spieler1AmZug = true;
    }

    private void zeichneKreis(int xFeld, int yFeld)
    {
      if(Spieler1AmZug==true)
      {
        hatBuntstift.setzeFarbe(Farbe.ROT);
      }else
      {
        hatBuntstift.setzeFarbe(Farbe.BLAU);  
      }
      hatBuntstift.hoch();
      hatBuntstift.bewegeBis(xFeld*150-75, yFeld*150-75);
      hatBuntstift.runter();
      hatBuntstift.setzeFuellmuster(1);
      hatBuntstift.zeichneKreis(60);
      hatBuntstift.hoch(); 

    }

    //Spieler 1 hat Feldwert 2, Spieler 2 hat Feldwert 3;

    private boolean spieler1Sieg(int p_t)
    {
      if(p_t % 2 == 0)
      {
        Spielende = true; 
      } else
      {
        Spielende = false; 
      }

      return Spielende;
    }

    private boolean spieler2Sieg(int p_t)
    {
      if(p_t % 3 == 0)
      {
        Spielende = true; 
      } else
      {
        Spielende = false;  
      }

      return Spielende;
    }


    private void Gewinnpruefung()
    {
      int p;
      p = 1;

      //Spaltenprüfung  
      for(int i = 1; i<4; i++)
      {
        p = 1;  
        for(int j = 1; j<4; j++)
        {
          p = aFeld_[j]*p; 
        }  
       if(spieler1Sieg(p)||spieler1Sieg(p)) hatBuntstift.schreibeText("Das Spiel ist aus!");
      }

      //Zeilenprüfung
      for(int j = 1; j<4; j++)
      {
        p = 1;  
        for(int i = 1; i<4; i++)
        {
          p = aFeld[j]*p; 
        }  
       if(spieler1Sieg(p)||spieler1Sieg(p)) hatBuntstift.schreibeText("Das Spiel ist aus!");
      }

      //Diagonale 1
      p = p*aFeld[1][1]*aFeld[2][2]*aFeld[3][3];
      if(spieler1Sieg(p)||spieler1Sieg(p)) hatBuntstift.schreibeText("Das Spiel ist aus!");

      //Diagonale 2 
      p = p*aFeld[3][1]*aFeld[2][2]*aFeld[1][3];
      if(spieler1Sieg(p)||spieler1Sieg(p)) hatBuntstift.schreibeText("Das Spiel ist aus!");




    }

    private void initArray()
    {
      for(int i = 1; i<4; i++)
      {
        for(int j = 1; j<4; j++)
        {
          aFeld[j] = 0;  
        }          
      }
    }

    public void Spielstart()
    {
      int xFeld, yFeld;
      boolean gueltigerZug;

      initArray(); //Alle Felder auf "0" setzen;


   do
   {
      do
      {
        gueltigerZug = false;

        if(hatMaus.istGedrueckt())
        {
          xFeld = getXFeld(hatMaus.hPosition()); //Mauskoordinaten in Spielfeld [1..3] umrechnen
          yFeld = getYFeld(hatMaus.vPosition());
         ////////////////////////////////////////////////////////// 
          if(aFeld[xFeld][yFeld]==0) //Wenn freies Feld
          {
            gueltigerZug = true; //Der Zug war gültig!

            if(Spieler1AmZug)  //Spielwerte eintragen; Spieler 1 = 2; Spieler 2 = 3;
            {
              aFeld[xFeld][yFeld] = 2;  
              zeichneKreis(xFeld,yFeld);
            } else
            {
              aFeld[xFeld][yFeld] = 3; 
              zeichneKreis(xFeld,yFeld);
            }

            Spielerwechsel();
          }
         //////////////////////////////////////////////////////////  

        }
      }while(gueltigerZug==false);

      Gewinnpruefung();
    }while(!Spielende);
}




}
[/HIGHLIGHT]

public void Spielstart() wird dabei im Hauptprogramm aufgerufen.
Außerdem wird noch ein TicTacToe-Spielfeld gezeichnet.

Das Programm soll wie folgt funktionieren:

-die Felder eins 2-Dimensionalen Arrays auf 0 setzen
-solange Mausklicks in Feldnummern (1-3) umrechnen, bis ein gültiges Feld angeklickt   
 wurde; Spieler 1 trägt dann den Wert 2 ins Array ein, Spieler 2 den Wert 3.
 Bei der Gewinnprüfung wird dann das Zeilen-/Spaltenprodukt gebildet und überprüft, ob 
 einer der Spieler gewonnen hat.

Ich vermute den Fehler im letzten Dienst bzw. bei einer der Schleifen, da sich das Programm direkt zu Beginn aufhängt, ohne dass eine der Tasten gedrückt wurde.
Deswegen reicht's womöglich, nur den besagten letzten Dienst anzuschauen.. der Rest sollte mehr oder weniger richtig sein 

Lg

Felix_


----------



## Marco13 (18. Mrz 2009)

Ja nu, was heißt "aufhängen" - das ist eine while-Schleife, die ohne Pause ewig läuft. Was ist denn dieses obskure "HatMaus"-Zeug? Dich jetzt mit Events, Threads und synchronisation vollzutexten würde es ja nicht bringen...


----------



## felxi (19. Mrz 2009)

An Threads habe ich auch gedacht.
Jedenfalls funktioniert das Programm jetzt, allerdings nicht auf meinem Rechner.. warum auch immer. "Obskur" trifft das Ganze recht gut. Wie ich es hasse, nach jahrelanger Programmiererfahrung eine _eingedeutschte_ Version einer an sich tollen Programmiersprache vorgesetzt zu bekommen ;/

Vorallem wird jegliche Fehlermeldung intern behandelt, so dass der unerfahrene Anwender ja nicht nachdenken muss..

nagut, dir trotzdem Danke für deinen Beitrag


----------

