Advertisement
zephyrtronium

Untitled

Apr 11th, 2012
51
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 7.04 KB | None | 0 0
  1. package us.zephyrtronium.tic3d;
  2.  
  3. public class Grid
  4. {
  5.     public static final Coord CENTER = new Coord(1, 1, 1);
  6.    
  7.     private Cell[][][] grid;
  8.    
  9.     public Grid() {
  10.         grid = new Cell[3][3][3];
  11.         for (Cell[][] plane: grid) {
  12.             plane[0] = new Cell[3];
  13.             plane[1] = new Cell[3];
  14.             plane[2] = new Cell[3];
  15.             for (Cell[] row: plane) {
  16.                 row[0] = new Cell();
  17.                 row[1] = new Cell();
  18.                 row[2] = new Cell();
  19.             }
  20.         }
  21.     }
  22.    
  23.     public int claim(Coord w, Player p) {
  24.         return grid[w.p][w.r][w.c].own(p) ? countLines(w, p) : -1;
  25.     }
  26.    
  27.     public int countLines(Coord w, Player p) {
  28.         int n = countLineX(w, p) + countLineY(w, p) + countLineZ(w, p);
  29.         if (w.equals(CENTER))
  30.             return 0;
  31.         if ((w.r+w.c & 1) == 0) {
  32.             if (w.r == w.c)
  33.                 n += countLineXY1(w, p);
  34.             else
  35.                 n += countLineXY2(w, p);
  36.         }
  37.         if ((w.p+w.c & 1) == 0) {
  38.             if (w.p == w.c)
  39.                 n += countLineXZ1(w, p);
  40.             else
  41.                 n += countLineXZ2(w, p);
  42.         }
  43.         if ((w.p+w.r & 1) == 0) {
  44.             if ((w.p+w.c & 1) == 0)
  45.                 n += countLineYZ1(w, p);
  46.             else
  47.                 n += countLineYZ2(w, p);
  48.         }
  49.         if ((w.p+w.r+w.c & 1) == 0) {
  50.             if (w.p == w.r) {
  51.                 if (w.p == w.c)
  52.                     n += countLineXYZ1(w, p);
  53.                 else
  54.                     n += countLineXYZ4(w, p);
  55.             } else {
  56.                 if (w.p == w.c)
  57.                     n += countLineXYZ2(w, p);
  58.                 else
  59.                     n += countLineXYZ3(w, p);
  60.             }
  61.         }
  62.         return n;
  63.     }
  64.    
  65.     private int countLineX(Coord w, Player p) {
  66.         switch (w.c) {
  67.         case 0:
  68.             return grid[w.p][w.r][1].ownedBy(p) && grid[w.p][w.r][2].ownedBy(p) ? 1 : 0;
  69.         case 1:
  70.             return grid[w.p][w.r][0].ownedBy(p) && grid[w.p][w.r][2].ownedBy(p) ? 1 : 0;
  71.         case 2:
  72.             return grid[w.p][w.r][0].ownedBy(p) && grid[w.p][w.r][1].ownedBy(p) ? 1 : 0;
  73.         }
  74.         throw (new AssertionError(w));
  75.     }
  76.    
  77.     private int countLineY(Coord w, Player p) {
  78.         switch (w.r) {
  79.         case 0:
  80.             return grid[w.p][1][w.c].ownedBy(p) && grid[w.p][2][w.c].ownedBy(p) ? 1 : 0;
  81.         case 1:
  82.             return grid[w.p][0][w.c].ownedBy(p) && grid[w.p][2][w.c].ownedBy(p) ? 1 : 0;
  83.         case 2:
  84.             return grid[w.p][0][w.c].ownedBy(p) && grid[w.p][1][w.c].ownedBy(p) ? 1 : 0;
  85.         }
  86.         throw (new AssertionError(w));
  87.     }
  88.    
  89.     private int countLineZ(Coord w, Player p) {
  90.         switch (w.r) {
  91.         case 0:
  92.             return grid[1][w.r][w.c].ownedBy(p) && grid[2][w.r][w.c].ownedBy(p) ? 1 : 0;
  93.         case 1:
  94.             return grid[0][w.r][w.c].ownedBy(p) && grid[2][w.r][w.c].ownedBy(p) ? 1 : 0;
  95.         case 2:
  96.             return grid[0][w.r][w.c].ownedBy(p) && grid[1][w.r][w.c].ownedBy(p) ? 1 : 0;
  97.         }
  98.         throw (new AssertionError(w));
  99.     }
  100.    
  101.     private int countLineXY1(Coord w, Player p) {
  102.         switch (w.c) {
  103.         case 0:
  104.             return grid[w.p][1][1].ownedBy(p) && grid[w.p][2][2].ownedBy(p) ? 1 : 0;
  105.         case 1:
  106.             return grid[w.p][0][0].ownedBy(p) && grid[w.p][2][2].ownedBy(p) ? 1 : 0;
  107.         case 2:
  108.             return grid[w.p][0][0].ownedBy(p) && grid[w.p][1][1].ownedBy(p) ? 1 : 0;
  109.         }
  110.         throw (new AssertionError(w));
  111.     }
  112.    
  113.     private int countLineXY2(Coord w, Player p) {
  114.         switch (w.c) {
  115.         case 0:
  116.             return grid[w.p][1][1].ownedBy(p) && grid[w.p][2][0].ownedBy(p) ? 1 : 0;
  117.         case 1:
  118.             return grid[w.p][0][2].ownedBy(p) && grid[w.p][2][0].ownedBy(p) ? 1 : 0;
  119.         case 2:
  120.             return grid[w.p][0][2].ownedBy(p) && grid[w.p][1][1].ownedBy(p) ? 1 : 0;
  121.         }
  122.         throw (new AssertionError(w));
  123.     }
  124.    
  125.     private int countLineXZ1(Coord w, Player p) {
  126.         switch (w.c) {
  127.         case 0:
  128.             return grid[1][w.r][1].ownedBy(p) && grid[2][w.r][2].ownedBy(p) ? 1 : 0;
  129.         case 1:
  130.             return grid[0][w.r][0].ownedBy(p) && grid[2][w.r][2].ownedBy(p) ? 1 : 0;
  131.         case 2:
  132.             return grid[0][w.r][0].ownedBy(p) && grid[1][w.r][1].ownedBy(p) ? 1 : 0;
  133.         }
  134.         throw (new AssertionError(w));
  135.     }
  136.    
  137.     private int countLineXZ2(Coord w, Player p) {
  138.         switch (w.c) {
  139.         case 0:
  140.             return grid[1][w.r][1].ownedBy(p) && grid[2][w.r][0].ownedBy(p) ? 1 : 0;
  141.         case 1:
  142.             return grid[0][w.r][2].ownedBy(p) && grid[2][w.r][0].ownedBy(p) ? 1 : 0;
  143.         case 2:
  144.             return grid[0][w.r][2].ownedBy(p) && grid[1][w.r][1].ownedBy(p) ? 1 : 0;
  145.         }
  146.         throw (new AssertionError(w));
  147.     }
  148.    
  149.     private int countLineYZ1(Coord w, Player p) {
  150.         switch (w.p) {
  151.         case 0:
  152.             return grid[1][1][w.c].ownedBy(p) && grid[2][2][w.c].ownedBy(p) ? 1 : 0;
  153.         case 1:
  154.             return grid[0][0][w.c].ownedBy(p) && grid[2][2][w.c].ownedBy(p) ? 1 : 0;
  155.         case 2:
  156.             return grid[0][0][w.c].ownedBy(p) && grid[1][1][w.c].ownedBy(p) ? 1 : 0;
  157.         }
  158.         throw (new AssertionError(w));
  159.     }
  160.    
  161.     private int countLineYZ2(Coord w, Player p) {
  162.         switch (w.p) {
  163.         case 0:
  164.             return grid[1][1][w.c].ownedBy(p) && grid[2][0][w.c].ownedBy(p) ? 1 : 0;
  165.         case 1:
  166.             return grid[0][2][w.c].ownedBy(p) && grid[2][0][w.c].ownedBy(p) ? 1 : 0;
  167.         case 2:
  168.             return grid[0][2][w.c].ownedBy(p) && grid[1][1][w.c].ownedBy(p) ? 1 : 0;
  169.         }
  170.         throw (new AssertionError(w));
  171.     }
  172.    
  173.     private int countLineXYZ1(Coord w, Player p) {
  174.         // All XYZ tests pass through (1, 1, 1), so it's assumed that this is skipped if that isn't owned.
  175.         // Furthermore, since (1, 1, 1) cannot be chosen, it is skipped.
  176.         switch (w.c) {
  177.         case 0:
  178.             return grid[2][2][2].ownedBy(p) ? 1 : 0;
  179.         case 2:
  180.             return grid[0][0][0].ownedBy(p) ? 1 : 0;
  181.         }
  182.         throw (new AssertionError(w));
  183.     }
  184.    
  185.     private int countLineXYZ2(Coord w, Player p) {
  186.         switch (w.c) {
  187.         case 0:
  188.             return grid[2][0][2].ownedBy(p) ? 1 : 0;
  189.         case 2:
  190.             return grid[0][2][0].ownedBy(p) ? 1 : 0;
  191.         }
  192.         throw (new AssertionError(w));
  193.     }
  194.    
  195.     private int countLineXYZ3(Coord w, Player p) {
  196.         switch (w.c) {
  197.         case 0:
  198.             return grid[0][2][2].ownedBy(p) ? 1 : 0;
  199.         case 2:
  200.             return grid[2][0][0].ownedBy(p) ? 1 : 0;
  201.         }
  202.         throw (new AssertionError(w));
  203.     }
  204.    
  205.     private int countLineXYZ4(Coord w, Player p) {
  206.         switch (w.c) {
  207.         case 0:
  208.             return grid[0][0][2].ownedBy(p) ? 1 : 0;
  209.         case 2:
  210.             return grid[2][2][0].ownedBy(p) ? 1 : 0;
  211.         }
  212.         throw (new AssertionError(w));
  213.     }
  214. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement