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.jack250
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;
}