Цель задания, над которым я сейчас работаю, для моего класса Data Structures - создать Quantum Tic Tac Toe с ИИ, который играет на победу.
В настоящее время у меня возникли проблемы с поиском наиболее эффективного способа представления состояний.
Обзор текущей структуры:
AbstractGame
- Имеет и управляет AbstractPlayers (game.nextPlayer () возвращает следующего игрока по int ID)
- Имеет и инициализирует AbstractBoard в начале игры
- Имеет GameTree (Завершено, если вызывается при инициализации, в противном случае не завершено)
AbstractBoard
- Имеет состояние, измерение и родительскую игру
- Является посредником между игроком и государством (переводит состояния из наборов строк в представление Point
- является государственным потребителем
AbstractPlayer
- является государственным производителем
- Имеет ConcreteEvaluationStrategy для оценки текущей платы
StateTransveralPool
- Предварительно вычисляет возможные трансверсалы "3-х состояний".
- Хранит их в HashMap, где Набор содержит следующие состояния для данного "3-состояния"
Штат
- Содержит 3 комплекта - набор X-ходов, O-ходов и доски
- Каждое целое число в наборе является строкой. Эти целочисленные значения можно использовать для получения следующего состояния строки из StateTransversalPool
ТАК, принцип
Каждая строка может быть представлена двоичными числами 000-111, где 0 означает открытый пробел, а 1 - закрытый пробел.
Итак, для неполной платы TTT:
From the Set<Integer> board perspective:
X_X R1 might be: 101
OO_ R2 might be: 110
X_X R3 might be: 101, where 1 is an open space, and 0 is a closed space
From the Set<Integer> xMoves perspective:
X_X R1 might be: 101
OO_ R2 might be: 000
X_X R3 might be: 101, where 1 is an X and 0 is not
From the Set<Integer> oMoves perspective:
X_X R1 might be: 000
OO_ R2 might be: 110
X_X R3 might be: 000, where 1 is an O and 0 is not
Тогда мы видим, что x {R1, R2, R3} & o {R1, R2, R3} => плата {R1, R2, R3}
Проблема заключается в быстрой генерации следующих состояний для GameTree. Если у меня есть игрок Max (x) с доской {R1, R2, R3}, то получить следующие состояния строк для R1, R2 и R3 просто ..
Set<Integer> R1nextStates = StateTransversalPool.get(R1);
Проблема в том, что мне нужно объединить каждое из этих состояний с R1 и R2.
Есть ли лучшая структура данных, кроме Set, которую я мог бы использовать? Есть ли более эффективный подход в целом? Я также нашел пункт <-> посредничество государства громоздким. Есть ли другой подход, который я мог бы попробовать там?
Спасибо!
Вот код для моего класса ConcretePlayer. Это может помочь объяснить, как игроки создают новые состояния с помощью ходов, используя StateProducer (который может стать StateFactory или StateBuilder).
public class ConcretePlayerGeneric extends AbstractPlayer {
@Override
public BinaryState makeMove() {
// Given a move and the current state, produce a new state
Point playerMove = super.strategy.evaluate(this);
BinaryState currentState = super.getInGame().getBoard().getState();
return StateProducer.getState(this, playerMove, currentState);
}
}
РЕДАКТИРОВАТЬ: я начинаю с обычного TTT и перехожу к квантовому TTT. Учитывая структуру, это должно быть так же просто, как создать несколько новых классов бетона и настроить некоторые вещи.