[09] Wrote a Tic-Tac-Toe (2player) implementation

This commit is contained in:
Nemo 2020-06-10 02:01:57 +05:30
parent 23324814bd
commit 43f982f06f
6 changed files with 1399 additions and 0 deletions

View File

@ -0,0 +1,126 @@
class Board {
// Array of 0 by default
// X=1
// O=2
field Array gameState;
field int turn;
constructor Board new() {
var int i;
let i=0;
let turn = 0;
let gameState = Array.new(9);
while(i<9) {
let gameState[i] = 0;
let i=i+1;
}
return this;
}
method boolean isRowTaken(int row, int value) {
if (gameState[row*3] = value &
gameState[(row*3)+1] = value &
gameState[(row*3)+2] = value) {
return true;
}
return false;
}
method boolean isColumnTaken(int column, int value) {
if (gameState[column] = value &
gameState[column+3] = value &
gameState[column+6] = value) {
return true;
}
return false;
}
method boolean isWon(int value) {
if (isRowTaken(0,value) | isRowTaken(1, value) | isRowTaken(1, value)) {
return true;
}
if (isColumnTaken(0, value) | isColumnTaken(1, value) | isColumnTaken(2, value)) {
return true;
}
if (isDiagonalTaken(value)) {
return true;
}
return false;
}
method boolean isDiagonalTaken(int value) {
// ensure center is correct first
if (~(gameState[4] = value )) {
return false;
}
// NORTH WEST TO SOUTH EAST
if (gameState[0] = value & gameState[8] = value) {
return true;
}
if (gameState[2] = value & gameState[6] = value) {
return true;
}
return false;
}
// returns 1 if player X won
// returns 2 if player O won
// 0 otherwise
method int winner() {
if(isWon(1)) {
return 1;
}
if(isWon(2)) {
return 2;
}
return 0;
}
method boolean play(int row, int column) {
var int move, remainder;
let move = 0;
if (~ (gameState[(row*3) + column] = 0)) {
return false;
}
let remainder = turn - (2 * (turn/2));
if (remainder = 0) {
let move = 1;
} else {
let move = 2;
}
let gameState[row*3 + column] = move;
if (move = 1) {
do Draw.DrawX(row, column);
} else {
if (move = 2) {
do Draw.DrawO(row, column);
}
}
if(isWon(1)) {
return true;
}
if(isWon(2)) {
return true;
}
if (turn = 8) {
return true;
}
let turn = turn + 1;
return false;
}
}

View File

@ -0,0 +1,376 @@
function Board.new 1
push constant 2
call Memory.alloc 1
pop pointer 0
push constant 0
pop local 0
push constant 0
pop this 1
push constant 9
call Array.new 1
pop this 0
label WHILE_EXP0
push local 0
push constant 9
lt
not
if-goto WHILE_END0
push local 0
push this 0
add
push constant 0
pop temp 0
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
return
function Board.isRowTaken 0
push argument 0
pop pointer 0
push argument 1
push constant 3
call Math.multiply 2
push this 0
add
pop pointer 1
push that 0
push argument 2
eq
push argument 1
push constant 3
call Math.multiply 2
push constant 1
add
push this 0
add
pop pointer 1
push that 0
and
push argument 2
eq
push argument 1
push constant 3
call Math.multiply 2
push constant 2
add
push this 0
add
pop pointer 1
push that 0
and
push argument 2
eq
if-goto IF_TRUE0
goto IF_FALSE0
label IF_TRUE0
push constant 0
not
return
label IF_FALSE0
push constant 0
return
function Board.isColumnTaken 0
push argument 0
pop pointer 0
push argument 1
push this 0
add
pop pointer 1
push that 0
push argument 2
eq
push argument 1
push constant 3
add
push this 0
add
pop pointer 1
push that 0
and
push argument 2
eq
push argument 1
push constant 6
add
push this 0
add
pop pointer 1
push that 0
and
push argument 2
eq
if-goto IF_TRUE0
goto IF_FALSE0
label IF_TRUE0
push constant 0
not
return
label IF_FALSE0
push constant 0
return
function Board.isWon 0
push argument 0
pop pointer 0
push pointer 0
push constant 0
push argument 1
call Board.isRowTaken 3
push pointer 0
push constant 1
push argument 1
call Board.isRowTaken 3
or
push pointer 0
push constant 1
push argument 1
call Board.isRowTaken 3
or
if-goto IF_TRUE0
goto IF_FALSE0
label IF_TRUE0
push constant 0
not
return
label IF_FALSE0
push pointer 0
push constant 0
push argument 1
call Board.isColumnTaken 3
push pointer 0
push constant 1
push argument 1
call Board.isColumnTaken 3
or
push pointer 0
push constant 2
push argument 1
call Board.isColumnTaken 3
or
if-goto IF_TRUE1
goto IF_FALSE1
label IF_TRUE1
push constant 0
not
return
label IF_FALSE1
push pointer 0
push argument 1
call Board.isDiagonalTaken 2
if-goto IF_TRUE2
goto IF_FALSE2
label IF_TRUE2
push constant 0
not
return
label IF_FALSE2
push constant 0
return
function Board.isDiagonalTaken 0
push argument 0
pop pointer 0
push constant 4
push this 0
add
pop pointer 1
push that 0
push argument 1
eq
not
if-goto IF_TRUE0
goto IF_FALSE0
label IF_TRUE0
push constant 0
return
label IF_FALSE0
push constant 0
push this 0
add
pop pointer 1
push that 0
push argument 1
eq
push constant 8
push this 0
add
pop pointer 1
push that 0
and
push argument 1
eq
if-goto IF_TRUE1
goto IF_FALSE1
label IF_TRUE1
push constant 0
not
return
label IF_FALSE1
push constant 2
push this 0
add
pop pointer 1
push that 0
push argument 1
eq
push constant 6
push this 0
add
pop pointer 1
push that 0
and
push argument 1
eq
if-goto IF_TRUE2
goto IF_FALSE2
label IF_TRUE2
push constant 0
not
return
label IF_FALSE2
push constant 0
return
function Board.winner 0
push argument 0
pop pointer 0
push pointer 0
push constant 1
call Board.isWon 2
if-goto IF_TRUE0
goto IF_FALSE0
label IF_TRUE0
push constant 1
return
label IF_FALSE0
push pointer 0
push constant 2
call Board.isWon 2
if-goto IF_TRUE1
goto IF_FALSE1
label IF_TRUE1
push constant 2
return
label IF_FALSE1
push constant 0
return
function Board.play 2
push argument 0
pop pointer 0
push constant 0
pop local 0
push argument 1
push constant 3
call Math.multiply 2
push argument 2
add
push this 0
add
pop pointer 1
push that 0
push constant 0
eq
not
if-goto IF_TRUE0
goto IF_FALSE0
label IF_TRUE0
push constant 0
return
label IF_FALSE0
push this 1
push constant 2
push this 1
push constant 2
call Math.divide 2
call Math.multiply 2
sub
pop local 1
push local 1
push constant 0
eq
if-goto IF_TRUE1
goto IF_FALSE1
label IF_TRUE1
push constant 1
pop local 0
goto IF_END1
label IF_FALSE1
push constant 2
pop local 0
label IF_END1
push argument 1
push constant 3
call Math.multiply 2
push argument 2
add
push this 0
add
push local 0
pop temp 0
pop pointer 1
push temp 0
pop that 0
push local 0
push constant 1
eq
if-goto IF_TRUE2
goto IF_FALSE2
label IF_TRUE2
push argument 1
push argument 2
call Draw.DrawX 2
pop temp 0
goto IF_END2
label IF_FALSE2
push local 0
push constant 2
eq
if-goto IF_TRUE3
goto IF_FALSE3
label IF_TRUE3
push argument 1
push argument 2
call Draw.DrawO 2
pop temp 0
label IF_FALSE3
label IF_END2
push pointer 0
push constant 1
call Board.isWon 2
if-goto IF_TRUE4
goto IF_FALSE4
label IF_TRUE4
push constant 0
not
return
label IF_FALSE4
push pointer 0
push constant 2
call Board.isWon 2
if-goto IF_TRUE5
goto IF_FALSE5
label IF_TRUE5
push constant 0
not
return
label IF_FALSE5
push this 1
push constant 8
eq
if-goto IF_TRUE6
goto IF_FALSE6
label IF_TRUE6
push constant 0
not
return
label IF_FALSE6
push this 1
push constant 1
add
pop this 1
push constant 0
return

View File

@ -0,0 +1,99 @@
class Draw {
// Draws the grid
function void Grid() {
var int row;
var int startBlock;
let row = 0;
while(row<3) {
let startBlock = 32 * (row) * 16;
do Draw.Border(startBlock);
do Draw.Border(startBlock + 1);
do Draw.Border(startBlock + 2);
let row=row+1;
}
return;
}
function void Border(int location) {
var int memAddress;
let memAddress = 16384+location;
do Memory.poke(memAddress+0, -1);
do Memory.poke(memAddress+32, -32767);
do Memory.poke(memAddress+64, -32767);
do Memory.poke(memAddress+96, -32767);
do Memory.poke(memAddress+128, -32767);
do Memory.poke(memAddress+160, -32767);
do Memory.poke(memAddress+192, -32767);
do Memory.poke(memAddress+224, -32767);
do Memory.poke(memAddress+256, -32767);
do Memory.poke(memAddress+288, -32767);
do Memory.poke(memAddress+320, -32767);
do Memory.poke(memAddress+352, -32767);
do Memory.poke(memAddress+384, -32767);
do Memory.poke(memAddress+416, -32767);
do Memory.poke(memAddress+448, -32767);
do Memory.poke(memAddress+480, -1);
return;
}
function int Location(int row, int column) {
return (32 * row * 16) + column;
}
function void DrawX(int row, int column) {
var int l;
let l = Draw.Location(row, column);
do Draw.X(l);
return;
}
function void DrawO(int row, int column) {
var int l;
let l = Draw.Location(row, column);
do Draw.O(l);
return;
}
function void X(int location) {
var int memAddress;
let memAddress = 16384+location;
do Memory.poke(memAddress+0, -1);
do Memory.poke(memAddress+32, -32767);
do Memory.poke(memAddress+64, -20467);
do Memory.poke(memAddress+96, -18403);
do Memory.poke(memAddress+128, -25543);
do Memory.poke(memAddress+160, -29071);
do Memory.poke(memAddress+192, -31807);
do Memory.poke(memAddress+224, -31807);
do Memory.poke(memAddress+256, -31807);
do Memory.poke(memAddress+288, -31807);
do Memory.poke(memAddress+320, -29071);
do Memory.poke(memAddress+352, -25543);
do Memory.poke(memAddress+384, -18403);
do Memory.poke(memAddress+416, -20467);
do Memory.poke(memAddress+448, -32767);
do Memory.poke(memAddress+480, -1);
return;
}
function void O(int location) {
var int memAddress;
let memAddress = 16384+location;
do Memory.poke(memAddress+0, -1);
do Memory.poke(memAddress+32, -32767);
do Memory.poke(memAddress+64, -28687);
do Memory.poke(memAddress+96, -24583);
do Memory.poke(memAddress+128, -20467);
do Memory.poke(memAddress+160, -20467);
do Memory.poke(memAddress+192, -20467);
do Memory.poke(memAddress+224, -20467);
do Memory.poke(memAddress+256, -20467);
do Memory.poke(memAddress+288, -20467);
do Memory.poke(memAddress+320, -20467);
do Memory.poke(memAddress+352, -20467);
do Memory.poke(memAddress+384, -24583);
do Memory.poke(memAddress+416, -28687);
do Memory.poke(memAddress+448, -32767);
do Memory.poke(memAddress+480, -1);
return;
}
}

View File

@ -0,0 +1,422 @@
function Draw.Grid 2
push constant 0
pop local 0
label WHILE_EXP0
push local 0
push constant 3
lt
not
if-goto WHILE_END0
push constant 32
push local 0
call Math.multiply 2
push constant 16
call Math.multiply 2
pop local 1
push local 1
call Draw.Border 1
pop temp 0
push local 1
push constant 1
add
call Draw.Border 1
pop temp 0
push local 1
push constant 2
add
call Draw.Border 1
pop temp 0
push local 0
push constant 1
add
pop local 0
goto WHILE_EXP0
label WHILE_END0
push constant 0
return
function Draw.Border 1
push constant 16384
push argument 0
add
pop local 0
push local 0
push constant 0
add
push constant 1
neg
call Memory.poke 2
pop temp 0
push local 0
push constant 32
add
push constant 32767
neg
call Memory.poke 2
pop temp 0
push local 0
push constant 64
add
push constant 32767
neg
call Memory.poke 2
pop temp 0
push local 0
push constant 96
add
push constant 32767
neg
call Memory.poke 2
pop temp 0
push local 0
push constant 128
add
push constant 32767
neg
call Memory.poke 2
pop temp 0
push local 0
push constant 160
add
push constant 32767
neg
call Memory.poke 2
pop temp 0
push local 0
push constant 192
add
push constant 32767
neg
call Memory.poke 2
pop temp 0
push local 0
push constant 224
add
push constant 32767
neg
call Memory.poke 2
pop temp 0
push local 0
push constant 256
add
push constant 32767
neg
call Memory.poke 2
pop temp 0
push local 0
push constant 288
add
push constant 32767
neg
call Memory.poke 2
pop temp 0
push local 0
push constant 320
add
push constant 32767
neg
call Memory.poke 2
pop temp 0
push local 0
push constant 352
add
push constant 32767
neg
call Memory.poke 2
pop temp 0
push local 0
push constant 384
add
push constant 32767
neg
call Memory.poke 2
pop temp 0
push local 0
push constant 416
add
push constant 32767
neg
call Memory.poke 2
pop temp 0
push local 0
push constant 448
add
push constant 32767
neg
call Memory.poke 2
pop temp 0
push local 0
push constant 480
add
push constant 1
neg
call Memory.poke 2
pop temp 0
push constant 0
return
function Draw.Location 0
push constant 32
push argument 0
call Math.multiply 2
push constant 16
call Math.multiply 2
push argument 1
add
return
function Draw.DrawX 1
push argument 0
push argument 1
call Draw.Location 2
pop local 0
push local 0
call Draw.X 1
pop temp 0
push constant 0
return
function Draw.DrawO 1
push argument 0
push argument 1
call Draw.Location 2
pop local 0
push local 0
call Draw.O 1
pop temp 0
push constant 0
return
function Draw.X 1
push constant 16384
push argument 0
add
pop local 0
push local 0
push constant 0
add
push constant 1
neg
call Memory.poke 2
pop temp 0
push local 0
push constant 32
add
push constant 32767
neg
call Memory.poke 2
pop temp 0
push local 0
push constant 64
add
push constant 20467
neg
call Memory.poke 2
pop temp 0
push local 0
push constant 96
add
push constant 18403
neg
call Memory.poke 2
pop temp 0
push local 0
push constant 128
add
push constant 25543
neg
call Memory.poke 2
pop temp 0
push local 0
push constant 160
add
push constant 29071
neg
call Memory.poke 2
pop temp 0
push local 0
push constant 192
add
push constant 31807
neg
call Memory.poke 2
pop temp 0
push local 0
push constant 224
add
push constant 31807
neg
call Memory.poke 2
pop temp 0
push local 0
push constant 256
add
push constant 31807
neg
call Memory.poke 2
pop temp 0
push local 0
push constant 288
add
push constant 31807
neg
call Memory.poke 2
pop temp 0
push local 0
push constant 320
add
push constant 29071
neg
call Memory.poke 2
pop temp 0
push local 0
push constant 352
add
push constant 25543
neg
call Memory.poke 2
pop temp 0
push local 0
push constant 384
add
push constant 18403
neg
call Memory.poke 2
pop temp 0
push local 0
push constant 416
add
push constant 20467
neg
call Memory.poke 2
pop temp 0
push local 0
push constant 448
add
push constant 32767
neg
call Memory.poke 2
pop temp 0
push local 0
push constant 480
add
push constant 1
neg
call Memory.poke 2
pop temp 0
push constant 0
return
function Draw.O 1
push constant 16384
push argument 0
add
pop local 0
push local 0
push constant 0
add
push constant 1
neg
call Memory.poke 2
pop temp 0
push local 0
push constant 32
add
push constant 32767
neg
call Memory.poke 2
pop temp 0
push local 0
push constant 64
add
push constant 28687
neg
call Memory.poke 2
pop temp 0
push local 0
push constant 96
add
push constant 24583
neg
call Memory.poke 2
pop temp 0
push local 0
push constant 128
add
push constant 20467
neg
call Memory.poke 2
pop temp 0
push local 0
push constant 160
add
push constant 20467
neg
call Memory.poke 2
pop temp 0
push local 0
push constant 192
add
push constant 20467
neg
call Memory.poke 2
pop temp 0
push local 0
push constant 224
add
push constant 20467
neg
call Memory.poke 2
pop temp 0
push local 0
push constant 256
add
push constant 20467
neg
call Memory.poke 2
pop temp 0
push local 0
push constant 288
add
push constant 20467
neg
call Memory.poke 2
pop temp 0
push local 0
push constant 320
add
push constant 20467
neg
call Memory.poke 2
pop temp 0
push local 0
push constant 352
add
push constant 20467
neg
call Memory.poke 2
pop temp 0
push local 0
push constant 384
add
push constant 24583
neg
call Memory.poke 2
pop temp 0
push local 0
push constant 416
add
push constant 28687
neg
call Memory.poke 2
pop temp 0
push local 0
push constant 448
add
push constant 32767
neg
call Memory.poke 2
pop temp 0
push local 0
push constant 480
add
push constant 1
neg
call Memory.poke 2
pop temp 0
push constant 0
return

View File

@ -0,0 +1,55 @@
class Main {
function void main() {
var int c,position;
var Board b;
var char key; // the key currently pressed by the user
var boolean exit;
var boolean gameend;
let exit = false;
let b = Board.new();
do Draw.Grid();
while(~exit) {
while (key = 0) {
let key = Keyboard.keyPressed();
do Sys.wait(5); // wait 5ms
}
let position = -1;
if (key = 81) { let exit = true; } // q
if (key = 49) { let position = 0; } // 1
if (key = 50) { let position = 1; }
if (key = 51) { let position = 2; }
if (key = 52) { let position = 3; }
if (key = 53) { let position = 4; }
if (key = 54) { let position = 5; }
if (key = 55) { let position = 6; }
if (key = 56) { let position = 7; }
if (key = 57) { let position = 8; } // 9
if((key>48)&(key<58)) {
let c = position - (3 * (position/3));
let gameend = b.play(position/3, c);
if (gameend) {
do Screen.clearScreen();
let c = b.winner();
if(c = 1) {
do Output.printString("Congratulations Player 1");
}
if (c = 2) {
do Output.printString("Congratulations Player 2");
}
if (c = 0) {
do Output.printString("It was a draw!");
}
let exit = true;
}
let key = 0;
}
}
return;
}
}

View File

@ -0,0 +1,321 @@
function Main.main 6
push constant 0
pop local 4
call Board.new 0
pop local 2
call Draw.Grid 0
pop temp 0
label WHILE_EXP0
push local 4
not
not
if-goto WHILE_END0
label WHILE_EXP1
push local 3
push constant 0
eq
not
if-goto WHILE_END1
call Keyboard.keyPressed 0
pop local 3
push constant 5
call Sys.wait 1
pop temp 0
goto WHILE_EXP1
label WHILE_END1
push constant 1
neg
pop local 1
push local 3
push constant 81
eq
if-goto IF_TRUE0
goto IF_FALSE0
label IF_TRUE0
push constant 0
not
pop local 4
label IF_FALSE0
push local 3
push constant 49
eq
if-goto IF_TRUE1
goto IF_FALSE1
label IF_TRUE1
push constant 0
pop local 1
label IF_FALSE1
push local 3
push constant 50
eq
if-goto IF_TRUE2
goto IF_FALSE2
label IF_TRUE2
push constant 1
pop local 1
label IF_FALSE2
push local 3
push constant 51
eq
if-goto IF_TRUE3
goto IF_FALSE3
label IF_TRUE3
push constant 2
pop local 1
label IF_FALSE3
push local 3
push constant 52
eq
if-goto IF_TRUE4
goto IF_FALSE4
label IF_TRUE4
push constant 3
pop local 1
label IF_FALSE4
push local 3
push constant 53
eq
if-goto IF_TRUE5
goto IF_FALSE5
label IF_TRUE5
push constant 4
pop local 1
label IF_FALSE5
push local 3
push constant 54
eq
if-goto IF_TRUE6
goto IF_FALSE6
label IF_TRUE6
push constant 5
pop local 1
label IF_FALSE6
push local 3
push constant 55
eq
if-goto IF_TRUE7
goto IF_FALSE7
label IF_TRUE7
push constant 6
pop local 1
label IF_FALSE7
push local 3
push constant 56
eq
if-goto IF_TRUE8
goto IF_FALSE8
label IF_TRUE8
push constant 7
pop local 1
label IF_FALSE8
push local 3
push constant 57
eq
if-goto IF_TRUE9
goto IF_FALSE9
label IF_TRUE9
push constant 8
pop local 1
label IF_FALSE9
push local 3
push constant 48
gt
push local 3
push constant 58
lt
and
if-goto IF_TRUE10
goto IF_FALSE10
label IF_TRUE10
push local 1
push constant 3
push local 1
push constant 3
call Math.divide 2
call Math.multiply 2
sub
pop local 0
push local 2
push local 1
push constant 3
call Math.divide 2
push local 0
call Board.play 3
pop local 5
push local 5
if-goto IF_TRUE11
goto IF_FALSE11
label IF_TRUE11
call Screen.clearScreen 0
pop temp 0
push local 2
call Board.winner 1
pop local 0
push local 0
push constant 1
eq
if-goto IF_TRUE12
goto IF_FALSE12
label IF_TRUE12
push constant 24
call String.new 1
push constant 67
call String.appendChar 2
push constant 111
call String.appendChar 2
push constant 110
call String.appendChar 2
push constant 103
call String.appendChar 2
push constant 114
call String.appendChar 2
push constant 97
call String.appendChar 2
push constant 116
call String.appendChar 2
push constant 117
call String.appendChar 2
push constant 108
call String.appendChar 2
push constant 97
call String.appendChar 2
push constant 116
call String.appendChar 2
push constant 105
call String.appendChar 2
push constant 111
call String.appendChar 2
push constant 110
call String.appendChar 2
push constant 115
call String.appendChar 2
push constant 32
call String.appendChar 2
push constant 80
call String.appendChar 2
push constant 108
call String.appendChar 2
push constant 97
call String.appendChar 2
push constant 121
call String.appendChar 2
push constant 101
call String.appendChar 2
push constant 114
call String.appendChar 2
push constant 32
call String.appendChar 2
push constant 49
call String.appendChar 2
call Output.printString 1
pop temp 0
label IF_FALSE12
push local 0
push constant 2
eq
if-goto IF_TRUE13
goto IF_FALSE13
label IF_TRUE13
push constant 24
call String.new 1
push constant 67
call String.appendChar 2
push constant 111
call String.appendChar 2
push constant 110
call String.appendChar 2
push constant 103
call String.appendChar 2
push constant 114
call String.appendChar 2
push constant 97
call String.appendChar 2
push constant 116
call String.appendChar 2
push constant 117
call String.appendChar 2
push constant 108
call String.appendChar 2
push constant 97
call String.appendChar 2
push constant 116
call String.appendChar 2
push constant 105
call String.appendChar 2
push constant 111
call String.appendChar 2
push constant 110
call String.appendChar 2
push constant 115
call String.appendChar 2
push constant 32
call String.appendChar 2
push constant 80
call String.appendChar 2
push constant 108
call String.appendChar 2
push constant 97
call String.appendChar 2
push constant 121
call String.appendChar 2
push constant 101
call String.appendChar 2
push constant 114
call String.appendChar 2
push constant 32
call String.appendChar 2
push constant 50
call String.appendChar 2
call Output.printString 1
pop temp 0
label IF_FALSE13
push local 0
push constant 0
eq
if-goto IF_TRUE14
goto IF_FALSE14
label IF_TRUE14
push constant 14
call String.new 1
push constant 73
call String.appendChar 2
push constant 116
call String.appendChar 2
push constant 32
call String.appendChar 2
push constant 119
call String.appendChar 2
push constant 97
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 32
call String.appendChar 2
push constant 100
call String.appendChar 2
push constant 114
call String.appendChar 2
push constant 97
call String.appendChar 2
push constant 119
call String.appendChar 2
push constant 33
call String.appendChar 2
call Output.printString 1
pop temp 0
label IF_FALSE14
push constant 0
not
pop local 4
label IF_FALSE11
push constant 0
pop local 3
label IF_FALSE10
goto WHILE_EXP0
label WHILE_END0
push constant 0
return