Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package us.zephyrtronium.tic3d;
- public class Grid
- {
- public static final Coord CENTER = new Coord(1, 1, 1);
- private Cell[][][] grid;
- public Grid() {
- grid = new Cell[3][3][3];
- for (Cell[][] plane: grid) {
- plane[0] = new Cell[3];
- plane[1] = new Cell[3];
- plane[2] = new Cell[3];
- for (Cell[] row: plane) {
- row[0] = new Cell();
- row[1] = new Cell();
- row[2] = new Cell();
- }
- }
- }
- public int claim(Coord w, Player p) {
- return grid[w.p][w.r][w.c].own(p) ? countLines(w, p) : -1;
- }
- public int countLines(Coord w, Player p) {
- int n = countLineX(w, p) + countLineY(w, p) + countLineZ(w, p);
- if (w.equals(CENTER))
- return 0;
- if ((w.r+w.c & 1) == 0) {
- if (w.r == w.c)
- n += countLineXY1(w, p);
- else
- n += countLineXY2(w, p);
- }
- if ((w.p+w.c & 1) == 0) {
- if (w.p == w.c)
- n += countLineXZ1(w, p);
- else
- n += countLineXZ2(w, p);
- }
- if ((w.p+w.r & 1) == 0) {
- if ((w.p+w.c & 1) == 0)
- n += countLineYZ1(w, p);
- else
- n += countLineYZ2(w, p);
- }
- if ((w.p+w.r+w.c & 1) == 0) {
- if (w.p == w.r) {
- if (w.p == w.c)
- n += countLineXYZ1(w, p);
- else
- n += countLineXYZ4(w, p);
- } else {
- if (w.p == w.c)
- n += countLineXYZ2(w, p);
- else
- n += countLineXYZ3(w, p);
- }
- }
- return n;
- }
- private int countLineX(Coord w, Player p) {
- switch (w.c) {
- case 0:
- return grid[w.p][w.r][1].ownedBy(p) && grid[w.p][w.r][2].ownedBy(p) ? 1 : 0;
- case 1:
- return grid[w.p][w.r][0].ownedBy(p) && grid[w.p][w.r][2].ownedBy(p) ? 1 : 0;
- case 2:
- return grid[w.p][w.r][0].ownedBy(p) && grid[w.p][w.r][1].ownedBy(p) ? 1 : 0;
- }
- throw (new AssertionError(w));
- }
- private int countLineY(Coord w, Player p) {
- switch (w.r) {
- case 0:
- return grid[w.p][1][w.c].ownedBy(p) && grid[w.p][2][w.c].ownedBy(p) ? 1 : 0;
- case 1:
- return grid[w.p][0][w.c].ownedBy(p) && grid[w.p][2][w.c].ownedBy(p) ? 1 : 0;
- case 2:
- return grid[w.p][0][w.c].ownedBy(p) && grid[w.p][1][w.c].ownedBy(p) ? 1 : 0;
- }
- throw (new AssertionError(w));
- }
- private int countLineZ(Coord w, Player p) {
- switch (w.r) {
- case 0:
- return grid[1][w.r][w.c].ownedBy(p) && grid[2][w.r][w.c].ownedBy(p) ? 1 : 0;
- case 1:
- return grid[0][w.r][w.c].ownedBy(p) && grid[2][w.r][w.c].ownedBy(p) ? 1 : 0;
- case 2:
- return grid[0][w.r][w.c].ownedBy(p) && grid[1][w.r][w.c].ownedBy(p) ? 1 : 0;
- }
- throw (new AssertionError(w));
- }
- private int countLineXY1(Coord w, Player p) {
- switch (w.c) {
- case 0:
- return grid[w.p][1][1].ownedBy(p) && grid[w.p][2][2].ownedBy(p) ? 1 : 0;
- case 1:
- return grid[w.p][0][0].ownedBy(p) && grid[w.p][2][2].ownedBy(p) ? 1 : 0;
- case 2:
- return grid[w.p][0][0].ownedBy(p) && grid[w.p][1][1].ownedBy(p) ? 1 : 0;
- }
- throw (new AssertionError(w));
- }
- private int countLineXY2(Coord w, Player p) {
- switch (w.c) {
- case 0:
- return grid[w.p][1][1].ownedBy(p) && grid[w.p][2][0].ownedBy(p) ? 1 : 0;
- case 1:
- return grid[w.p][0][2].ownedBy(p) && grid[w.p][2][0].ownedBy(p) ? 1 : 0;
- case 2:
- return grid[w.p][0][2].ownedBy(p) && grid[w.p][1][1].ownedBy(p) ? 1 : 0;
- }
- throw (new AssertionError(w));
- }
- private int countLineXZ1(Coord w, Player p) {
- switch (w.c) {
- case 0:
- return grid[1][w.r][1].ownedBy(p) && grid[2][w.r][2].ownedBy(p) ? 1 : 0;
- case 1:
- return grid[0][w.r][0].ownedBy(p) && grid[2][w.r][2].ownedBy(p) ? 1 : 0;
- case 2:
- return grid[0][w.r][0].ownedBy(p) && grid[1][w.r][1].ownedBy(p) ? 1 : 0;
- }
- throw (new AssertionError(w));
- }
- private int countLineXZ2(Coord w, Player p) {
- switch (w.c) {
- case 0:
- return grid[1][w.r][1].ownedBy(p) && grid[2][w.r][0].ownedBy(p) ? 1 : 0;
- case 1:
- return grid[0][w.r][2].ownedBy(p) && grid[2][w.r][0].ownedBy(p) ? 1 : 0;
- case 2:
- return grid[0][w.r][2].ownedBy(p) && grid[1][w.r][1].ownedBy(p) ? 1 : 0;
- }
- throw (new AssertionError(w));
- }
- private int countLineYZ1(Coord w, Player p) {
- switch (w.p) {
- case 0:
- return grid[1][1][w.c].ownedBy(p) && grid[2][2][w.c].ownedBy(p) ? 1 : 0;
- case 1:
- return grid[0][0][w.c].ownedBy(p) && grid[2][2][w.c].ownedBy(p) ? 1 : 0;
- case 2:
- return grid[0][0][w.c].ownedBy(p) && grid[1][1][w.c].ownedBy(p) ? 1 : 0;
- }
- throw (new AssertionError(w));
- }
- private int countLineYZ2(Coord w, Player p) {
- switch (w.p) {
- case 0:
- return grid[1][1][w.c].ownedBy(p) && grid[2][0][w.c].ownedBy(p) ? 1 : 0;
- case 1:
- return grid[0][2][w.c].ownedBy(p) && grid[2][0][w.c].ownedBy(p) ? 1 : 0;
- case 2:
- return grid[0][2][w.c].ownedBy(p) && grid[1][1][w.c].ownedBy(p) ? 1 : 0;
- }
- throw (new AssertionError(w));
- }
- private int countLineXYZ1(Coord w, Player p) {
- // All XYZ tests pass through (1, 1, 1), so it's assumed that this is skipped if that isn't owned.
- // Furthermore, since (1, 1, 1) cannot be chosen, it is skipped.
- switch (w.c) {
- case 0:
- return grid[2][2][2].ownedBy(p) ? 1 : 0;
- case 2:
- return grid[0][0][0].ownedBy(p) ? 1 : 0;
- }
- throw (new AssertionError(w));
- }
- private int countLineXYZ2(Coord w, Player p) {
- switch (w.c) {
- case 0:
- return grid[2][0][2].ownedBy(p) ? 1 : 0;
- case 2:
- return grid[0][2][0].ownedBy(p) ? 1 : 0;
- }
- throw (new AssertionError(w));
- }
- private int countLineXYZ3(Coord w, Player p) {
- switch (w.c) {
- case 0:
- return grid[0][2][2].ownedBy(p) ? 1 : 0;
- case 2:
- return grid[2][0][0].ownedBy(p) ? 1 : 0;
- }
- throw (new AssertionError(w));
- }
- private int countLineXYZ4(Coord w, Player p) {
- switch (w.c) {
- case 0:
- return grid[0][0][2].ownedBy(p) ? 1 : 0;
- case 2:
- return grid[2][2][0].ownedBy(p) ? 1 : 0;
- }
- throw (new AssertionError(w));
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement