Hallo,
ich muss gerade für die Uni eine KI für das Othello/Reversi Spiel Programmieren, die dann gegen eine gegnerische KI spielt. Meine KI lade ich dann auf den Uniserver welcher mit 3 Schritten ein Spiel laufen lässt:
1. Konstuktoraufruf ( nur einmal beim Aufruf des Spiels)
2.Init (zu Beginn jeder neue Spielpartie. Ungefähr mit einem Resetknopf gleichzusetzen)
3.NextMove (führt die Spielzüge des jeweiligen Spieler aus)
Dabei hat jede KI sein eigenes Spielfeld und die KI erstellen abwechselnd durch die NextMove-Methode ein sogenanntes Move-Objekt, welches die x und y Koordinaten des Spielzuges beinhaltet. Dieses Move-Objekt wird dann vom Server entwertet und als "prevMove" an den Gegner weitergeleitet, damit dieser sein Spielfeld damit aktualisieren kann. Wenn ich dann ein Spiel starte erhalte ich allerdings eine Fehlermeldung die sagt : "execution error: java.lang.NullPointerException". Mein Verdacht liegt in der Init, wenn ich die newBoard-Methode aufrufe.
Ich weiss allerdings nicht was ich falsch gemacht habe und komme einfach nicht weiter..
Für jegliche Hilfe wäre ich wirklich sehr dankbar !!
Code meiner Hauptklasse:
Code der Spielfeldklasse:
Viele Grüße und eine gute Nacht,
Jpad
ich muss gerade für die Uni eine KI für das Othello/Reversi Spiel Programmieren, die dann gegen eine gegnerische KI spielt. Meine KI lade ich dann auf den Uniserver welcher mit 3 Schritten ein Spiel laufen lässt:
1. Konstuktoraufruf ( nur einmal beim Aufruf des Spiels)
2.Init (zu Beginn jeder neue Spielpartie. Ungefähr mit einem Resetknopf gleichzusetzen)
3.NextMove (führt die Spielzüge des jeweiligen Spieler aus)
Dabei hat jede KI sein eigenes Spielfeld und die KI erstellen abwechselnd durch die NextMove-Methode ein sogenanntes Move-Objekt, welches die x und y Koordinaten des Spielzuges beinhaltet. Dieses Move-Objekt wird dann vom Server entwertet und als "prevMove" an den Gegner weitergeleitet, damit dieser sein Spielfeld damit aktualisieren kann. Wenn ich dann ein Spiel starte erhalte ich allerdings eine Fehlermeldung die sagt : "execution error: java.lang.NullPointerException". Mein Verdacht liegt in der Init, wenn ich die newBoard-Methode aufrufe.
Ich weiss allerdings nicht was ich falsch gemacht habe und komme einfach nicht weiter..
Für jegliche Hilfe wäre ich wirklich sehr dankbar !!
Code meiner Hauptklasse:
Code:
package ki;
import java.util.Random;
import szte.mi.Move;
import szte.mi.Player;
public class OthelloPlayer implements Player {
static int player = 0;
static int enemy = 0;
static GameBoard gameboard;
Model model;
int[] movelistX;
int[] movelistY;
int[] countlist;
int firstmove = 0;
Move move;
// OthelloPlayer p = new OthelloPlayer();
public OthelloPlayer() {
gameboard = new GameBoard();
model = new Model();
//Arraylänge 24, da davon ausgegangen wird, dass es nie mehr als 24 legale Züge pro Runde geben wird
movelistX = new int[24];
movelistY = new int[24];
countlist = new int[24];
}
public void init(int order, long t, Random rnd) {
gameboard.newBoard(gameboard.board);
setPlayer(order);
firstmove=order;
}
public Move nextMove(Move prevMove, long tOpponent, long t) {
// ---------Einfügen des gegnerischen Spielzuges ins eigene Spielfeld----------
int x = prevMove.x, y = prevMove.y;
gameboard.board[x][y] = enemy;
model.combo(x, y);
// --------------------------Spielerzug---------------------------------------
if(firstmove==0) {
firstmove++;
return new Move(5,4);
}
updateLists();
x = movelistX[bestMove()];
y = movelistY[bestMove()];
move = new Move(x, y);
gameboard.set(x, y, player);
return move;
}
// setzt alle legalen Spielzüge in Arrays
public void updateLists() {
int temp = 0;
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 8; j++) {
if (model.checkValid(i, j)) {
if (model.count(i, j) > 0) {
movelistX[temp] = i;
movelistY[temp] = j;
countlist[temp] = model.count(i, j);
temp++;
}
}
}
}
}
//findet den bestmöglichen Zug durch vergleich in der Liste
public int bestMove() {
int best = countlist[0];
for (int i = 0; i < countlist.length; i++) {
if (best < countlist[i]) {
best = i;
}
}
return best;
}
public void setPlayer(int x) {
if (x == 0) {
enemy = 1;
} else if (x == 1) {
enemy = 0;
}
player = x;
}
public int getPlayer() {
return player;
}
public int getEnemy() {
return enemy;
}
}
Code der Spielfeldklasse:
Code:
package ki;
public class GameBoard {
int boardsize = 8;
int[][] board;
public GameBoard() {
board = new int[8][8];
}
//initialisiert neues Spielbrett -1 leeres Feld, 0 schwarzer Spieler, 1 weisser Spieler
public void newBoard(int[][] board) {
for (int i=0;i<boardsize;i++) {
for(int j=0;j<boardsize;j++) {
board[i][j]=-1;
}
}
board[3][3]=0;
board[4][4]=0;
board[4][3]=1;
board[3][4]=1;
}
public int get(int x,int y) {
return board[x][y];
}
public void set(int x,int y,int p) {
board[x][y]=p;
}
}
Viele Grüße und eine gute Nacht,
Jpad