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