Hi,
ich programmiere gerade ein grafisches TicTacToe.
Leider kann man nur bedingt gewinnen. Es kann nur manchmal Kreis gewinnen und wenn ich abfrage, ob Kreuz gewonnen hat, kommt eine NullPointerException.
Alle Möglichkeiten zum Gewinnen, habe ich noch nicht abgefragt, aber die die gehen sollten, gehen nur teilweise.
Der komplette Code:
http://mitglied.lycos.de/masterchan/TicTacToeV2.zip
Liebe Grüße
Reality
ich programmiere gerade ein grafisches TicTacToe.
Leider kann man nur bedingt gewinnen. Es kann nur manchmal Kreis gewinnen und wenn ich abfrage, ob Kreuz gewonnen hat, kommt eine NullPointerException.
Code:
import java.awt.*;
public class Spielfeld{
Player playerCircel;
Player playerCross;
static String playedToken = "";
static boolean field[] = new boolean[9]; //Felder besetzt?
static String playerOnField[] = new String[9]; // Wer hat welches Feld besetzt?
static private int lastPlaced; //Wo wurde ein Zeichen zuletzt gesetzt?
private int pos_x; //X-Position der Maus
private int pos_y; //Y-Position der Maus
Spielfeld(){
playerCircel = new Player();
playerCross = new Player();
for(int i=0; i<field.length; i++)
field[i] = false;
for(int i=0; i<playerOnField.length; i++){
playerOnField[i] = "";
}
}
private void drawCross(Graphics g){
//Ein 'X' malen
g.setColor(Color.RED);
if(pos_x != 0 && pos_y !=0 && !occupyField(pos_x, pos_y)){
g.drawLine(pos_x, pos_y, pos_x + 20, pos_y + 20);
g.drawLine(pos_x - 1, pos_y, pos_x + 19, pos_y + 20);
g.drawLine(pos_x + 20, pos_y, pos_x, pos_y + 20);
g.drawLine(pos_x + 19, pos_y, pos_x - 1, pos_y + 20);
pos_x = 0;
pos_y = 0;
}
}
private void drawCircel(Graphics g){
//Ein Kreis malen
g.setColor(Color.RED);
//Wenn Feld im gültigen Bereich ist und es noch nicht belegt ist,
// dann zeichne...
if(pos_x != 0 && pos_y !=0 && !occupyField(pos_x, pos_y)){
g.drawOval(pos_x, pos_y, 25, 25);
g.drawOval(pos_x - 1, pos_y, 25, 25);
pos_x = 0;
pos_y = 0;
}
}
void drawField(Graphics g){
//Spielfeld zeichnen
g.fillRect(60, 120, 150, 2);
g.fillRect(60, 170, 150, 2);
g.fillRect(110, 70, 2, 150);
g.fillRect(160, 70, 2, 150);
}
void drawToken(Graphics g, int pos_x, int pos_y, String token){
if(placeX(pos_x) && placeY(pos_y)){ // Wenn in ein gültiges Feld geklickt wurde...
if (token.equals(Main.cross)) {
drawCross(g);
playedToken = Main.cross;
playerOnField[lastPlaced] = Main.cross;
playerCross.hasWon(Main.cross, "Kreuz");
}
else if(token.equals(Main.circel)){
drawCircel(g);
playedToken = Main.circel;
playerOnField[lastPlaced] = Main.circel;
playerCircel.hasWon(Main.circel, "Kreis");
}
}
}
// Wurde in einem gültigem Bereich geklickt? Falls ja, platziere das Zeichen
// an der richten Stelle.
private boolean placeX(int pos_x){
if(pos_x <=110 && pos_x >= 60){
this.pos_x = 75;
return true;
}
else if(pos_x <= 160 && pos_x >= 110){
this.pos_x = 125;
return true;
}
else if(pos_x <= 210 && pos_x >= 110){
this.pos_x = 175;
return true;
}
//Falls an falscher Stelle geklickt, dann soll auch nicht gezeichnet werden
else return false;
}
private boolean placeY(int pos_y){
if(pos_y <= 120 && pos_y >= 70){
this.pos_y = 85;
return true;
}
else if(pos_y <= 170 && pos_y >= 120){
this.pos_y = 135;
return true;
}
else if(pos_y <= 220 && pos_y >= 170){
this.pos_y = 185;
return true;
}
else return false;
}
//Ist ein Feld schon besetzt? Falls ja, darf nicht gezeichnet werden
boolean occupyField(int pos_x, int pos_y){
if(pos_x <=110 && pos_x >= 60 && pos_y <= 120 && pos_y >= 70 && !field[0]){
field[0] = true; //Als besetzt markieren
lastPlaced = 0; //Speichern wo der Spieler gesetzt hat
return false; //Feld nicht besetzt => Es kann gezeichnet werden
}
else if(pos_x <= 160 && pos_x >= 110 && pos_y <= 120 && pos_y >= 70 && !field[1]){
field[1] = true;
lastPlaced = 1;
return false;
}
else if(pos_x <= 210 && pos_x >= 160 && pos_y <= 120 && pos_y >= 70 && !field[2]){
field[2] = true;
lastPlaced = 2;
return false;
}
else if(pos_x <= 110 && pos_x >= 60 && pos_y <= 170 && pos_y >= 120 && !field[3]){
field[3] = true;
lastPlaced = 3;
return false;
}
else if(pos_x <= 160 && pos_x >= 110 && pos_y <= 170 && pos_y >= 120 && !field[4]){
field[4] = true;
lastPlaced = 4;
return false;
}
else if(pos_x <= 210 && pos_x >= 160 && pos_y <= 170 && pos_y >= 120 && !field[5]){
field[5] = true;
lastPlaced = 5;
return false;
}
else if(pos_x <= 110 && pos_x >= 60 && pos_y <= 220 && pos_y >= 170 && !field[6]){
field[6] = true;
lastPlaced = 6;
return false;
}
else if(pos_x <= 160 && pos_x >= 110 && pos_y <= 220 && pos_y >= 170 && !field[7]){
field[7] = true;
lastPlaced = 7;
return false;
}
else if(pos_x <= 210 && pos_x >= 160 && pos_y <= 220 && pos_y >= 170 && !field[8]){
field[8] = true;
lastPlaced = 8;
return false;
}
else return true; //Feld schon belegt oder nicht vorhanden
}
}
Alle Möglichkeiten zum Gewinnen, habe ich noch nicht abgefragt, aber die die gehen sollten, gehen nur teilweise.
Code:
import javax.swing.*;
public class Player {
void hasWon(String player, String playerName){
for(int i=1; i <= Spielfeld.playerOnField.length/3; i+=3){
System.out.println(i+"\n"+
i+3+"\n"+
i+6);
if(Spielfeld.playerOnField[i].equals(player) &&
Spielfeld.playerOnField[i+3].equals(player) &&
Spielfeld.playerOnField[i+6].equals(player)){
JOptionPane.showMessageDialog(Main.frame, playerName + " hat gewonnen");
}
}
for(int i=0; i < Spielfeld.playerOnField.length/3; i+=3){
if(Spielfeld.playerOnField[i].equals(player) &&
Spielfeld.playerOnField[i+1].equals(player) &&
Spielfeld.playerOnField[i+2].equals(player)){
JOptionPane.showMessageDialog(Main.frame, playerName + " hat gewonnen");
}
}
}
}
Der komplette Code:
http://mitglied.lycos.de/masterchan/TicTacToeV2.zip
Liebe Grüße
Reality