summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYuchen Pei <me@ypei.me>2018-01-18 12:00:28 +0100
committerYuchen Pei <me@ypei.me>2018-01-18 12:00:28 +0100
commit84445f00a572497784fb6d97e23bdd1e655f6e5d (patch)
treebe8fdd8993a03e17ddb81e59cc1a02b25d46f4fe
parent01da7177bd2f4d83e8916540a69d8b2690b52bbb (diff)
refactored K
- added title, win, and lose frames - reduced heap usage
-rw-r--r--projects/09/K/Board.jack250
-rw-r--r--projects/09/K/Board.vm728
-rw-r--r--projects/09/K/KGame.jack39
-rw-r--r--projects/09/K/KGame.vm129
-rw-r--r--projects/09/K/Main.jack1
-rw-r--r--projects/09/K/Main.vm2
6 files changed, 742 insertions, 407 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;
}
diff --git a/projects/09/K/Board.vm b/projects/09/K/Board.vm
index 3b5983c..ba236e1 100644
--- a/projects/09/K/Board.vm
+++ b/projects/09/K/Board.vm
@@ -1,5 +1,5 @@
-function Board.new 3
-push constant 3
+function Board.new 1
+push constant 4
call Memory.alloc 1
pop pointer 0
push constant 4
@@ -13,8 +13,6 @@ push constant 4
lt
not
if-goto WHILE_END0
-push constant 0
-pop local 1
push local 0
push this 0
add
@@ -25,6 +23,166 @@ pop pointer 1
push temp 0
pop that 0
push local 0
+push constant 1
+add
+pop local 0
+goto WHILE_EXP0
+label WHILE_END0
+push pointer 0
+call Board.initBoard 1
+pop temp 0
+push constant 0
+pop this 2
+push pointer 0
+return
+function Board.init 0
+push constant 6
+call String.new 1
+push constant 43
+call String.appendChar 2
+push constant 45
+call String.appendChar 2
+push constant 45
+call String.appendChar 2
+push constant 45
+call String.appendChar 2
+push constant 45
+call String.appendChar 2
+push constant 43
+call String.appendChar 2
+pop static 0
+push constant 9
+call String.new 1
+push constant 89
+call String.appendChar 2
+push constant 111
+call String.appendChar 2
+push constant 117
+call String.appendChar 2
+push constant 32
+call String.appendChar 2
+push constant 108
+call String.appendChar 2
+push constant 111
+call String.appendChar 2
+push constant 115
+call String.appendChar 2
+push constant 116
+call String.appendChar 2
+push constant 33
+call String.appendChar 2
+pop static 1
+push constant 8
+call String.new 1
+push constant 89
+call String.appendChar 2
+push constant 111
+call String.appendChar 2
+push constant 117
+call String.appendChar 2
+push constant 32
+call String.appendChar 2
+push constant 119
+call String.appendChar 2
+push constant 111
+call String.appendChar 2
+push constant 110
+call String.appendChar 2
+push constant 33
+call String.appendChar 2
+pop static 4
+push constant 25
+call String.new 1
+push constant 80
+call String.appendChar 2
+push constant 114
+call String.appendChar 2
+push constant 101
+call String.appendChar 2
+push constant 115
+call String.appendChar 2
+push constant 115
+call String.appendChar 2
+push constant 32
+call String.appendChar 2
+push constant 97
+call String.appendChar 2
+push constant 110
+call String.appendChar 2
+push constant 121
+call String.appendChar 2
+push constant 32
+call String.appendChar 2
+push constant 107
+call String.appendChar 2
+push constant 101
+call String.appendChar 2
+push constant 121
+call String.appendChar 2
+push constant 32
+call String.appendChar 2
+push constant 116
+call String.appendChar 2
+push constant 111
+call String.appendChar 2
+push constant 32
+call String.appendChar 2
+push constant 99
+call String.appendChar 2
+push constant 111
+call String.appendChar 2
+push constant 110
+call String.appendChar 2
+push constant 116
+call String.appendChar 2
+push constant 105
+call String.appendChar 2
+push constant 110
+call String.appendChar 2
+push constant 117
+call String.appendChar 2
+push constant 101
+call String.appendChar 2
+pop static 2
+push constant 10
+call String.new 1
+push constant 71
+call String.appendChar 2
+push constant 97
+call String.appendChar 2
+push constant 109
+call String.appendChar 2
+push constant 101
+call String.appendChar 2
+push constant 32
+call String.appendChar 2
+push constant 111
+call String.appendChar 2
+push constant 118
+call String.appendChar 2
+push constant 101
+call String.appendChar 2
+push constant 114
+call String.appendChar 2
+push constant 33
+call String.appendChar 2
+pop static 3
+push constant 0
+return
+function Board.initBoard 3
+push argument 0
+pop pointer 0
+push constant 0
+pop local 0
+label WHILE_EXP0
+push local 0
+push constant 4
+lt
+not
+if-goto WHILE_END0
+push constant 0
+pop local 1
+push local 0
push this 0
add
pop pointer 1
@@ -73,134 +231,70 @@ pop that 0
push constant 0
pop this 1
push constant 0
-pop this 2
-push pointer 0
+pop this 3
+push constant 0
return
-function Board.arrange 0
+function Board.transpose 0
push argument 0
pop pointer 0
-push argument 2
-if-goto IF_TRUE0
-goto IF_FALSE0
-label IF_TRUE0
push pointer 0
-push argument 1
-push this 0
-call Board.deepcopy 3
+push constant 0
+push constant 1
+call Board.exch 3
pop temp 0
-goto IF_END0
-label IF_FALSE0
push pointer 0
-push argument 1
-push this 0
-call Board.transpose 3
+push constant 0
+push constant 2
+call Board.exch 3
pop temp 0
-label IF_END0
push pointer 0
-push argument 1
-call Board.dispose4 2
-pop temp 0
-push constant 0
-return
-function Board.copy 1
-push argument 0
-pop pointer 0
push constant 0
-pop local 0
-label WHILE_EXP0
-push local 0
-push constant 4
-lt
-not
-if-goto WHILE_END0
-push local 0
-push argument 2
-add
-push local 0
-push argument 1
-add
-pop pointer 1
-push that 0
+push constant 3
+call Board.exch 3
pop temp 0
-pop pointer 1
-push temp 0
-pop that 0
-push local 0
+push pointer 0
push constant 1
-add
-pop local 0
-goto WHILE_EXP0
-label WHILE_END0
+push constant 2
+call Board.exch 3
+pop temp 0
+push pointer 0
+push constant 1
+push constant 3
+call Board.exch 3
+pop temp 0
+push pointer 0
+push constant 2
+push constant 3
+call Board.exch 3
+pop temp 0
push constant 0
return
-function Board.deepcopy 1
+function Board.exch 3
push argument 0
pop pointer 0
-push constant 0
-pop local 0
-label WHILE_EXP0
-push local 0
-push constant 4
-lt
-not
-if-goto WHILE_END0
-push pointer 0
-push local 0
push argument 1
+push this 0
add
pop pointer 1
push that 0
-push local 0
-push argument 2
-add
-pop pointer 1
-push that 0
-call Board.copy 3
-pop temp 0
-push local 0
-push constant 1
-add
-pop local 0
-goto WHILE_EXP0
-label WHILE_END0
-push constant 0
-return
-function Board.transpose 4
-push argument 0
-pop pointer 0
-push constant 0
-pop local 0
-label WHILE_EXP0
-push local 0
-push constant 4
-lt
-not
-if-goto WHILE_END0
-push constant 0
pop local 1
-push local 0
push argument 2
+push this 0
add
pop pointer 1
push that 0
pop local 2
-label WHILE_EXP1
-push local 1
-push constant 4
-lt
-not
-if-goto WHILE_END1
+push argument 2
push local 1
-push argument 1
add
pop pointer 1
push that 0
-pop local 3
+pop local 0
+push argument 2
push local 1
-push local 2
add
-push local 0
-push local 3
+push argument 1
+push local 2
add
pop pointer 1
push that 0
@@ -208,106 +302,15 @@ pop temp 0
pop pointer 1
push temp 0
pop that 0
-push local 1
-push constant 1
-add
-pop local 1
-goto WHILE_EXP1
-label WHILE_END1
-push local 0
-push constant 1
-add
-pop local 0
-goto WHILE_EXP0
-label WHILE_END0
-push constant 0
-return
-function Board.dispose4 2
-push argument 0
-pop pointer 0
-push constant 0
-pop local 0
-label WHILE_EXP0
-push local 0
-push constant 4
-lt
-not
-if-goto WHILE_END0
-push local 0
push argument 1
+push local 2
add
-pop pointer 1
-push that 0
-pop local 1
-push local 1
-call Array.dispose 1
-pop temp 0
push local 0
-push constant 1
-add
-pop local 0
-goto WHILE_EXP0
-label WHILE_END0
-push argument 1
-call Array.dispose 1
-pop temp 0
-push constant 0
-return
-function Board.new4 2
-push argument 0
-pop pointer 0
-push constant 4
-call Array.new 1
-pop local 0
-push constant 0
-pop local 1
-label WHILE_EXP0
-push local 1
-push constant 4
-lt
-not
-if-goto WHILE_END0
-push local 1
-push local 0
-add
-push constant 4
-call Array.new 1
pop temp 0
pop pointer 1
push temp 0
pop that 0
-push local 1
-push constant 1
-add
-pop local 1
-goto WHILE_EXP0
-label WHILE_END0
-push local 0
-return
-function Board.getStrips 1
-push argument 0
-pop pointer 0
-push pointer 0
-call Board.new4 1
-pop local 0
-push argument 1
-if-goto IF_TRUE0
-goto IF_FALSE0
-label IF_TRUE0
-push pointer 0
-push this 0
-push local 0
-call Board.deepcopy 3
-pop temp 0
-goto IF_END0
-label IF_FALSE0
-push pointer 0
-push this 0
-push local 0
-call Board.transpose 3
-pop temp 0
-label IF_END0
-push local 0
+push constant 0
return
function Board.align 2
push argument 0
@@ -449,7 +452,7 @@ pop local 1
goto WHILE_EXP3
label WHILE_END3
label IF_END0
-push argument 1
+push constant 0
return
function Board.reduce 0
push argument 0
@@ -591,7 +594,7 @@ pop pointer 1
push temp 0
pop that 0
label IF_END1
-push argument 1
+push constant 0
return
label IF_FALSE0
push constant 0
@@ -691,7 +694,7 @@ pop pointer 1
push temp 0
pop that 0
label IF_END3
-push argument 1
+push constant 0
return
label IF_FALSE2
push constant 2
@@ -791,7 +794,7 @@ pop pointer 1
push temp 0
pop that 0
label IF_END5
-push argument 1
+push constant 0
return
label IF_FALSE4
push constant 1
@@ -891,14 +894,24 @@ pop pointer 1
push temp 0
pop that 0
label IF_END7
-push argument 1
+push constant 0
return
label IF_FALSE6
-push argument 1
+push constant 0
return
function Board.addTile 5
push argument 0
pop pointer 0
+push this 3
+push constant 1
+eq
+not
+if-goto IF_TRUE0
+goto IF_FALSE0
+label IF_TRUE0
+push constant 0
+return
+label IF_FALSE0
push this 2
push constant 25173
call Math.multiply 2
@@ -908,13 +921,13 @@ pop this 2
push this 2
push constant 0
lt
-if-goto IF_TRUE0
-goto IF_FALSE0
-label IF_TRUE0
+if-goto IF_TRUE1
+goto IF_FALSE1
+label IF_TRUE1
push this 2
neg
pop this 2
-label IF_FALSE0
+label IF_FALSE1
push this 2
push this 2
push constant 2
@@ -924,17 +937,17 @@ call Math.multiply 2
sub
push constant 0
eq
-if-goto IF_TRUE1
-goto IF_FALSE1
-label IF_TRUE1
+if-goto IF_TRUE2
+goto IF_FALSE2
+label IF_TRUE2
push constant 1
pop local 3
-goto IF_END1
-label IF_FALSE1
+goto IF_END2
+label IF_FALSE2
push constant 1
neg
pop local 3
-label IF_END1
+label IF_END2
push this 2
push this 2
push constant 16
@@ -978,12 +991,12 @@ pop this 2
push this 2
push constant 0
lt
-if-goto IF_TRUE2
-goto IF_FALSE2
-label IF_TRUE2
+if-goto IF_TRUE3
+goto IF_FALSE3
+label IF_TRUE3
push constant 15
pop this 2
-label IF_FALSE2
+label IF_FALSE3
push this 2
push this 2
push constant 16
@@ -1024,7 +1037,7 @@ push temp 0
pop that 0
push constant 0
return
-function Board.transform 4
+function Board.transform 3
push argument 0
pop pointer 0
push argument 1
@@ -1056,54 +1069,61 @@ if-goto IF_TRUE1
goto IF_FALSE1
label IF_TRUE1
push constant 0
-not
pop local 0
goto IF_END1
label IF_FALSE1
push constant 0
+not
pop local 0
label IF_END1
-push pointer 0
push local 0
-call Board.getStrips 2
-pop local 2
+if-goto IF_TRUE2
+goto IF_FALSE2
+label IF_TRUE2
+push pointer 0
+call Board.transpose 1
+pop temp 0
+label IF_FALSE2
push constant 0
-pop local 3
+pop local 2
label WHILE_EXP0
-push local 3
+push local 2
push constant 4
lt
not
if-goto WHILE_END0
-push local 3
-push local 2
-add
-push pointer 0
push pointer 0
-push local 3
push local 2
+push this 0
add
pop pointer 1
push that 0
push local 1
call Board.align 3
+pop temp 0
+push pointer 0
+push local 2
+push this 0
+add
+pop pointer 1
+push that 0
push local 1
call Board.reduce 3
pop temp 0
-pop pointer 1
-push temp 0
-pop that 0
-push local 3
+push local 2
push constant 1
add
-pop local 3
+pop local 2
goto WHILE_EXP0
label WHILE_END0
-push pointer 0
-push local 2
push local 0
-call Board.arrange 3
+if-goto IF_TRUE3
+goto IF_FALSE3
+label IF_TRUE3
+push pointer 0
+call Board.transpose 1
pop temp 0
+label IF_FALSE3
push constant 0
return
function Board.next 0
@@ -1118,10 +1138,93 @@ push argument 1
call Board.transform 2
pop temp 0
push pointer 0
-call Board.addTile 1
+call Board.updateStatus 1
pop temp 0
push constant 0
return
+function Board.getStatus 0
+push argument 0
+pop pointer 0
+push this 3
+return
+function Board.setStatus 0
+push argument 0
+pop pointer 0
+push argument 1
+pop this 3
+push constant 0
+return
+function Board.updateStatus 3
+push argument 0
+pop pointer 0
+push constant 0
+pop local 0
+label WHILE_EXP0
+push local 0
+push constant 4
+lt
+not
+if-goto WHILE_END0
+push local 0
+push this 0
+add
+pop pointer 1
+push that 0
+pop local 2
+push constant 0
+pop local 1
+label WHILE_EXP1
+push local 1
+push constant 4
+lt
+not
+if-goto WHILE_END1
+push local 1
+push local 2
+add
+pop pointer 1
+push that 0
+push constant 75
+eq
+if-goto IF_TRUE0
+goto IF_FALSE0
+label IF_TRUE0
+push constant 3
+pop this 3
+push constant 0
+return
+label IF_FALSE0
+push local 1
+push local 2
+add
+pop pointer 1
+push that 0
+push constant 32
+eq
+if-goto IF_TRUE1
+goto IF_FALSE1
+label IF_TRUE1
+push constant 1
+pop this 3
+push constant 0
+return
+label IF_FALSE1
+push local 1
+push constant 1
+add
+pop local 1
+goto WHILE_EXP1
+label WHILE_END1
+push local 0
+push constant 1
+add
+pop local 0
+goto WHILE_EXP0
+label WHILE_END0
+push constant 2
+pop this 3
+push constant 0
+return
function Board.draw 5
push argument 0
pop pointer 0
@@ -1129,6 +1232,12 @@ push constant 9
pop local 0
push constant 30
pop local 1
+push this 3
+push constant 0
+eq
+if-goto IF_TRUE0
+goto IF_FALSE0
+label IF_TRUE0
push local 0
push constant 1
sub
@@ -1137,20 +1246,113 @@ push constant 1
sub
call Output.moveCursor 2
pop temp 0
-push constant 6
-call String.new 1
-push constant 43
-call String.appendChar 2
-push constant 45
-call String.appendChar 2
-push constant 45
-call String.appendChar 2
-push constant 45
-call String.appendChar 2
-push constant 45
-call String.appendChar 2
-push constant 43
-call String.appendChar 2
+push constant 75
+call Output.printChar 1
+pop temp 0
+push local 0
+push constant 1
+add
+push local 1
+push constant 1
+sub
+call Output.moveCursor 2
+pop temp 0
+push static 2
+call Output.printString 1
+pop temp 0
+goto IF_END0
+label IF_FALSE0
+push this 3
+push constant 2
+eq
+if-goto IF_TRUE1
+goto IF_FALSE1
+label IF_TRUE1
+push local 0
+push constant 1
+sub
+push local 1
+push constant 1
+sub
+call Output.moveCursor 2
+pop temp 0
+push static 3
+call Output.printString 1
+pop temp 0
+push local 0
+push constant 1
+add
+push local 1
+push constant 1
+sub
+call Output.moveCursor 2
+pop temp 0
+push static 1
+call Output.printString 1
+pop temp 0
+push local 0
+push constant 3
+add
+push local 1
+push constant 1
+sub
+call Output.moveCursor 2
+pop temp 0
+push static 2
+call Output.printString 1
+pop temp 0
+goto IF_END1
+label IF_FALSE1
+push this 3
+push constant 3
+eq
+if-goto IF_TRUE2
+goto IF_FALSE2
+label IF_TRUE2
+push local 0
+push constant 1
+sub
+push local 1
+push constant 1
+sub
+call Output.moveCursor 2
+pop temp 0
+push static 3
+call Output.printString 1
+pop temp 0
+push local 0
+push constant 1
+add
+push local 1
+push constant 1
+sub
+call Output.moveCursor 2
+pop temp 0
+push static 4
+call Output.printString 1
+pop temp 0
+push local 0
+push constant 3
+add
+push local 1
+push constant 1
+sub
+call Output.moveCursor 2
+pop temp 0
+push static 2
+call Output.printString 1
+pop temp 0
+goto IF_END2
+label IF_FALSE2
+push local 0
+push constant 1
+sub
+push local 1
+push constant 1
+sub
+call Output.moveCursor 2
+pop temp 0
+push static 0
call Output.printString 1
pop temp 0
push local 0
@@ -1161,20 +1363,7 @@ push constant 1
sub
call Output.moveCursor 2
pop temp 0
-push constant 6
-call String.new 1
-push constant 43
-call String.appendChar 2
-push constant 45
-call String.appendChar 2
-push constant 45
-call String.appendChar 2
-push constant 45
-call String.appendChar 2
-push constant 45
-call String.appendChar 2
-push constant 43
-call String.appendChar 2
+push static 0
call Output.printString 1
pop temp 0
push constant 0
@@ -1195,11 +1384,8 @@ push constant 1
sub
call Output.moveCursor 2
pop temp 0
-push constant 1
-call String.new 1
push constant 124
-call String.appendChar 2
-call Output.printString 1
+call Output.printChar 1
pop temp 0
push local 2
push this 0
@@ -1226,11 +1412,8 @@ add
pop local 3
goto WHILE_EXP1
label WHILE_END1
-push constant 1
-call String.new 1
push constant 124
-call String.appendChar 2
-call Output.printString 1
+call Output.printChar 1
pop temp 0
push local 2
push constant 1
@@ -1265,6 +1448,9 @@ pop temp 0
push this 1
call Output.printInt 1
pop temp 0
+label IF_END2
+label IF_END1
+label IF_END0
push constant 0
return
function Board.dispose 0
diff --git a/projects/09/K/KGame.jack b/projects/09/K/KGame.jack
index 796f5b5..e2b6d3d 100644
--- a/projects/09/K/KGame.jack
+++ b/projects/09/K/KGame.jack
@@ -14,20 +14,43 @@ class KGame{
}
method void run() {
- var int key, dir;
+ var int key, dir, key1, st;
var boolean exit;
- let key = 0;
let exit = false;
while (~exit) {
- while ((key < 130) | (key > 133)) {
+ let st = board.getStatus();
+ let key = 0;
+ while (key = 0) {
let key = Keyboard.keyPressed();
}
- let dir = key - 130;
- while (~(key = 0)) {
- let key = Keyboard.keyPressed();
+ let key1 = key;
+ while (~(key1 = 0)) {
+ let key1 = Keyboard.keyPressed();
}
- do board.next(dir);
- do board.draw();
+ if (key = 81) {
+ let exit = true;
+ } else { if ((st = 0)) {
+ do Screen.clearScreen();
+ do board.setStatus(1);
+ do board.draw();
+ } else { if ((st = 2) | (st = 3)) {
+ do Screen.clearScreen();
+ do board.setStatus(0);
+ do board.draw();
+ do board.initBoard();
+ } else { if (key = 82) { // r for restart
+ do Screen.clearScreen();
+ do board.initBoard();
+ do board.draw();
+ } else { if ((key > 129) & (key < 134)) {
+ do Screen.clearScreen();
+ do board.next(key - 130);
+ do board.draw();
+ do Sys.wait(300);
+ do Screen.clearScreen();
+ do board.addTile();
+ do board.draw();
+ }}}}}
}
return;
}
diff --git a/projects/09/K/KGame.vm b/projects/09/K/KGame.vm
index 767c14a..57fc333 100644
--- a/projects/09/K/KGame.vm
+++ b/projects/09/K/KGame.vm
@@ -20,26 +20,25 @@ call Memory.deAlloc 1
pop temp 0
push constant 0
return
-function KGame.run 3
+function KGame.run 5
push argument 0
pop pointer 0
push constant 0
-pop local 0
-push constant 0
-pop local 2
+pop local 4
label WHILE_EXP0
-push local 2
+push local 4
not
not
if-goto WHILE_END0
+push this 0
+call Board.getStatus 1
+pop local 3
+push constant 0
+pop local 0
label WHILE_EXP1
push local 0
-push constant 130
-lt
-push local 0
-push constant 133
-gt
-or
+push constant 0
+eq
not
if-goto WHILE_END1
call Keyboard.keyPressed 0
@@ -47,27 +46,123 @@ pop local 0
goto WHILE_EXP1
label WHILE_END1
push local 0
-push constant 130
-sub
-pop local 1
+pop local 2
label WHILE_EXP2
-push local 0
+push local 2
push constant 0
eq
not
not
if-goto WHILE_END2
call Keyboard.keyPressed 0
-pop local 0
+pop local 2
goto WHILE_EXP2
label WHILE_END2
+push local 0
+push constant 81
+eq
+if-goto IF_TRUE0
+goto IF_FALSE0
+label IF_TRUE0
+push constant 0
+not
+pop local 4
+goto IF_END0
+label IF_FALSE0
+push local 3
+push constant 0
+eq
+if-goto IF_TRUE1
+goto IF_FALSE1
+label IF_TRUE1
+call Screen.clearScreen 0
+pop temp 0
+push this 0
+push constant 1
+call Board.setStatus 2
+pop temp 0
push this 0
-push local 1
+call Board.draw 1
+pop temp 0
+goto IF_END1
+label IF_FALSE1
+push local 3
+push constant 2
+eq
+push local 3
+push constant 3
+eq
+or
+if-goto IF_TRUE2
+goto IF_FALSE2
+label IF_TRUE2
+call Screen.clearScreen 0
+pop temp 0
+push this 0
+push constant 0
+call Board.setStatus 2
+pop temp 0
+push this 0
+call Board.draw 1
+pop temp 0
+push this 0
+call Board.initBoard 1
+pop temp 0
+goto IF_END2
+label IF_FALSE2
+push local 0
+push constant 82
+eq
+if-goto IF_TRUE3
+goto IF_FALSE3
+label IF_TRUE3
+call Screen.clearScreen 0
+pop temp 0
+push this 0
+call Board.initBoard 1
+pop temp 0
+push this 0
+call Board.draw 1
+pop temp 0
+goto IF_END3
+label IF_FALSE3
+push local 0
+push constant 129
+gt
+push local 0
+push constant 134
+lt
+and
+if-goto IF_TRUE4
+goto IF_FALSE4
+label IF_TRUE4
+call Screen.clearScreen 0
+pop temp 0
+push this 0
+push local 0
+push constant 130
+sub
call Board.next 2
pop temp 0
push this 0
call Board.draw 1
pop temp 0
+push constant 300
+call Sys.wait 1
+pop temp 0
+call Screen.clearScreen 0
+pop temp 0
+push this 0
+call Board.addTile 1
+pop temp 0
+push this 0
+call Board.draw 1
+pop temp 0
+label IF_FALSE4
+label IF_END3
+label IF_END2
+label IF_END1
+label IF_END0
goto WHILE_EXP0
label WHILE_END0
push constant 0
diff --git a/projects/09/K/Main.jack b/projects/09/K/Main.jack
index 4136e80..7f86973 100644
--- a/projects/09/K/Main.jack
+++ b/projects/09/K/Main.jack
@@ -1,6 +1,7 @@
class Main {
function void main() {
var KGame game;
+ do Board.init();
let game = KGame.new();
do game.run();
do game.dispose();
diff --git a/projects/09/K/Main.vm b/projects/09/K/Main.vm
index 0a56ae9..0441c7a 100644
--- a/projects/09/K/Main.vm
+++ b/projects/09/K/Main.vm
@@ -1,4 +1,6 @@
function Main.main 1
+call Board.init 0
+pop temp 0
call KGame.new 0
pop local 0
push local 0