package model;
import java.util.ArrayList;
import java.util.List;
public class TreeStragety extends AbstractStrategy {
List<BoardNode>[] tree = new ArrayList[1];
public TreeStragety(Board board) {
super(board);
List<BoardNode> initList = new ArrayList<BoardNode>();
initList.add(new BoardNode(new Board(board), -1, -1));
tree[0] = initList;
}
@Override
public Hand nextSelect() {
// TODO 自動生成されたメソッド・スタブ
return null;
}
@Override
public Hand nextMove() {
// TODO 自動生成されたメソッド・スタブ
return null;
}
@Override
public void nextTree(boolean isFirst) {
List<BoardNode>[] newTree = new ArrayList[tree.length + 1];
for (int i = 0; i < tree.length; i++) {
newTree[i] = tree[i];
}
newTree[newTree.length - 1] = new ArrayList<BoardNode>();
tree = newTree;
// 新しいノード
for (int i = 0; i < tree[tree.length - 2].size(); i++) {
Board board = tree[tree.length - 2].get(i).getBoard();
AbstractPiece[][] mainBoard = board.getMainBoard();
List<AbstractPiece> inventory = board.getInventorys()[isFirst ? 0 : 1];
// mainBoard
for (int j = 0; j < mainBoard.length; j++) {
for (int k = 0; k < mainBoard[j].length; k++) {
if (mainBoard[j][k] != null && mainBoard[j][k].isFirst() == isFirst) {
boolean[][] movablePlace = board.getMobablePlace(mainBoard[j][k]);
for (int l = 0; l < movablePlace.length; l++) {
for (int m = 0; m < movablePlace[l].length; m++) {
if (movablePlace[l][m]) {
Board addBoard = new Board(board);
addBoard.select(new Hand(j * 3 + k, isFirst));
addBoard.move(new Hand(l * 3 + m, isFirst));
tree[tree.length - 1].add(new BoardNode(addBoard, i, -1));
}
}
}
}
}
}
// inventory
for (int j = 0; j < inventory.size(); j++) {
boolean[][] movablePlace = board.getMobablePlace(inventory.get(j));
for (int k = 0; k < movablePlace.length; k++) {
for (int l = 0; l < movablePlace[l].length; l++) {
if (movablePlace[k][l]) {
Board addBoard = new Board(board);
addBoard.select(new Hand(12 + 6 * (isFirst ? 0 : 1) + j, isFirst));
addBoard.move(new Hand(k * 3 + l, isFirst));
tree[tree.length - 1].add(new BoardNode(addBoard, i, -1));
}
}
}
}
}
}
@Override
public List<BoardNode>[] getTree() {
return tree;
}
}