summaryrefslogtreecommitdiff
path: root/projects/09/K/Board.jack
diff options
context:
space:
mode:
Diffstat (limited to 'projects/09/K/Board.jack')
-rw-r--r--projects/09/K/Board.jack130
1 files changed, 83 insertions, 47 deletions
diff --git a/projects/09/K/Board.jack b/projects/09/K/Board.jack
index 9e3678e..c465f95 100644
--- a/projects/09/K/Board.jack
+++ b/projects/09/K/Board.jack
@@ -3,78 +3,106 @@ class Board {
field int nTurn;
constructor Board new() {
- let grid = Array.new(4);
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 grid[i][j] = 32;
+ let t[j] = 32;
+ let j = j + 1;
}
let i = i + 1;
}
- let grid[0][0] = 65;
+ let t = grid[0];
+ let t[0] = 65;
let nTurn = 0;
return this;
}
method void arrange(Array xs, boolean isHorizontal) {
if (isHorizontal) {
- let grid = copy(xs)
+ do deepcopy(xs, grid);
} else {
- let grid = transpose(xs)
+ do transpose(xs, grid);
}
+ do dispose4(xs);
+ return;
}
- method Array copy(Array xs) {
- var Array ys;
- let ys = Array.new(4);
+ 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 ys;
+ return;
}
- method Array deepcopy(Array xs) {
- var Array ys;
- let ys = Array.new(4);
+ method void deepcopy(Array xs, Array ys) {
var int i;
let i = 0;
while (i < 4) {
- let ys[i] = copy(xs[i]);
+ do copy(xs[i], ys[i]);
let i = i + 1;
}
- return ys;
+ return;
}
- mothod Array transpose(Array xs){
- var Array ys;
+ method void transpose(Array xs, Array ys) {
var int i, j;
+ var Array t, s;
let i = 0;
- let ys = Array.new(4);
while (i < 4) {
- let ys[i] = Array.new(4)
let j = 0;
+ let t = ys[i];
while (j < 4) {
- let ys[i][j] = xs[j][i];
+ let s = xs[j];
+ let t[j] = s[i];
let j = j + 1;
}
let i = i + 1;
}
- return ys;
+ 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 getStrip(boolean isHorizontal){
+ method Array getStrips(boolean isHorizontal){
var Array xs;
+ let xs = new4();
if (isHorizontal) {
- let xs = deepcopy(grid);
+ do deepcopy(grid, xs);
} else {
- let xs = transpose(grid);
+ do transpose(grid, xs);
}
return xs;
}
@@ -83,9 +111,9 @@ class Board {
var int i, j;
let i = 0;
let j = 0;
- if (left = true) {
+ if (left) {
while (i < 4) {
- if (xs[i] > 96) {
+ if (xs[i] > 64) {
let xs[j] = xs[i];
let j = j + 1;
}
@@ -97,7 +125,7 @@ class Board {
}
} else {
while (i < 4) {
- if (xs[3 - i] > 96) {
+ if (xs[3 - i] > 64) {
let xs[3 - j] = xs[3 - i];
let j = j + 1;
}
@@ -112,8 +140,8 @@ class Board {
}
method Array reduce(Array xs, boolean left){
- if ((xs[0] = xs[1]) & (xs[2] = xs[3])) {
- if (left = true) {
+ 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;
@@ -126,8 +154,8 @@ class Board {
}
return xs;
}
- if (xs[0] = xs[1]) {
- if (left = true) {
+ 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];
@@ -138,8 +166,8 @@ class Board {
}
return xs;
}
- if (xs[2] = xs[3]) {
- if (left = true) {
+ if ((xs[2] = xs[3]) & (xs[2] > 64)) {
+ if (left) {
let xs[2] = xs[2] + 1;
let xs[3] = 32;
} else {
@@ -150,14 +178,14 @@ class Board {
}
return xs;
}
- if (xs[1] = xs[2]) {
- if (left = true) {
+ 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[1] = xs[0];
let xs[0] = 32;
}
return xs;
@@ -166,43 +194,47 @@ class Board {
}
method void addTile(){
- var int x, y;
+ var int x, y, r, c;
var char z;
+ var Array t;
let x = nTurn;
let y = 23 * x * x + 79;
let x = y - (y / 16 * 16);
let r = x / 4;
let c = x - (r * 4);
- let z = 97;
- while (grid[r][c] > 96) {
+ let z = 65;
+ let t = grid[r];
+ while (t[c] > 64) {
let y = 23 * x * x + 79;
let x = y - (y / 16 * 16);
let r = x / 4;
let c = x - (r * 4);
- let z = 195 - z;
+ let z = 131 - z;
+ let t = grid[r];
}
- let grid[r][c] = z;
+ let t[c] = z;
return;
}
method void transform(char dir){
var boolean isHorizontal, left;
- if ((dir = 0) or (dir = 1)) {
+ var Array xs;
+ var int i;
+ if ((dir = 0) | (dir = 1)) {
let left = true;
} else {
let left = false;
}
- if ((dir = 0) or (dir = 2)) {
+ if ((dir = 0) | (dir = 2)) {
let isHorizontal = true;
} else {
let isHorizontal = false;
}
- var Array xs;
- let xs = getStrip(isHorizontal);
- var int i;
+ let xs = getStrips(isHorizontal);
let i = 0;
while (i < 4) {
- xs[i] = reduce(align(xs[i], left), left);
+ let xs[i] = reduce(align(xs[i], left), left);
+ let i = i + 1;
}
do arrange(xs, isHorizontal);
return;
@@ -217,21 +249,25 @@ class Board {
method void draw(){
var int r, c, i, j;
+ var Array t;
let r = 9;
let c = 30;
let i = 0;
while (i < 4) {
let j = 0;
do Output.moveCursor(r + i, c);
+ let t = grid[i];
while (j < 4) {
- do Output.printChar(grid[i][j]);
+ do Output.printChar(t[j]);
let j = j + 1;
}
let i = i + 1;
}
+ return;
}
method void dispose() {
do Memory.deAlloc(this);
+ return;
}
}