All this BASIC talk reminded me of the lame ASCII Pacman I wrote back in the 90s in QBasic.
DIM board(23, 40)
DECLARE SUB InitBoard (board())
DECLARE SUB InitDots (board())
DECLARE SUB PrintBoard (board())
DECLARE SUB MovePacman (board(), x, y, Man)
DECLARE SUB MoveGhost (board(), x, y, g, f)
DECLARE SUB SetSpeed (Clock)
DECLARE SUB FreezeGhosts (Pcount, Go, Clock)
SCREEN 13
CALL InitBoard(board())
CALL InitDots(board())
CALL PrintBoard(board())
CALL SetSpeed(Clock)
Clock = INT(Clock / 50)
Go = 1
Man = 1
x = 16: y = 20
a1 = 12: b1 = 18
a2 = 12: b2 = 19
a3 = 12: b3 = 20
a4 = 12: b4 = 21
DO
CALL MovePacman(board(), x, y, Man)
Count = Count + 1
IF Go = 1 THEN
IF Count > Clock THEN
l = l + 1
IF l > 5 THEN
IF x > a1 THEN f = 2
IF x < a1 THEN f = 1
ELSE
f = 1
END IF
CALL MoveGhost(board(), a1, b1, 1, f)
CALL MoveGhost(board(), a2, b2, 2, f)
CALL MoveGhost(board(), a3, b3, 3, f)
CALL MoveGhost(board(), a4, b4, 4, f)
Count = 0
END IF
IF a1 = x AND b1 = y OR a2 = x AND b2 = y OR a3 = x AND b3 = y OR a4 = x AND 4 = y THEN
LOCATE 14, 15: PRINT " GAME OVER! "
PLAY "GFED"
END
END IF
END IF
IF board(x, y) = 249 THEN
score = score + 10
board(x, y) = 0
END IF
IF board(x, y) = 15 THEN
score = score + 100
board(x, y) = 0
Go = 0
END IF
IF Go = 0 THEN CALL FreezeGhosts(Pcount, Go, Clock * 25)
LOCATE 14, 15: PRINT "Score:"; score
IF score = 3230 THEN
LOCATE 14, 15
PLAY "BCD"
PRINT "Y O U W I N"
END
END IF
LOOP
SUB FreezeGhosts (Pcount, Go, Clock)
Pcount = Pcount + 1
IF Pcount = Clock THEN
Go = 1
Pcount = 0
END IF
END SUB
SUB InitBoard (board())
FOR x = 1 TO 40
board(1, x) = 219
board(23, x) = 219
IF x <= 23 THEN board(x, 1) = 219
IF x <= 23 THEN board(x, 40) = 219
IF x <= 23 THEN board(x, 2) = 219
IF x <= 23 THEN board(x, 39) = 219
NEXT x
FOR x = 14 TO 27
board(9, x) = 219
board(15, x) = 219
NEXT x
FOR x = 9 TO 15
board(x, 14) = 219
board(x, 27) = 219
NEXT x
FOR x = 4 TO 8
board(3, x) = 177
board(4, x) = 177
board(3, x + 29) = 177
board(4, x + 29) = 177
board(20, x) = 177
board(21, x) = 177
board(20, x + 29) = 177
board(21, x + 29) = 177
NEXT x
FOR x = 13 TO 28
board(3, x) = 177
board(4, x) = 177
NEXT x
FOR x = 6 TO 11
FOR y = 5 TO 8
board(x, y) = 177
board(x, y + 28) = 177
board(x + 7, y) = 177
board(x + 7, y + 28) = 177
NEXT y
NEXT x
FOR x = 2 TO 4
board(x, 10) = 177
board(x, 11) = 177
board(x, 30) = 177
board(x, 31) = 177
NEXT x
FOR x = 10 TO 12
board(6, x) = 177
board(7, x) = 177
board(6, x + 19) = 177
board(7, x + 19) = 177
NEXT x
FOR x = 14 TO 27
board(6, x) = 177
board(7, x) = 177
NEXT x
FOR x = 9 TO 11
FOR y = 9 TO 12
board(x, y) = 177
board(x, y + 20) = 177
board(x + 4, y) = 177
board(x + 4, y + 20) = 177
NEXT y
NEXT x
FOR x = 10 TO 14
board(17, x) = 177
board(18, x) = 177
board(20, x) = 177
board(21, x) = 177
board(17, x + 17) = 177
board(18, x + 17) = 177
board(20, x + 17) = 177
board(21, x + 17) = 177
NEXT x
FOR x = 16 TO 25
board(17, x) = 177
board(18, x) = 177
board(20, x) = 177
board(21, x) = 177
NEXT x
FOR x = 6 TO 9
board(x, 3) = 219
board(x, 38) = 219
board(x + 9, 3) = 219
board(x + 9, 38) = 219
NEXT x
FOR x = 1 TO 3
board(11, x) = 219
board(13, x) = 219
board(11, x + 37) = 219
board(13, x + 37) = 219
NEXT x
FOR x = 10 TO 14 STEP 2
FOR y = 1 TO 2
board(x, y) = 32
board(x, y + 38) = 32
NEXT y
NEXT x
FOR x = 18 TO 23
board(9, x) = 223
NEXT x
board(12, 3) = 219
board(12, 38) = 219
board(3, 3) = 15
board(3, 38) = 15
board(21, 3) = 15
board(21, 38) = 15
END SUB
SUB InitDots (board())
FOR x = 1 TO 23
FOR y = 1 TO 40
IF board(x, y) = 0 THEN board(x, y) = 249
NEXT y
NEXT x
FOR x = 10 TO 14
FOR y = 15 TO 26
board(x, y) = 0
NEXT y
NEXT x
board(16, 20) = 0
END SUB
SUB MoveGhost (board(), x, y, g, f)
RANDOMIZE TIMER
z = INT(RND * 4) + 1
IF board(x, y) = 15 THEN COLOR 11 ELSE COLOR 15
SELECT CASE f
CASE 1
IF board(x - 1, y) <> 219 AND board(x - 1, y) <> 177 THEN
LOCATE x, y: PRINT CHR$(board(x, y))
x = x - 1
END IF
CASE 2
IF board(x + 1, y) <> 219 AND board(x + 1, y) <> 177 AND board(x + 1, y) <> 23 THEN
LOCATE x, y: PRINT CHR$(board(x, y))
x = x + 1
END IF
END SELECT
SELECT CASE z
CASE 1 TO 2
IF board(x, y - 1) <> 219 AND board(x, y - 1) <> 177 THEN
LOCATE x, y: PRINT CHR$(board(x, y))
IF board(x, y) = 32 AND y = 1 THEN y = 40 ELSE y = y - 1
END IF
CASE 3 TO 4
IF y = 40 THEN
LOCATE x, y: PRINT CHR$(board(x, y))
y = 1
ELSEIF board(x, y + 1) <> 219 AND board(x, y + 1) <> 177 THEN
LOCATE x, y: PRINT CHR$(board(x, y))
y = y + 1
END IF
END SELECT
LOCATE x, y
COLOR g
PRINT CHR$(146)
END SUB
SUB MovePacman (board(), x, y, Man)
x$ = INKEY$
SELECT CASE x$
CASE "8"
IF board(x - 1, y) <> 219 AND board(x - 1, y) <> 177 THEN
LOCATE x, y: PRINT " "
x = x - 1
END IF
IF Man = 1 THEN
Man$ = "C"
Man = 0
ELSE
Man$ = "O"
Man = 1
END IF
CASE "2"
IF board(x + 1, y) <> 219 AND board(x + 1, y) <> 177 AND board(x + 1, y) <> 23 THEN
LOCATE x, y: PRINT " "
x = x + 1
END IF
IF Man = 1 THEN
Man$ = "C"
Man = 0
ELSE
Man$ = "O"
Man = 1
END IF
CASE "4"
IF board(x, y - 1) <> 219 AND board(x, y - 1) <> 177 THEN
LOCATE x, y: PRINT " "
IF board(x, y) = 32 AND y = 1 THEN y = 40 ELSE y = y - 1
END IF
IF Man = 1 THEN
Man$ = "C"
Man = 0
ELSE
Man$ = "O"
Man = 1
END IF
CASE "6"
IF y = 40 THEN
LOCATE x, y: PRINT " "
y = 1
ELSEIF board(x, y + 1) <> 219 AND board(x, y + 1) <> 177 THEN
LOCATE x, y: PRINT " "
y = y + 1
END IF
IF Man = 1 THEN
Man$ = "C"
Man = 0
ELSE
Man$ = "O"
Man = 1
END IF
END SELECT
LOCATE x, y
COLOR 14
PRINT Man$
END SUB
SUB PrintBoard (board())
FOR x = 1 TO 23
FOR y = 1 TO 40
IF board(x, y) = 219 THEN COLOR 1
IF board(x, y) = 177 THEN COLOR 4
IF board(x, y) = 249 THEN COLOR 15
IF board(x, y) = 223 THEN COLOR 15
IF board(x, y) = 15 THEN COLOR 11
LOCATE x, y
PRINT CHR$(board(x, y))
NEXT y
NEXT x
END SUB
SUB SetSpeed (Clock)
a$ = TIME$
DO WHILE a$ = TIME$: LOOP
a$ = TIME$
DO WHILE a$ = TIME$
Clock = Clock + 1
LOOP
END SUB
Worked great on anything up to an early Pentium, but my CPU slowdown trick didn't work too well on newer machines.
There's a reason I'm not a programmer today!