From a356d68c1c314cddbd987616f12291fc24bebf37 Mon Sep 17 00:00:00 2001 From: Yuchen Pei Date: Mon, 8 Jan 2018 16:22:46 +0100 Subject: project 9 checkpoint - no more compiler error - but still some bugs: - tiles get stuck - segment error (possibly due to deep copy?) --- projects/09/K/Board.jack | 130 ++++++++++++++++++++++++++++++----------------- 1 file changed, 83 insertions(+), 47 deletions(-) (limited to 'projects/09/K/Board.jack') 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; } } -- cgit v1.2.3