|
@@ -1,140 +1,92 @@
|
|
|
public class PlayField {
|
|
|
- private int rows;
|
|
|
- private int columns;
|
|
|
- private final int[][] fields;
|
|
|
+ private int width;
|
|
|
+ private int height;
|
|
|
+ private final char[][] fields;
|
|
|
|
|
|
- public PlayField(int rows, int columns) {
|
|
|
- this.rows = rows;
|
|
|
- this.columns = columns;
|
|
|
- fields = new int[rows][columns];
|
|
|
+ public PlayField(int width, int height) {
|
|
|
+ this.width = width;
|
|
|
+ this.height = height;
|
|
|
+ fields = new char[width][height];
|
|
|
+ reset();
|
|
|
}
|
|
|
|
|
|
- public final void setPos(int row, int column, Player player) {
|
|
|
- fields[row][column] = player.getIndex();
|
|
|
+ public final void setPos(int x, int y, Player player) {
|
|
|
+ fields[x][y] = player.getToken();
|
|
|
}
|
|
|
|
|
|
- public int getRows() {
|
|
|
- return rows;
|
|
|
+ public int getWidth() {
|
|
|
+ return width;
|
|
|
}
|
|
|
|
|
|
- public int getColumns() {
|
|
|
- return columns;
|
|
|
+ public int getHeight() {
|
|
|
+ return height;
|
|
|
}
|
|
|
|
|
|
public void print() {
|
|
|
- for(int i = 1; i <= getColumns(); i++) {
|
|
|
+ for(int i = 1; i <= width; i++) {
|
|
|
System.out.print("[" + i + "]");
|
|
|
}
|
|
|
System.out.println();
|
|
|
- for(int[] row : fields) {
|
|
|
- for(int column : row) {
|
|
|
- if(column == 0) {
|
|
|
- printSlot(" ");
|
|
|
- } else if(column == 1) {
|
|
|
- printSlot("x");
|
|
|
- } else {
|
|
|
- printSlot("o");
|
|
|
- }
|
|
|
+ for(int y = 0; y < height; y++) {
|
|
|
+ for(int x = 0; x < width; x++) {
|
|
|
+ System.out.print("[" + fields[x][y] + "]");
|
|
|
}
|
|
|
System.out.println();
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- public void printSlot(String value) {
|
|
|
- System.out.print("[" + value + "]");
|
|
|
- }
|
|
|
-
|
|
|
public void reset() {
|
|
|
- for(int row = 0; row < getRows(); row++) {
|
|
|
- for(int column = 0; column < getColumns(); column++) {
|
|
|
- fields[row][column] = 0;
|
|
|
+ for(int x = 0; x < width; x++) {
|
|
|
+ for(int y = 0; y < height; y++) {
|
|
|
+ fields[x][y] = ' ';
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- public int getFreeRow(int column) {
|
|
|
- for(int row = getRows() - 1; row >= 0; row--) {
|
|
|
- if(fields[row][column] == 0) {
|
|
|
- return row;
|
|
|
+ public int getFreeY(int x) {
|
|
|
+ for(int y = height - 1; y >= 0; y--) {
|
|
|
+ if(fields[x][y] == ' ') {
|
|
|
+ return y;
|
|
|
}
|
|
|
}
|
|
|
return -1;
|
|
|
}
|
|
|
|
|
|
- public boolean hasFreeRow(int column) {
|
|
|
- for(int row = getRows() - 1; row >= 0; row--) {
|
|
|
- if(fields[row][column] == 0) {
|
|
|
- return true;
|
|
|
- }
|
|
|
- }
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
public boolean isDraw() {
|
|
|
- for(int row = 0; row < getRows(); row++) {
|
|
|
- for(int column = 0; column < getColumns(); column++) {
|
|
|
- if(fields[row][column] == 0) {
|
|
|
- return false;
|
|
|
- }
|
|
|
+ for(int x = 0; x < width; x++) {
|
|
|
+ if(getFreeY(x) != 1) {
|
|
|
+ return false;
|
|
|
}
|
|
|
}
|
|
|
return true;
|
|
|
+
|
|
|
}
|
|
|
|
|
|
- public boolean hasWon(Player player, int r, int c) {
|
|
|
- // Horizontal left
|
|
|
- if(checkDirection(player, r, c, "left", "")) {
|
|
|
- return true;
|
|
|
- }
|
|
|
- // Horizontal right
|
|
|
- if(checkDirection(player, r, c, "right", "")) {
|
|
|
- return true;
|
|
|
- }
|
|
|
- // Vertical (only down)
|
|
|
- if(checkDirection(player, r, c, "", "down")) {
|
|
|
- return true;
|
|
|
- }
|
|
|
- // Diagonal left up
|
|
|
- if(checkDirection(player, r, c, "left", "up")) {
|
|
|
- return true;
|
|
|
- }
|
|
|
- // Diagonal left down
|
|
|
- if(checkDirection(player, r, c, "left", "down")) {
|
|
|
- return true;
|
|
|
- }
|
|
|
- // Diagonal right up
|
|
|
- if(checkDirection(player, r, c, "right", "up")) {
|
|
|
- return true;
|
|
|
- }
|
|
|
- // Diagonal right down
|
|
|
- if(checkDirection(player, r, c, "right", "down")) {
|
|
|
- return true;
|
|
|
+ public boolean hasWon(Player player, int y, int x) {
|
|
|
+ for(int dir_x = -1; dir_x <= 1; dir_x++) {
|
|
|
+ for(int dir_y = -1; dir_y <= 1; dir_y++) {
|
|
|
+ if(dir_x == 0 && dir_y == 0) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ if(checkDirection(player, y, x, dir_y, dir_x)) {
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
- public boolean checkDirection(Player player, int r, int c, String horizontal, String vertical) {
|
|
|
- int index = player.getIndex();
|
|
|
- int h = 0;
|
|
|
- int v = 0;
|
|
|
- if(horizontal == "left") {
|
|
|
- h = -1;
|
|
|
- } else if(horizontal == "right") {
|
|
|
- h = 1;
|
|
|
- }
|
|
|
- if(vertical == "up") {
|
|
|
- v = -1;
|
|
|
- } else if(vertical == "down") {
|
|
|
- v = 1;
|
|
|
- }
|
|
|
- try {
|
|
|
- if(fields[r][c] == index && fields[r + v][c + h] == index && fields[r + 2 * v][c + 2 * h] == index && fields[r + 3 * v][c + 3 * h] == index) {
|
|
|
- return true;
|
|
|
+ private boolean checkDirection(Player player, int x, int y, int dir_x, int dir_y) {
|
|
|
+ char t = player.getToken();
|
|
|
+ for(int i = 1; i < 4; i++) {
|
|
|
+ int new_x = x + i * dir_y;
|
|
|
+ int new_y = y + i * dir_x;
|
|
|
+ if(new_x < 0 || new_x >= width || new_y < 0 || new_y >= height
|
|
|
+ || fields[new_x][new_y] != t) {
|
|
|
+ return false;
|
|
|
}
|
|
|
- } catch(ArrayIndexOutOfBoundsException e) {
|
|
|
-
|
|
|
}
|
|
|
- return false;
|
|
|
+ return true;
|
|
|
}
|
|
|
|
|
|
}
|