8.2.
Крестики-нолики
227
@UnitTest(name = "Block Position")
public void
blockPosition() {
TTTPiece[] toBlockPosition =
new
TTTPiece[] {
TTTPiece.
X
, TTTPiece.
E
, TTTPiece.
E
,
TTTPiece.
E
, TTTPiece.
E
, TTTPiece.
O
,
TTTPiece.
E
, TTTPiece.
X
, TTTPiece.
O
};
TTTBoard testBoard2 =
new
TTTBoard(toBlockPosition, TTTPiece.
X
);
Integer answer2 = Minimax.
findBestMove
(testBoard2, 8);
assertEquality
(answer2, 2);
}
@UnitTest(name = "Hard Position")
public void
hardPosition() {
TTTPiece[] toWinHardPosition =
new
TTTPiece[] {
TTTPiece.
X
, TTTPiece.
E
, TTTPiece.
E
,
TTTPiece.
E
, TTTPiece.
E
, TTTPiece.
O
,
TTTPiece.
O
, TTTPiece.
X
, TTTPiece.
E
};
TTTBoard testBoard3 =
new
TTTBoard(toWinHardPosition, TTTPiece.
X
);
Integer answer3 = Minimax.
findBestMove
(testBoard3, 8);
assertEquality
(answer3, 1);
}
//
Запустите все методы, отмеченные аннотацией UnitTest
public void
runAllTests() {
for
(Method method :
this
.getClass().getMethods()) {
for
(UnitTest annotation :
method.getAnnotationsByType(UnitTest.
class
)) {
System.
out
.println("Running Test " + annotation.name());
try
{
method.invoke(
this
);
}
catch
(Exception e) {
e.printStackTrace();
}
System.
out
.println("____________________");
}
}
}
public static void
main(String[] args) {
new
TTTMinimaxTests().runAllTests();
}
}
Как.я.уже.говорил,.не.рекомендуется.вместо.
JUnit
.использовать.собственную.
платформу.модульного.тестирования..Тем.не.менее.это.не.так.уж.сложно.благодаря.
возможностям.отражения.в.Java..Каждый.метод,.представляющий.тест,.содержит.
специальную.аннотацию.под.названием.
UnitTest
,.определенную.в.верхней.части.
файла..Метод.
runAllTests()
.ищет.все.методы.с.этой.аннотацией.и.запускает.их.
вместе.с.некоторыми.полезными.распечатками..Метод.
assertEquality()
.прове-
ряет,.равны.ли.два.элемента,.и.если.нет,.выводит.их.на.печать..Хотя.определение.
собственной.инфраструктуры.модульного.тестирования.может.быть.не.очень.
228
Глава 8.
Состязательный поиск
хорошей.идеей,.интересно.посмотреть,.как.она.будет.работать..Чтобы.вывести.
нашу.структуру.на.следующий.уровень,.определим.базовый.класс,.включающий.
методы.
runAllTests()
.и.
assertEquality()
,.которые.могут.быть.расширены.дру-
гими.классами.тестирования.
Для.выполнения.всех.трех.тестов.запустите.файл.
TTTMinimaxTests.java
.
СОВЕТ
Для.реализации.минимакса.нет.необходимости.писать.много.кода.—.данный.алгоритм.
пригоден.для.гораздо.большего.количества.игр,.чем.просто.крестики-нолики..Если.вы.
планируете.внедрить.минимакс.для.другой.игры,.важно.настроиться.на.успех,.создавая.
структуры.данных,.которые.хорошо.работают.в.сочетании.с.минимаксом,.такие.как.
класс.Board..Распространенная.ошибка.тех,.кто.изучает.минимакс,.—.использование.
изменяемой. структуры. данных,. которая. изменяется. при. рекурсивном. вызове. ми-
нимакса.и.затем.не.может.быть.возвращена.в.исходное.состояние.для.последующих.
вызовов.алгоритма.
8.2.4. Разработка ИИ для игры в крестики-нолики
Теперь,.когда.у.нас.есть.все.необходимые.ингредиенты,.можно.легко.сделать.сле-
дующий.шаг.—.разработать.полностью.искусственного.противника,.способного.
пройти.всю.игру.в.крестики-нолики..Вместо.того.чтобы.оценивать.тестовую.
позицию,.ИИ.будет.оценивать.только.позицию,.генерируемую.на.каждом.ходе.
противника..В.следующем.фрагменте.короткого.кода.ИИ.играет.в.крестики-
нолики.против.оппонента-человека,.который.делает.первый.ход.(листинг.8.12).
Do'stlaringiz bilan baham: