-
Notifications
You must be signed in to change notification settings - Fork 0
/
Board.java
141 lines (125 loc) · 4.37 KB
/
Board.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
public class Board {
//dimensions of the board
public final int WIDTH = 7, HEIGHT = 6;
//height array for heigh of each column
int [] height = new int[WIDTH];
//hash of the game board: '4455' means there are two checkers on column 4 and 2 checks on column 5
//reversehash is the hash of the mirror of the current board, reversehash of '4321' is '4567'
private String hash = "", reverseHash = "";
//numbers of moves that has been played on this board
private int moves;
//actual board
private int board[][] = new int[WIDTH][HEIGHT];
//direction arrays for right, top right, up and top left
static int dx [] = {0,1,1,-1};
static int dy [] = {1,1,0,1};
//cordinate of last check placed
public int checkerColumn;
public int checkerRow;
public Board(String pos) {
//takes hash to generate game board, moves and reverse hash
hash = pos;
StringBuilder b = new StringBuilder();
for (int i = 0; i < hash.length(); i++) {
int dis = Math.abs(4 - (hash.charAt(i) - '0'));
if (hash.charAt(i) - '0' <= 4) b.append(4 + dis);
else b.append(4 - dis);
}
reverseHash = b.toString();
for (int i = 0; i < hash.length(); i++) {
int column = hash.charAt(i) - '0' -1;
height[column]++;
board[column][getY(column)] = 1+moves%2;
moves++;
}
}
//returns y coordinate of the first empty cell in a column
public int getY (int column) {
int y = 0;
for (; y < HEIGHT; y++) {
if (board[column][y] == 0 && (y == HEIGHT-1 || board[column][y+1] != 0)) break;
}
return y;
}
//places a checker at column and updates all variables
public void play (int column) {
hash = hash.concat(String.valueOf(column+1));
int dis = Math.abs(3 - column);
if (column <= 3) reverseHash = reverseHash.concat(String.valueOf(4 + dis));
else reverseHash = reverseHash.concat(String.valueOf(4 - dis));
checkerColumn = column;
if (column < 0) {
System.out.println(1);
}
checkerRow = height[column];
height[column]++;
board[column][getY(column)] = 1 + moves%2;
moves++;
}
//checks if a move is a winning move
public boolean isWinningMove (int column) {
int currentPlayer = 1 + moves%2;
int y = getY(column);
board[column][y] = currentPlayer;
if (checkWin()) {
board[column][y] = 0;
return true;
}
else {
board[column][y] = 0;
return false;
}
}
//checks if the board has a winner
public boolean checkWin () {
for (int y = 0; y < HEIGHT; y++) {
for (int x = 0; x < WIDTH; x++) {
if (board[x][y] != 0) {
for (int i = 0; i < dx.length; i++) {
int ny = y + dy[i] * 3, nx = x + dx[i] * 3;
if (ny < 0 || nx < 0 || ny >= 6 || nx >= 7) continue;
boolean flag = true;
if (board[x][y] == 0) break;
for (int j = 0; j < dy.length; j++) {
if (board[x][y] != (board[x + dx[i] * j][y + dy[i] * j])) {
flag = false;
break;
}
}
if (flag) return true;
}
}
}
}
return false;
}
//check if a column is full or not
public boolean canPlay (int column) {
return height[column] < 6;
}
//returns hash
public String getHash () {
return hash;
}
//returns reverse hash
public String getReverseHash() {
return reverseHash;
}
//returns how many moves have past
public int getMoves () {
return moves;
}
//returns 2D board
public int [][] getBoard() {
return board;
}
//prints board
public void printBoard(){
for (int i = 0; i < 6; i++) {
for (int j = 0; j < 7; j++) {
System.out.print(board[j][i]);
}
System.out.println();
}
}
}