forked from davecom/ClassicComputerScienceProblemsInJava
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathTTTBoard.java
More file actions
108 lines (95 loc) · 2.73 KB
/
TTTBoard.java
File metadata and controls
108 lines (95 loc) · 2.73 KB
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
// TTTBoard.java
// From Classic Computer Science Problems in Java Chapter 8
// Copyright 2020 David Kopec
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package chapter8;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class TTTBoard implements Board<Integer> {
private static final int NUM_SQUARES = 9;
private TTTPiece[] position;
private TTTPiece turn;
public TTTBoard(TTTPiece[] position, TTTPiece turn) {
this.position = position;
this.turn = turn;
}
public TTTBoard() {
// by default start with blank board
position = new TTTPiece[NUM_SQUARES];
Arrays.fill(position, TTTPiece.E);
// X goes first
turn = TTTPiece.X;
}
@Override
public Piece getTurn() {
return turn;
}
@Override
public TTTBoard move(Integer location) {
TTTPiece[] tempPosition = Arrays.copyOf(position, position.length);
tempPosition[location] = turn;
return new TTTBoard(tempPosition, turn.opposite());
}
@Override
public List<Integer> getLegalMoves() {
ArrayList<Integer> legalMoves = new ArrayList<>();
for (int i = 0; i < NUM_SQUARES; i++) {
// empty squares are legal moves
if (position[i] == TTTPiece.E) {
legalMoves.add(i);
}
}
return legalMoves;
}
@Override
public boolean isWin() {
// three row, three column, and then two diagonal checks
return checkPos(0, 1, 2) || checkPos(3, 4, 5) || checkPos(6, 7, 8)
|| checkPos(0, 3, 6) || checkPos(1, 4, 7) || checkPos(2, 5, 8)
|| checkPos(0, 4, 8) || checkPos(2, 4, 6);
}
private boolean checkPos(int p0, int p1, int p2) {
return position[p0] == position[p1] && position[p0] == position[p2]
&& position[p0] != TTTPiece.E;
}
@Override
public double evaluate(Piece player) {
if (isWin() && turn == player) {
return -1;
} else if (isWin() && turn != player) {
return 1;
} else {
return 0.0;
}
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
for (int row = 0; row < 3; row++) {
for (int col = 0; col < 3; col++) {
sb.append(position[row * 3 + col].toString());
if (col != 2) {
sb.append("|");
}
}
sb.append(System.lineSeparator());
if (row != 2) {
sb.append("-----");
sb.append(System.lineSeparator());
}
}
return sb.toString();
}
}