Hallo,
ich habe ein einfaches TikTakToe-Spiel programmieren wollen. allerings bekomme ich beim Ausführen immer folgenden Fehler:
Exception in thread "main" java.lang.NullPointerException
at TicTacToe.inSpielfeld(TicTacToe.java:26)
at SpielStarter.start(SpielStarter.java:40)
at SpielStarter.main(SpielStarter.java:75)
Was habe ich falsch gemacht? Ich bin noch ein absoluter Anfänger...
Ich bin für jede Hilfe mehr als dankbar
Mein Quelltext besteht aus den drei folgenden Klassen:
ich habe ein einfaches TikTakToe-Spiel programmieren wollen. allerings bekomme ich beim Ausführen immer folgenden Fehler:
Exception in thread "main" java.lang.NullPointerException
at TicTacToe.inSpielfeld(TicTacToe.java:26)
at SpielStarter.start(SpielStarter.java:40)
at SpielStarter.main(SpielStarter.java:75)
Was habe ich falsch gemacht? Ich bin noch ein absoluter Anfänger...
Ich bin für jede Hilfe mehr als dankbar
Mein Quelltext besteht aus den drei folgenden Klassen:
Code:
import java.util.Scanner;
public class SpielStarter {
/**
* In diesem Attribut wird abgelegt, ob das Spiel bereits
* beendet ist bzw. ob weiter gespielt werden soll.
*/
private boolean gameOver;
/**
* Zum Spielen wird ein Objekt der Klasse TicTacToe benoetigt.
*/
private TicTacToe spielplan = new TicTacToe();
/**
* Standard-Konstruktor der Klasse SpielStarter.
*/
SpielStarter() {
gameOver = false;
}
/**
* Eigentliche Start-Methode des Spiels. Wird von
* <code>main</code> aufgerufen.
*/
public void start() {
/* aeussere Schleife */
do{
System.out.println("Willkommen! Sie moechten gern eine Runde Tic-Tac-Toe spielen ?");
System.out.println("Dann geht es jetzt los!1");
System.out.println();
System.out.println("Ihr Zeichen lautet " + "X" + ". Das Zeichen des Computers lautet " + "O" + ".");
System.out.println();
spielplan.inSpielfeld();
spielplan.ausgeben();
/* innere Schleife */
while(!gameOver){ // solange das Spiel nicht beendet ist
spielplan.zugSpieler();
if(spielplan.istGameOver()){
spielplan.ausgeben();
System.out.println("Sie haben gewonnen!!!");
break;
}
spielplan.zugComputer();
if(spielplan.istGameOver()){
spielplan.ausgeben();
System.out.println("Der Computer hat gewonnen. Schade.");
break;
}
}
System.out.println("Spiel beendet!");
System.out.print("Möchten Sie noch einmal spielen (J/N)? ");
if(Keyboard.readChar() == 'N'){
gameOver = true;
}
} while(!gameOver);
}
/**
* Hauptprogramm.
* @param args
*/
public static void main(String[] args) {
SpielStarter s= new SpielStarter();
s.start();
}
}
/**
*
*/
/**
* @author robert
*
*/
public class TicTacToe {
private int spielzuege;
private char [] feld;
private char LEER;
public TicTacToe () {
spielzuege= 0;
char arr [] = new char[9];
}
public void inSpielfeld() {
for (int i=0; i<=8; i++) {
feld[i]=LEER;
}
}
public char getFeld (int nummer) {
return feld[nummer];
}
public void setFeld (int nummer, char zeichen) {
this.feld[nummer]= zeichen;
}
public boolean istFrei (int nummer)
{if (feld[nummer] != LEER);
return true;
}
public void ausgeben () {
System.out.println("[" + feld[0] + "]" + "[" + feld[1] + "]" + "[" + feld[2] + "]");
System.out.println("[" + feld[3] + "]" + "[" + feld[4] + "]" + "[" + feld[5] + "]");
System.out.println("[" + feld[6] + "]" + "[" + feld[7] + "]" + "[" + feld[8] + "]");
}
public boolean istGameOver() {
if ((LEER != feld[0]) && (feld[0] == feld[1]) && (feld[1] == feld[2]))
return true;
else if ((LEER != feld[3]) && (feld[3] == feld[4]) && (feld[4] == feld[5]))
return true;
else if ((LEER != feld[6]) && (feld[6] == feld[7]) && (feld[7] == feld[8]))
return true;
else if ((LEER != feld[0]) && (feld[0] == feld[3]) && (feld[3] == feld[6]))
return true;
else if ((LEER != feld[1]) && (feld[1] == feld[4]) && (feld[4] == feld[7]))
return true;
else if ((LEER != feld[2]) && (feld[2] == feld[5]) && (feld[5] == feld[8]))
return true;
else if ((LEER != feld[0]) && (feld[0] == feld[4]) && (feld[4] == feld[8]))
return true;
else if ((LEER != feld[2]) && (feld[2] == feld[4]) && (feld[4] == feld[6]))
return true;
return true;
}
public void zugComputer()
{
int eingabe = -1;
spielzuege++;
do
{
/* die folgende Anweisung erzeugt eine Pseudo-Zufallszahl zwischen 1 und 9 */
eingabe = (int)(Math.random() * 9) + 1;
System.out.println("Computer hat das Feld " + (eingabe) + " gewählt.");
}
/* fuer die zufaellig bestimme Feldnummer wird anschliessend geprueft, ob diese nicht
vielleicht bereits besetzt ist.
Sonst muss eine neue Zahl ermittelt werden */
while(!istFrei(eingabe));
/* das Feld ist noch frei und wird nun markiert */
setFeld(eingabe, 'O');
System.out.println("Der Computer hat seinen Zug beendet.");
/* geaendertes Spielfeld anzeigen */
ausgeben();
}
public void zugSpieler()
{
int eingabe = -1;
spielzuege++;
do
{
/* die folgende Anweisung erzeugt eine Pseudo-Zufallszahl zwischen 1 und 9 */
eingabe = Keyboard.readInt();
System.out.println("Du hat das Feld " + (eingabe) + " gewählt.");
}
/* fuer die zufaellig bestimme Feldnummer wird anschliessend geprueft, ob diese nicht
vielleicht bereits besetzt ist.
Sonst muss eine neue Zahl ermittelt werden */
while(!istFrei(eingabe));
/* das Feld ist noch frei und wird nun markiert */
setFeld(eingabe, 'X');
System.out.println("Du hast deinen Zug beendet.");
/* geaendertes Spielfeld anzeigen */
ausgeben();
}
}
mport java.io.*;
/**
* Einfache Klasse zur Tastatur-Eingabe von Zeichenketten und Zahlenwerten. Beim
* Einlesen von Zahlenwerten werden Format-Ausnahmen ausgeloest, wenn keine
* gueltige Zahl eingegeben wird.
*
*/
public class Keyboard {
/**
* Zum Einlesen der Tastatur-Eingabe wird ein BufferedReader vom
* Standard-Eingabe-Kanal verwendet.
*/
private static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
/**
* Lesen einer Zeichenkette von der Tastatur. Eine hier nur theoretisch
* moegliche IOException wird ohne Reaktion abgefangen.
*
* @return eingegebene Zeichenkette
*/
public static String readString() {
String s = "";
try {
s = in.readLine();
} catch (IOException e) {
/*
* keine Reaktion
*/
}
return s;
}
/**
* Lesen eines int-Werts von der Tastatur.
*
* @return eingegebener int -Wert
* @exception NumberFormatException falls kein gueltiger int-Wert eingegeben
* wird
*/
public static int readInt() throws NumberFormatException {
String s = readString();
int n = Integer.parseInt(s);
return n;
}
/**
* Lesen eines long-Werts von der Tastatur.
*
* @return eingegebener long -Wert
* @exception NumberFormatException falls kein gueltiger long-Wert eingegeben
* wird
*/
public static long readLong() throws NumberFormatException {
String s = readString();
long n = Long.parseLong(s);
return n;
}
/**
* Lesen eines float-Werts von der Tastatur.
*
* @return eingegebener float -Wert
* @exception NumberFormatException falls kein gueltiger float -Wert eingegeben
* wird
*/
public static float readFloat() throws NumberFormatException {
String s = readString();
float n = Float.valueOf(s).floatValue();
return n;
}
/**
* Lesen eines double-Werts von der Tastatur.
*
* @return eingegebener double -Wert
* @exception NumberFormatException falls kein gueltiger double -Wert eingegeben
* wird
*/
public static double readDouble() throws NumberFormatException {
String s = readString();
double n = Double.valueOf(s).doubleValue();
return n;
}
public static char readChar() throws NumberFormatException {
String s = readString();
char n = Char.valueOf(s).charValue();
return n;
}
}