diff options
| author | Alexander Pickering <alexandermpickering@gmail.com> | 2017-02-06 11:41:36 -0500 |
|---|---|---|
| committer | Alexander Pickering <alexandermpickering@gmail.com> | 2017-02-06 11:41:36 -0500 |
| commit | 89cdf3efb49335e7c07a68a5a64657eeec2288a6 (patch) | |
| tree | cdc0fd8165e65b1637fa54cac11c932acefc8a89 /projects/project3_kenken/KPuzzle.java | |
| download | coe0445-89cdf3efb49335e7c07a68a5a64657eeec2288a6.tar.gz coe0445-89cdf3efb49335e7c07a68a5a64657eeec2288a6.tar.bz2 coe0445-89cdf3efb49335e7c07a68a5a64657eeec2288a6.zip | |
Diffstat (limited to 'projects/project3_kenken/KPuzzle.java')
| -rw-r--r-- | projects/project3_kenken/KPuzzle.java | 264 |
1 files changed, 264 insertions, 0 deletions
diff --git a/projects/project3_kenken/KPuzzle.java b/projects/project3_kenken/KPuzzle.java new file mode 100644 index 0000000..41af390 --- /dev/null +++ b/projects/project3_kenken/KPuzzle.java @@ -0,0 +1,264 @@ +import java.util.Scanner; +import java.io.*; + +public class KPuzzle +{ + //a 2-d array of the cages, cages that are more than 1 square will have alieases on all of the squares. + KCage[] p;//The puzzle + int size; + boolean[] p2; //The possiblilities for every square - 3D + public KPuzzle() + { + + } + public KPuzzle(String filename) + { + parsePuzzle(filename); + makePossible(); + checkCages(); + } + private void checkCages() + { + for(int i = 0; i < p.length; i++) + { + KCage c = p[i]; + if(c.getNumCells() == 1) + { + Cell cell = c.getCell(0); + this.putNumber(cell.getX(),cell.getY(),c.getTargNumber()); + System.out.println("After putting " + c.getTargNumber() + " into (" + cell.getX() + "," + cell.getY() + ") Possibilities are:"); + this.printPossibilities(); + return; + } + } + } + public Cell getCell(int x, int y) + { + KCage k = p[y*size + x]; + for(int i = 0; i < k.getNumCells();i++) + { + Cell c = k.getCell(i); + if(c.getX() == x && c.getY() == y) + { + return c; + } + } + return null; + } + public boolean isComplete() + { + for(int i = 0; i < size; i++) + { + for(int j = 0; j < size; j++) + { + int possibilitiesForCell = 0; + for(int k = 0; k < size; k++) + { + if(p2[(i*size*size)+(j*size)+k]) + { + possibilitiesForCell++; + } + } + if(possibilitiesForCell != 1) + { + return false; + } + } + } + return true; + } + public boolean[] getPossibilities(int xn, int yn) + { + boolean[] output = new boolean[size]; + for(int i = 0; i < size; i++) + { + output[i] = p2[(yn*size*size)+(xn*size)+i]; + } + return output; + } + public void removePossibility(int xn, int yn, int num) + { + p2[(yn*size*size)+(xn*size)+num-1] = false; + } + public void addPossibility(int xn, int yn, int num) + { + p2[(yn*size*size)+(xn*size)+num-1] = true; + } + public void putNumber(int xn, int yn, int num) + { + System.out.println("putting " + num + " in (" + xn + "," + yn + ")"); + for(int y = 0; y < size; y++) + { + for(int z = 0; z < size; z++) + { + if(z == num-1) + { + //System.out.println("Setting (" + xn + "," + y + "," + z + ") to false"); + p2[(y*size*size)+(xn*size)+z] = false; + } + } + } + for(int x = 0; x < size; x++) + { + for(int z = 0; z < size; z++) + { + if(z == num-1) + p2[(yn*size*size)+(x*size)+z] = false; + } + } + for(int z = 0; z < size; z++) + { + p2[(yn*size*size)+(xn*size)+z] = false; + } + System.out.println("Setting (" + xn + "," + yn + "," + (num-1) + ") to true"); + p2[(yn*size*size)+(xn*size)+num-1] = true; + } + public void takeNumber(int xn, int yn) + { + int thisnum = -1; + for(int z = 0; z < size; z++) + { + if(p2[(yn*size*size)+(xn*size)+z]) + thisnum = z; + } + if(thisnum == -1) + { + System.out.println("I couldn't find a number there!"); + return; + } + for(int y = 0; y < size; y++) + { + for(int z = 0; z < size; z++) + { + if(z == thisnum) + { + System.out.println("Setting (" + xn + "," + y + "," + z + ") to true"); + p2[(y*size*size)+(xn*size)+z] = true; + } + } + } + for(int x = 0; x < size; x++) + { + for(int z = 0; z < size; z++) + { + if(z == thisnum) + p2[(yn*size*size)+(x*size)+z] = true; + } + } + for(int z = 0; z < size; z++) + { + p2[(yn*size*size)+(xn*size)+z] = true; + } + } + public void printPossibilities() + { + for(int y = 0; y < size; y++) + { + for(int x = 0; x < size; x++) + { + System.out.print("Possibilities for (" + x + "," + y + ") are: "); + for(int z = 0; z < size; z++) + { + if(p2[(y*size*size)+(x*size)+z]) + { + System.out.print(z+1); + } + } + System.out.println(""); + } + } + } + private void makePossible() + { + p2 = new boolean[size*size*size]; + //System.out.println("Makeing possibilities:"); + for(int i = 0; i < size; i++) + { + for(int j = 0; j < size; j++) + { + for(int k = 0; k < size; k++) + { + p2[(i*size*size)+(j*size)+k] = true; + //System.out.print(p2[(i*size*size)+(j*size)+k] + " "); + } + //System.out.print("\t"); + } + //System.out.println(""); + } + } + private void parsePuzzle(String filename) + { + Scanner s = null; + try + { + s = new Scanner(new FileInputStream(filename)); + } + catch (Exception e) + { + System.out.println("Something went terribly wrong!\n" + e); + } + size = Integer.parseInt(s.nextLine().replaceAll("\n","")); + p = new KCage[size*size]; + //System.out.println("Puzzle size: " + size + " Cages: " + p.length); + for(int i = 0; s.hasNextLine();i++) + { + String t1 = s.nextLine(); + //System.out.println("Praseing: " + t1); + String[] t2 = t1.split(","); + //System.out.println("Parts length: " + t2.length); + if(t2.length > 1) + { + Cell[] allcells = new Cell[Integer.parseInt(t2[2])]; + for(int j = 0; j < Integer.parseInt(t2[2]);j++) + { + String[] coords = s.nextLine().split(","); + allcells[j] = new Cell(Integer.parseInt(coords[0]),Integer.parseInt(coords[1])); + } + for(Cell c : allcells) + { + p[c.getY()*size + c.getX()] = new KCage(Integer.parseInt(t2[0]),getOp(t2[1]),allcells); + } + //p[i] = new KCage(Integer.parseInt(t2[0]),getOp(t2[1]),allcells); + //System.out.println("Created " + p[i]); + } + } + } + public KCage getCage(int i) + { + return p[i]; + } + public int getNumCages() + { + return p.length; + } + public String toString() + { + String output = "Puzzle{\n\t"; + if(p.length == 0) + return output+"}"; + output += p[0]; + for(int i = 1; i < p.length; i++) + { + output += ",\n\t"+p[i]; + } + return output + "\n}"; + } + private static Operator getOp(String s) + { + switch(s) + { + case "+": + return Operator.PLUS; + case "-": + return Operator.MINUS; + case "*": + return Operator.MULTIPLY; + case "/": + return Operator.DIVIDE; + case " ": + return Operator.NONE; + default: + return Operator.NULL; + } + } +}
\ No newline at end of file |
