CORE
10 ARRAY HighScores
4 VARIABLE X
1 VARIABLE oldX
1 VARIABLE Xinc
6 VARIABLE Y
1 VARIABLE oldY
1 VARIABLE Yinc
39 VARIABLE BatPos
25 ARRAY FrontWall
25 ARRAY MiddleWall
25 ARRAY BackWall
: InitHighSc 9 0 DO 10000 I> 1000 * - HighScores [I]! LOOP ;
: Rules ." The rules of the game go here. " CRET
        ." PRESS ANY KEY TO CONTINUE" KEY CLS ;
: 3Char DUP ECHO DUP ECHO ECHO ;
: InitVars InitHighSc ;
: PlotBat BatPos @ 22 TAB 66 3Char ;
: MoveBatLeft BatPos @ 1- 4 MAX DUP BatPos ! 22 TAB 66 3Char 32 ECHO ;
: MoveBatRight BatPos @ 1+ 72 MIN DUP BatPos ! 1- 22 TAB 32 ECHO 66 3Char ;
: InitBat BatPos @ PlotBat ;
: InitWall 23 0 DO 1 FrontWall [I]! 1 MiddleWall [I]! 1 BackWall [I]! LOOP
           11 0 DO I> 6 * 4 + DUP 3 TAB 67 3Char 68 3Char
                              DUP 4 TAB 69 3Char 70 3Char
                                 5 TAB 71 3Char 72 3Char LOOP
           3 BackWall 24 4* + !
           4 MiddleWall 24 4* + !
           5 FrontWall 24 4* + ! ;
: InitSides 24 0 DO 3 I> TAB 124 ECHO 76 I> TAB 124 ECHO LOOP ;
: InitScreen InitWall InitSides InitBat ;
: Initialise 1 PRINT_MODE ! CLS InitVars Rules InitScreen ;
: EndGame CLS ."   High Score Table " CRET CRET 
              9 0 DO ."    Mike   " HighScores [I]@ . CRET LOOP ;
: PlotA X @ Y @ TAB 65 ECHO ;
: UnPlotA oldX @ oldY @ TAB 32 ECHO ;
: Touch X @ 4- 3 / DUP 4* 2OVER + DUP @
        IF 0 SWAP ! 3 * 4 + SWAP 24 4* + @ TAB 32 3Char 0 Yinc @ - Yinc !
        ELSE DROP DROP DROP ENDIF ;
: incXY X @ DUP oldX ! Xinc @ + DUP X !
    DUP 74 > IF -1 Xinc ! ENDIF
         5 < IF 1 Xinc ! ENDIF
    Y @ DUP oldY ! Yinc @ + DUP Y !
    DUP 20 > IF -1 Yinc ! ENDIF
    DUP  3 = IF BackWall Touch ENDIF
    DUP  4 = IF MiddleWall Touch ENDIF
    DUP  5 = IF FrontWall Touch ENDIF
         1 < IF 1 Yinc ! ENDIF ;
: GameOver 0 23 0 DO FrontWall [I]@ + MiddleWall [I]@ + BackWall [I]@ + LOOP 0 = ;
: MoveBat 1 INKEY IF DUP 44 = IF MoveBatLeft ENDIF 46 = IF MoveBatRight ENDIF ENDIF ;
: Play BEGIN
          TIME 2+ incXY PlotA UnPlotA FALSE ELSE 32 = SWAP 2+
          BEGIN MoveBat DUP TIME < END DROP
          GameOver
       END TRUE ;
: GAME Initialise BEGIN Play END EndGame ;
GAME
