|
@@ -0,0 +1,140 @@
|
|
|
+public class PlayField {
|
|
|
+ private int rows;
|
|
|
+ private int columns;
|
|
|
+ private final int[][] fields;
|
|
|
+
|
|
|
+ public PlayField(int rows, int columns) {
|
|
|
+ this.rows = rows;
|
|
|
+ this.columns = columns;
|
|
|
+ fields = new int[rows][columns];
|
|
|
+ }
|
|
|
+
|
|
|
+ public final void setPos(int row, int column, Player player) {
|
|
|
+ fields[row][column] = player.getIndex();
|
|
|
+ }
|
|
|
+
|
|
|
+ public int getRows() {
|
|
|
+ return rows;
|
|
|
+ }
|
|
|
+
|
|
|
+ public int getColumns() {
|
|
|
+ return columns;
|
|
|
+ }
|
|
|
+
|
|
|
+ public void print() {
|
|
|
+ for(int i = 1; i <= getColumns(); 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");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ 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;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public int getFreeRow(int column) {
|
|
|
+ for(int row = getRows() - 1; row >= 0; row--) {
|
|
|
+ if(fields[row][column] == 0) {
|
|
|
+ return row;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ 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;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ 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;
|
|
|
+ }
|
|
|
+ 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;
|
|
|
+ }
|
|
|
+ } catch(ArrayIndexOutOfBoundsException e) {
|
|
|
+
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+}
|