// BoardUpdater.java
package net.sf.gogui.game;
import java.util.ArrayList;
import net.sf.gogui.go.Board;
import net.sf.gogui.go.ConstPointList;
import net.sf.gogui.go.GoColor;
import static net.sf.gogui.go.GoColor.BLACK;
import static net.sf.gogui.go.GoColor.WHITE;
import static net.sf.gogui.go.GoColor.EMPTY;
import net.sf.gogui.go.GoPoint;
import net.sf.gogui.go.Move;
import net.sf.gogui.go.PointList;
/** Updates a go.Board to a node in a GameTree. */
public class BoardUpdater
{
public BoardUpdater()
{
m_nodes = new ArrayList<ConstNode>(400);
}
public void update(ConstGameTree tree, ConstNode currentNode, Board board)
{
ConstGameInfo info = tree.getGameInfoConst(currentNode);
int size = tree.getBoardSize();
int handicap = info.getHandicap();
NodeUtil.getPathToRoot(currentNode, m_nodes);
board.init(size);
boolean isFirstPlacement = true;
for (int i = m_nodes.size() - 1; i >= 0; --i)
{
ConstNode node = (ConstNode)m_nodes.get(i);
GoColor player = node.getPlayer();
if (node.hasSetup())
{
ConstPointList setupBlack = node.getSetup(BLACK);
ConstPointList setupWhite = node.getSetup(WHITE);
ConstPointList setupEmpty = node.getSetup(EMPTY);
if (isFirstPlacement && setupBlack.size() == handicap
&& setupWhite.size() == 0 && setupEmpty.size() == 0)
board.setupHandicap(setupBlack);
else
{
PointList black = new PointList();
PointList white = new PointList();
for (GoPoint p : board)
{
if (board.getColor(p) == BLACK)
black.add(p);
else if (board.getColor(p) == WHITE)
white.add(p);
}
for (GoPoint p : setupBlack)
{
white.remove(p);
if (! black.contains(p))
black.add(p);
}
for (GoPoint p : setupWhite)
{
black.remove(p);
if (! white.contains(p))
white.add(p);
}
for (GoPoint p : setupEmpty)
{
black.remove(p);
white.remove(p);
}
board.setup(black, white, player);
}
isFirstPlacement = false;
}
else if (player != null)
board.setToMove(player);
Move move = node.getMove();
if (move != null)
{
board.play(move);
isFirstPlacement = false;
}
}
}
/** Local variable used in update.
Member variable for avoiding frequent new memory allocations. */
private final ArrayList<ConstNode> m_nodes;
}