diff options
Diffstat (limited to 'projects/09/K/Board.jack')
-rw-r--r-- | projects/09/K/Board.jack | 250 |
1 files changed, 139 insertions, 111 deletions
diff --git a/projects/09/K/Board.jack b/projects/09/K/Board.jack index 49d42d5..e9ed8a6 100644 --- a/projects/09/K/Board.jack +++ b/projects/09/K/Board.jack @@ -1,115 +1,80 @@ +/** +improvments: +- do in place transposition +- add a static string boardBar = "+----+" +- change printString("|") to printChar +- change the grid to static variable? +*/ class Board { field Array grid; - field int nTurn; - field int seed; + field int nTurn, seed, status; // status: 0: begin game; 1: in game; 2: lose; 3: win; + static String boardBar, strLost, strCont, strGameOver, strWon; constructor Board new() { - var int i, j; - var Array t; + var int i; 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; + do initBoard(); 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; - } + function void init() { + let boardBar = "+----+"; + let strLost = "You lost!"; + let strWon = "You won!"; + let strCont = "Press any key to continue"; + let strGameOver = "Game over!"; return; } - method void transpose(Array xs, Array ys) { + method void initBoard() { var int i, j; - var Array t, s; + var Array t; let i = 0; while (i < 4) { let j = 0; - let t = ys[i]; + let t = grid[i]; while (j < 4) { - let s = xs[j]; - let t[j] = s[i]; + let t[j] = 32; let j = j + 1; } let i = i + 1; } + let t = grid[0]; + let t[0] = 65; + let nTurn = 0; + let status = 0; 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 void transpose() { + do exch(0, 1); + do exch(0, 2); + do exch(0, 3); + do exch(1, 2); + do exch(1, 3); + do exch(2, 3); + return; } - 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 void exch(int i, int j){ + var int t; + var Array s1, s2; + let s1 = grid[i]; + let s2 = grid[j]; + let t = s1[j]; + let s1[j] = s2[i]; + let s2[i] = t; + return; } - method Array align(Array xs, boolean left){ + method void align(Array xs, boolean left){ var int i, j; let i = 0; let j = 0; @@ -138,10 +103,10 @@ class Board { let j = j + 1; } } - return xs; + return; } - method Array reduce(Array xs, boolean left){ + method void 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; @@ -154,7 +119,7 @@ class Board { let xs[1] = 32; let xs[0] = 32; } - return xs; + return; } if ((xs[0] = xs[1]) & (xs[0] > 64)) { if (left) { @@ -166,7 +131,7 @@ class Board { let xs[1] = xs[1] + 1; let xs[0] = 32; } - return xs; + return; } if ((xs[2] = xs[3]) & (xs[2] > 64)) { if (left) { @@ -178,7 +143,7 @@ class Board { let xs[1] = xs[0]; let xs[0] = 32; } - return xs; + return; } if ((xs[1] = xs[2]) & (xs[1] > 64)) { if (left) { @@ -190,9 +155,9 @@ class Board { let xs[1] = xs[0]; let xs[0] = 32; } - return xs; + return; } - return xs; + return; } method void addTile(){ @@ -204,6 +169,11 @@ class Board { let t[1] = 65; } */ + + if (~(status = 1)) { + return; + } + let seed = seed * 25173 + 13849; if (seed < 0) { let seed = - seed; @@ -237,8 +207,7 @@ class Board { } method void transform(char dir){ - var boolean isHorizontal, left; - var Array xs; + var boolean isVertical, left; var int i; if ((dir = 0) | (dir = 1)) { let left = true; @@ -246,55 +215,114 @@ class Board { let left = false; } if ((dir = 0) | (dir = 2)) { - let isHorizontal = true; + let isVertical = false; } else { - let isHorizontal = false; + let isVertical = true; + } + if (isVertical) { + do transpose(); } - let xs = getStrips(isHorizontal); let i = 0; while (i < 4) { - let xs[i] = reduce(align(xs[i], left), left); + do align(grid[i], left); + do reduce(grid[i], left); let i = i + 1; } - do arrange(xs, isHorizontal); + if (isVertical) { + do transpose(); + } return; } - method void next(char dir){ + method void next(int dir){ let nTurn = nTurn + 1; do transform(dir); - do addTile(); + do updateStatus(); return; } - method void draw(){ - var int r, c, i, j; - var Array t; - let r = 9; - let c = 30; + method int getStatus(){ + return status; + } - do Output.moveCursor(r - 1, c - 1); - do Output.printString("+----+"); - do Output.moveCursor(r + 4, c - 1); - do Output.printString("+----+"); + method void setStatus(int x){ + let status = x; + return; + } + method void updateStatus(){ + var int i, j; + var Array r; let i = 0; while (i < 4) { + let r = grid[i]; 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]); + if (r[j] = 75) { + let status = 3; + return; + } + if (r[j] = 32) { + let status = 1; + return; + } let j = j + 1; } - do Output.printString("|"); let i = i + 1; } + let status = 2; + return; + } + + method void draw(){ + var int r, c, i, j; + var Array t; + let r = 9; + let c = 30; + + if (status = 0) { + do Output.moveCursor(r - 1, c - 1); + do Output.printChar(75); + do Output.moveCursor(r + 1, c - 1); + do Output.printString(strCont); + } else { if (status = 2) { + do Output.moveCursor(r - 1, c - 1); + do Output.printString(strGameOver); + do Output.moveCursor(r + 1, c - 1); + do Output.printString(strLost); + do Output.moveCursor(r + 3, c - 1); + do Output.printString(strCont); + } else { if (status = 3) { + do Output.moveCursor(r - 1, c - 1); + do Output.printString(strGameOver); + do Output.moveCursor(r + 1, c - 1); + do Output.printString(strWon); + do Output.moveCursor(r + 3, c - 1); + do Output.printString(strCont); + } else { + do Output.moveCursor(r - 1, c - 1); + do Output.printString(boardBar); + do Output.moveCursor(r + 4, c - 1); + do Output.printString(boardBar); + + let i = 0; + while (i < 4) { + let j = 0; + do Output.moveCursor(r + i, c - 1); + do Output.printChar(124); // 124 is | + let t = grid[i]; + while (j < 4) { + do Output.printChar(t[j]); + let j = j + 1; + } + do Output.printChar(124); + let i = i + 1; + } - do Output.moveCursor(r + 6, c - 2); - do Output.printString("Turn: "); - do Output.printInt(nTurn); + do Output.moveCursor(r + 6, c - 2); + do Output.printString("Turn: "); + do Output.printInt(nTurn); + }}} return; } |