80 lines
2.7 KiB
Plaintext
80 lines
2.7 KiB
Plaintext
|
// This file is part of www.nand2tetris.org
|
||
|
// and the book "The Elements of Computing Systems"
|
||
|
// by Nisan and Schocken, MIT Press.
|
||
|
// File name: projects/09/Square/SquareGame.jack
|
||
|
|
||
|
/**
|
||
|
* Implements the Square Dance game.
|
||
|
* This simple game allows the user to move a black square around
|
||
|
* the screen, and change the square's size during the movement.
|
||
|
* When the game starts, a square of 30 by 30 pixels is shown at the
|
||
|
* top-left corner of the screen. The user controls the square as follows.
|
||
|
* The 4 arrow keys are used to move the square up, down, left, and right.
|
||
|
* The 'z' and 'x' keys are used, respectively, to decrement and increment
|
||
|
* the square's size. The 'q' key is used to quit the game.
|
||
|
*/
|
||
|
|
||
|
class SquareGame {
|
||
|
field Square square; // the square of this game
|
||
|
field int direction; // the square's current direction:
|
||
|
// 0=none, 1=up, 2=down, 3=left, 4=right
|
||
|
|
||
|
/** Constructs a new Square Game. */
|
||
|
constructor SquareGame new() {
|
||
|
// Creates a 30 by 30 pixels square and positions it at the top-left
|
||
|
// of the screen.
|
||
|
let square = Square.new(0, 0, 30);
|
||
|
let direction = 0; // initial state is no movement
|
||
|
return this;
|
||
|
}
|
||
|
|
||
|
/** Disposes this game. */
|
||
|
method void dispose() {
|
||
|
do square.dispose();
|
||
|
do Memory.deAlloc(this);
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
/** Moves the square in the current direction. */
|
||
|
method void moveSquare() {
|
||
|
if (direction = 1) { do square.moveUp(); }
|
||
|
if (direction = 2) { do square.moveDown(); }
|
||
|
if (direction = 3) { do square.moveLeft(); }
|
||
|
if (direction = 4) { do square.moveRight(); }
|
||
|
do Sys.wait(5); // delays the next movement
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
/** Runs the game: handles the user's inputs and moves the square accordingly */
|
||
|
method void run() {
|
||
|
var char key; // the key currently pressed by the user
|
||
|
var boolean exit;
|
||
|
let exit = false;
|
||
|
|
||
|
while (~exit) {
|
||
|
// waits for a key to be pressed
|
||
|
while (key = 0) {
|
||
|
let key = Keyboard.keyPressed();
|
||
|
do moveSquare();
|
||
|
}
|
||
|
if (key = 81) { let exit = true; } // q key
|
||
|
if (key = 90) { do square.decSize(); } // z key
|
||
|
if (key = 88) { do square.incSize(); } // x key
|
||
|
if (key = 131) { let direction = 1; } // up arrow
|
||
|
if (key = 133) { let direction = 2; } // down arrow
|
||
|
if (key = 130) { let direction = 3; } // left arrow
|
||
|
if (key = 132) { let direction = 4; } // right arrow
|
||
|
|
||
|
// waits for the key to be released
|
||
|
while (~(key = 0)) {
|
||
|
let key = Keyboard.keyPressed();
|
||
|
do moveSquare();
|
||
|
}
|
||
|
} // while
|
||
|
return;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
|