import java.util.Collection; import java.util.List; import cgsuite.util.Grid; public class FissionPosition extends cgsuite.plugin.AbstractGridGame { public FissionPosition(Grid grid) { this.grid = (Grid) grid.clone(Grid.BITS_PER_ENTRY_2); } public FissionPosition(String[] rows) throws cgsuite.plugin.MethodInvocationException { grid = cgsuite.plugin.PluginUtilities.stringsToGrid(rows, ".lr", Grid.BITS_PER_ENTRY_2); } private FissionPosition() { } public String toString() { return "Fission(" + grid.toString(".lr") + ")"; } public Collection getLeftOptions() { return getOptions(BLACK_STONE); } public Collection getRightOptions() { return getOptions(WHITE_STONE); } private Collection getOptions(int stoneType) { List options = new java.util.ArrayList(); for (int row = 0; row < grid.getNumRows(); row++) { for (int col = 0; col < grid.getNumColumns(); col++) { if (grid.getAt(row, col) == stoneType) { addOption(options, row, col, row-1, col, row+1, col); addOption(options, row, col, row, col-1, row, col+1); } } } return options; } private void addOption(List options, int oldRow, int oldCol, int newRow1, int newCol1, int newRow2, int newCol2) { if (newRow1 >= 0 && newCol1 >= 0 && newRow1 < grid.getNumRows() && newCol1 < grid.getNumColumns() && newRow2 >= 0 && newCol2 >= 0 && newRow2 < grid.getNumRows() && newCol2 < grid.getNumColumns() && grid.getAt(newRow1, newCol1) == EMPTY && grid.getAt(newRow2, newCol2) == EMPTY) { FissionPosition option = new FissionPosition(); option.grid = (Grid) grid.clone(); int type = grid.getAt(oldRow, oldCol); option.grid.putAt(oldRow, oldCol, EMPTY); option.grid.putAt(newRow1, newCol1, type); option.grid.putAt(newRow2, newCol2, type); options.add(option); } } public cgsuite.Game getInverse() { FissionPosition inverse = new FissionPosition(); inverse.grid = grid.mapEntries(COLOR_INVERSION_MAP); return inverse; } }