import java.awt.*; public class StoneView extends Panel { StoneModel model; int nextSide = -1; public StoneView(int size) { model = new StoneModel(size); } public void init() { setBackground(Color.black); setLayout(new GridLayout(model.getSize(), model.getSize())); for (int y = 0; y < model.getSize(); y++) for (int x = 0; x < model.getSize(); x++) makeFieldView(x, y); newGame(); } protected final StoneFieldView makeFieldView(int x, int y) { StoneFieldView field = new StoneFieldView(x, y); add(field, y * model.getSize() + x); return field; } public StoneFieldView getFieldView(int x, int y) { return (StoneFieldView) getComponent(y * model.getSize() + x); } public StoneModel getModel() { return model; } public int getSide() { return nextSide; } public void clicked(StoneFieldView sf) { StoneModel oldModel = new StoneModel(model); int x = sf == null? 0 : sf.getX(); int y = sf == null? 0 : sf.getY(); if (model.makeMove(x, y, parentControler().getPlayer(), nextSide)) { nextSide *= -1; parentControler().status(nextSide == StoneModel.RED? "Red turn" : "Blue turn", StoneModel.FREE); if (parentControler().getPlayer() > 0) parentControler().status(StoneModel.playerNames[parentControler().getPlayer()] + " thinking", StoneModel.FREE); } else { model = oldModel; parentControler().status("Impossible move", StoneModel.FREE); }; updateStoneView(oldModel, model, true); if (model.isGameOver()) parentControler().status(StoneModel.playerNames[parentControler().getPlayer(model.getRed() > model.getBlue()? StoneModel.RED : StoneModel.BLUE)] + " won!", StoneModel.FREE); parentControler().status(Integer.toString(model.getRed()), StoneModel.RED); parentControler().status(Integer.toString(model.getBlue()), StoneModel.BLUE); } protected void updateStoneView(StoneModel s1, StoneModel s2, boolean boom) { for (int x = 0; x < model.getSize(); x++) for (int y = 0; y < model.getSize(); y++) if ((s1.getSum(x, y) != s2.getSum(x, y) && s1.getSum(x, y) * s2.getSum(x, y) <= 0) || s1.isRockOn(x, y) != s2.isRockOn(x, y)) getFieldView(x, y).dirty(boom); } public boolean handleEvent(Event evt) { if (evt.target instanceof StoneFieldView && evt.id == Event.MOUSE_UP) { if (model.isGameOver()) { parentControler().status("Start a new game", StoneModel.FREE); return true; }; clicked((StoneFieldView) evt.target); return true; }; return false; } public void newGame() { StoneModel oldModel = model; model = new StoneModel(oldModel.getSize()); updateStoneView(oldModel, model, false); nextSide = -1; parentControler().status("RED", StoneModel.RED); parentControler().status("BLUE", StoneModel.BLUE); parentControler().status("Select players and go!", StoneModel.FREE); } protected final Stones parentControler() { return (Stones) getParent(); } }