O
,
E
; // E — пустая клетка
@Override
public
TTTPiece opposite() {
switch
(
this
) {
case X
:
return
TTTPiece.
O
;
case O
:
return
TTTPiece.
X
;
default
: // E, пустая клетка
return
TTTPiece.
E
;
}
}
@Override
public
String toString() {
switch
(
this
) {
case X
:
return
"X";
case O
:
return
"O";
default
: // E, пустая клетка
return
" ";
}
}
}
В.игре.в.крестики-нолики.существует.девять.позиций,.образующих.три.ряда.
по.три.столбца..Для.простоты.эти.девять.позиций.можно.представить.в.виде.
одномерного.списка..То,.какие.клетки.получат.какие.номера.(другими.словами,.
индексы.в.массиве),.не.имеет.значения,.но.мы.будем.придерживаться.схемы,.
показанной.на.рис..8.1.
0
1
2
3
4
5
6
7
8
. .
Рис. 8.1.
Каждой клетке на игровом поле
соответствует индекс одномерного списка
220
Глава 8.
Состязательный поиск
Главным.хранилищем.состояния.игры.будет.класс.
TTTBoard
..Он.отслеживает.два.
элемента.состояния:.позицию,.представленную.вышеупомянутым.одномерным.
списком,.и.игрока,.который.сейчас.делает.ход.(листинг.8.4).
Листинг 8.4.
TTTBoard.java
package
chapter8;
import
java.util.ArrayList;
import
java.util.Arrays;
import
java.util.List;
public class
TTTBoard
implements
Board {
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() {
// по умолчанию в начале игры поле пустое
position =
new
TTTPiece[
NUM_SQUARES
];
Arrays.
fill
(position, TTTPiece.
E
);
// Первый игрок ставит X
turn = TTTPiece.
X
;
}
@Override
public
Piece getTurn() {
return
turn;
}
Исходное.состояние.поля.—.такое,.при.котором.еще.не.сделано.ни.одного.хода.
(пустое.поле)..Конструктор.без.параметров.для.
TTTBoard
.инициализирует.такую.
позицию,.при.которой.первый.игрок.готовится.поставить.
X
.(обычный.первый.ход.
в.игре)..
getTurn()
.указывает,.чья.очередь.находится.в.текущей.позиции,.
X
.или.
O
.
TTTBoard
.—.это.по.соглашению.неизменяемая.структура.данных:.структуры.
TTTBoard
.не.должны.изменяться..Вместо.этого.каждый.раз,.когда.необходимо.
сделать.ход,.будет.генерироваться.новая.структура.
TTTBoard
,.позиция.которой.
изменена.с.учетом.хода..Впоследствии.это.пригодится.в.алгоритме.поиска..
При.ветвлении.поиска.мы.не.сможем.случайно.изменить.положение.на.поле,.
начиная.с.которого.все.еще.анализируются.потенциально.возможные.ходы.
(листинг.8.5).
Допустимым.ходом.в.игре.является.любая.пустая.клетка..
getLegalMoves()
.ищет.
любые.пустые.клетки.на.поле.и.возвращает.их.список.(листинг.8.6).
8.2. Крестики-нолики
Do'stlaringiz bilan baham: |