TicTacToe

Status
Nicht offen für weitere Antworten.

felxi

Neues Mitglied
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

Top Contributor
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

Neues Mitglied
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 ;)
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Oben