summaryrefslogtreecommitdiff
path: root/projects/11/K/Board.jack
diff options
context:
space:
mode:
Diffstat (limited to 'projects/11/K/Board.jack')
-rw-r--r--projects/11/K/Board.jack305
1 files changed, 305 insertions, 0 deletions
diff --git a/projects/11/K/Board.jack b/projects/11/K/Board.jack
new file mode 100644
index 0000000..49d42d5
--- /dev/null
+++ b/projects/11/K/Board.jack
@@ -0,0 +1,305 @@
+class Board {
+ field Array grid;
+ field int nTurn;
+ field int seed;
+
+ constructor Board new() {
+ var int i, j;
+ var Array t;
+ let grid = Array.new(4);
+ let i = 0;
+ while (i < 4) {
+ let j = 0;
+ let grid[i] = Array.new(4);
+ let t = grid[i];
+ while (j < 4) {
+ let t[j] = 32;
+ let j = j + 1;
+ }
+ let i = i + 1;
+ }
+ let t = grid[0];
+ let t[0] = 65;
+ let nTurn = 0;
+ let seed = 0;
+ return this;
+ }
+
+ method void arrange(Array xs, boolean isHorizontal) {
+ if (isHorizontal) {
+ do deepcopy(xs, grid);
+ } else {
+ do transpose(xs, grid);
+ }
+ do dispose4(xs);
+ return;
+ }
+
+
+ method void copy(Array xs, Array ys) {
+ var int i;
+ let i = 0;
+ while (i < 4) {
+ let ys[i] = xs[i];
+ let i = i + 1;
+ }
+ return;
+ }
+
+ method void deepcopy(Array xs, Array ys) {
+ var int i;
+ let i = 0;
+ while (i < 4) {
+ do copy(xs[i], ys[i]);
+ let i = i + 1;
+ }
+ return;
+ }
+
+ method void transpose(Array xs, Array ys) {
+ var int i, j;
+ var Array t, s;
+ let i = 0;
+ while (i < 4) {
+ let j = 0;
+ let t = ys[i];
+ while (j < 4) {
+ let s = xs[j];
+ let t[j] = s[i];
+ let j = j + 1;
+ }
+ let i = i + 1;
+ }
+ return;
+ }
+
+ method void dispose4(Array xs){
+ var int i;
+ var Array t;
+ let i = 0;
+ while (i < 4) {
+ let t = xs[i];
+ do t.dispose();
+ let i = i + 1;
+ }
+ do xs.dispose();
+ return;
+ }
+
+ method Array new4(){
+ var Array xs;
+ var int i;
+ let xs = Array.new(4);
+ let i = 0;
+ while (i < 4) {
+ let xs[i] = Array.new(4);
+ let i = i + 1;
+ }
+ return xs;
+ }
+
+ method Array getStrips(boolean isHorizontal){
+ var Array xs;
+ let xs = new4();
+ if (isHorizontal) {
+ do deepcopy(grid, xs);
+ } else {
+ do transpose(grid, xs);
+ }
+ return xs;
+ }
+
+ method Array align(Array xs, boolean left){
+ var int i, j;
+ let i = 0;
+ let j = 0;
+ if (left) {
+ while (i < 4) {
+ if (xs[i] > 64) {
+ let xs[j] = xs[i];
+ let j = j + 1;
+ }
+ let i = i + 1;
+ }
+ while (j < 4) {
+ let xs[j] = 32;
+ let j = j + 1;
+ }
+ } else {
+ while (i < 4) {
+ if (xs[3 - i] > 64) {
+ let xs[3 - j] = xs[3 - i];
+ let j = j + 1;
+ }
+ let i = i + 1;
+ }
+ while (j < 4) {
+ let xs[3 - j] = 32;
+ let j = j + 1;
+ }
+ }
+ return xs;
+ }
+
+ method Array reduce(Array xs, boolean left){
+ if ((xs[0] = xs[1]) & (xs[2] = xs[3]) & (xs[0] > 64) & (xs[2] > 64)) {
+ if (left) {
+ let xs[0] = xs[0] + 1;
+ let xs[1] = xs[2] + 1;
+ let xs[2] = 32;
+ let xs[3] = 32;
+ } else {
+ let xs[3] = xs[3] + 1;
+ let xs[2] = xs[1] + 1;
+ let xs[1] = 32;
+ let xs[0] = 32;
+ }
+ return xs;
+ }
+ if ((xs[0] = xs[1]) & (xs[0] > 64)) {
+ if (left) {
+ let xs[0] = xs[0] + 1;
+ let xs[1] = xs[2];
+ let xs[2] = xs[3];
+ let xs[3] = 32;
+ } else {
+ let xs[1] = xs[1] + 1;
+ let xs[0] = 32;
+ }
+ return xs;
+ }
+ if ((xs[2] = xs[3]) & (xs[2] > 64)) {
+ if (left) {
+ let xs[2] = xs[2] + 1;
+ let xs[3] = 32;
+ } else {
+ let xs[3] = xs[3] + 1;
+ let xs[2] = xs[1];
+ let xs[1] = xs[0];
+ let xs[0] = 32;
+ }
+ return xs;
+ }
+ if ((xs[1] = xs[2]) & (xs[1] > 64)) {
+ if (left) {
+ let xs[1] = xs[1] + 1;
+ let xs[2] = xs[3];
+ let xs[3] = 32;
+ } else {
+ let xs[2] = xs[2] + 1;
+ let xs[1] = xs[0];
+ let xs[0] = 32;
+ }
+ return xs;
+ }
+ return xs;
+ }
+
+ method void addTile(){
+ var Array t;
+ var int r, c, parity, newTile;
+ /*
+ let t = grid[1];
+ if (t[1] = 32) {
+ let t[1] = 65;
+ }
+ */
+ let seed = seed * 25173 + 13849;
+ if (seed < 0) {
+ let seed = - seed;
+ }
+
+ if (seed - (seed / 2 * 2) = 0) {
+ let parity = 1;
+ } else {
+ let parity = -1;
+ }
+
+ let seed = seed - (seed / 16 * 16);
+ let r = seed / 4;
+ let c = seed - (4 * r);
+ let t = grid[r];
+ let newTile = 65;
+
+ while (t[c] > 64){
+ let seed = seed + parity;
+ if (seed < 0) {
+ let seed = 15;
+ }
+ let seed = seed - (seed / 16 * 16);
+ let r = seed / 4;
+ let c = seed - (4 * r);
+ let t = grid[r];
+ let newTile = 131 - newTile;
+ }
+ let t[c] = newTile;
+ return;
+ }
+
+ method void transform(char dir){
+ var boolean isHorizontal, left;
+ var Array xs;
+ var int i;
+ if ((dir = 0) | (dir = 1)) {
+ let left = true;
+ } else {
+ let left = false;
+ }
+ if ((dir = 0) | (dir = 2)) {
+ let isHorizontal = true;
+ } else {
+ let isHorizontal = false;
+ }
+ let xs = getStrips(isHorizontal);
+ let i = 0;
+ while (i < 4) {
+ let xs[i] = reduce(align(xs[i], left), left);
+ let i = i + 1;
+ }
+ do arrange(xs, isHorizontal);
+ return;
+ }
+
+ method void next(char dir){
+ let nTurn = nTurn + 1;
+ do transform(dir);
+ do addTile();
+ return;
+ }
+
+ method void draw(){
+ var int r, c, i, j;
+ var Array t;
+ let r = 9;
+ let c = 30;
+
+ do Output.moveCursor(r - 1, c - 1);
+ do Output.printString("+----+");
+ do Output.moveCursor(r + 4, c - 1);
+ do Output.printString("+----+");
+
+ let i = 0;
+ while (i < 4) {
+ let j = 0;
+ do Output.moveCursor(r + i, c - 1);
+ do Output.printString("|");
+ let t = grid[i];
+ while (j < 4) {
+ do Output.printChar(t[j]);
+ let j = j + 1;
+ }
+ do Output.printString("|");
+ let i = i + 1;
+ }
+
+ do Output.moveCursor(r + 6, c - 2);
+ do Output.printString("Turn: ");
+ do Output.printInt(nTurn);
+ return;
+ }
+
+ method void dispose() {
+ do Memory.deAlloc(this);
+ return;
+ }
+}