'===========================================================================
' Subject: DOILEY II (SLIDING PUZZLE GAME)    Date: 02-02-93 (00:00)       
'  Author: David Joffe                        Code: QB, QBasic, PDS        
'  Origin: Dj1@pixie.co.za                  Packet: GAMES.ABC
'===========================================================================
'/ÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ\
'³   ù-+-ù   ³  David Joffe '93/02/02                       ³
'³ Doiley II ³  dj1@pixie.co.za                             ³
'³   ù-+-ù   ³  http://www.geocities.com/SoHo/Lofts/2018    ³
'ÃÄÄÄÄÄÄÄÄÄÄÄÙ                                              ³
'³ This is one of the earliest things I wrote; back in high ³
'³ when I had just started programming. It runs on QBasic.  ³
'³ I am adding comments; hope someone finds it useful.      ³
'³                                 - David (March 1997)     ³
'³ Oh yes - my best time is 19 seconds.                     ³
'\ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ/

' Set default variable type to integer, for speed.
DEFINT A-Z

DECLARE SUB delay (ticks!)

' Data. rand is the 4x4 grid of letters. I have no idea why I called
' it rand.
DIM rand(4, 4), grid(100, 100) AS STRING * 1
DIM high(10) AS STRING * 39, hight(10)

' Initialize random number generator with TIMER as the seed.
RANDOMIZE TIMER

' If cannot open hi-score file, creates new one.
ON ERROR GOTO MakeNewHighScoreList

' Try open hi-score file.
OPEN "doiley2.hst" FOR INPUT AS #1
  FOR i = 1 TO 10
    INPUT #1, high$(i)
    INPUT #1, hight(i)
  NEXT i
CLOSE

' Reset error handler to QBasic's default.
ON ERROR GOTO 0

WIDTH 80, 25: CLS : COLOR 15, 9

'===== Draw opening screen: ======================================
PRINT "  É" + STRING$(74, 205) + "»  "
PRINT "ÉÍÎÍ»" + SPACE$(70) + "ÉÍÎÍ»"
PRINT "º ÈÍ¼" + SPACE$(70) + "ÈÍ¼ º"
FOR i = 1 TO 17
  PRINT "º" + SPACE$(78) + "º"
NEXT i
PRINT "º ÉÍ»" + SPACE$(70) + "ÉÍ» º"
PRINT "ÈÍÎÍ¼" + SPACE$(70) + "ÈÍÎÍ¼"
PRINT "  È" + STRING$(74, 205) + "¼  "
COLOR 14, 0
LOCATE 2, 31: PRINT "É" + STRING$(18, 205) + "»"
LOCATE , 11: PRINT "É" + STRING$(19, 205) + "¹  "; : COLOR 12: PRINT "Welcome to ..."; : COLOR 14: PRINT "  ÌÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»"
LOCATE , 11: PRINT "º"; : COLOR 13: PRINT " ÉÍËÍÍÍÍ»"; : COLOR 14: PRINT "          ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ¼"; : COLOR 13: PRINT "   ÍÍÍÍËÍÍÍÍÍËÍÍÍÍ "; : COLOR 14: PRINT "º"
LOCATE , 11: PRINT "º"; : COLOR 13: PRINT "   º    º         "; CHR$(2); "  Í»                       º     º     "; : COLOR 14: PRINT "º"
LOCATE , 11: PRINT "º"; : COLOR 13: PRINT "   º    º ÉÍÍÍÍ» Í»   º  ÉÍÍÍÍ» Ë    Ë        º     º     "; : COLOR 14: PRINT "º"
LOCATE , 11: PRINT "º"; : COLOR 13: PRINT "   º    º º    º  º   º  ÌÍÍÍÍ¼ º    º        º     º     "; : COLOR 14: PRINT "º"
LOCATE , 11: PRINT "º"; : COLOR 13: PRINT " ÈÍÊÍÍÍÍ¼ ÈÍÍÍÍ¼ ÍÊÍ ÍÊÍ ÈÍÍÍÍ¼ ÈÍÍÍÍ¹    ÍÍÍÍÊÍÍÍÍÍÊÍÍÍÍ "; : COLOR 14: PRINT "º"
LOCATE , 11: PRINT "º"; : COLOR 13: PRINT " " + STRING$(36, 205) + "¼                    "; : COLOR 14: PRINT "º"
LOCATE , 11: PRINT "È" + STRING$(58, 205) + "¼"
COLOR 0, 9: LOCATE 11, 13: PRINT STRING$(60, 178)
FOR i = 4 TO 10
  LOCATE i, 71: PRINT "²²"
NEXT i
SOUND 65, .5
delay .5
COLOR 14, 0
LOCATE 14, 21: PRINT "É" + STRING$(37, 205) + "»"
LOCATE , 21: PRINT "º              "; : COLOR 10: PRINT "ver 2.00"; : COLOR 14: PRINT "               º"
LOCATE , 21: PRINT "º" + SPACE$(37) + "º"
LOCATE , 21: PRINT "º      "; : COLOR 13: PRINT "(C) Djoffe Software 1993 "; : COLOR 14: PRINT "      º"
LOCATE , 21: PRINT "º" + SPACE$(37) + "º"
LOCATE , 21: PRINT "º          "; : COLOR 12: PRINT CHR$(15) + " David Joffe " + CHR$(15); : COLOR 14: PRINT "            º"
LOCATE , 21: PRINT "È" + STRING$(37, 205) + "¼"
COLOR 0, 9: LOCATE 21, 23: PRINT STRING$(39, 178)
FOR i = 15 TO 20
  LOCATE i, 60: PRINT "²²"
NEXT i
SOUND 65, .5: delay .5
'=================================================================
' Wait for keypress
WHILE INKEY$ = "": WEND

COLOR 1, 15
FOR i = 2 TO 21
   ' print string of solid blocks (Û)
   LOCATE i, 11: PRINT STRING$(62, 219)
   IF i = 13 THEN SOUND 65, .5: delay .45
NEXT i
SOUND 65, .5: delay .5

IntroScreen:
COLOR 14, 0
LOCATE 3, 14: PRINT "É" + STRING$(51, 205) + "»"
LOCATE , 14: PRINT "º"; : COLOR 10: PRINT " ÉÍ»"; : COLOR 13: PRINT "  ÉÍÍÍ»       º     þ                    "; : COLOR 10: PRINT "  ÉÍ» "; : COLOR 14: PRINT "º"
LOCATE , 14: PRINT "º"; : COLOR 10: PRINT " ÈÍ¼"; : COLOR 13: PRINT "  º   º ÉÍÍÍ» ÎÍÍ  Í»  ÉÍÍÍ» ËÍÍÍ» ÉÍÍ» Ü"; : COLOR 10: PRINT "  ÈÍ¼ "; : COLOR 14: PRINT "º"
LOCATE , 14: PRINT "º    "; : COLOR 13: PRINT "  º   º º   º º     º  º   º º   º ÈÍÍ» Ü"; : COLOR 14: PRINT "      º"
LOCATE , 14: PRINT "º    "; : COLOR 13: PRINT "  ÈÍÍÍ¼ ÌÍÍÍ¼ ÈÍÍÍ  º  ÈÍÍÍ¼ Ê   Ê ÈÍÍ¼  "; : COLOR 14: PRINT "      º"
LOCATE , 14: PRINT "º    "; : COLOR 13: PRINT " ÍÍÍÍÍÍÍÊÍÍÍÍÍÍÍÍÍÍÍÊ" + STRING$(19, 205) + " "; : COLOR 14: PRINT "      º"
LOCATE , 14: PRINT "º" + SPACE$(51) + "º"
LOCATE , 14: PRINT "º"; : COLOR 12: PRINT SPACE$(15) + "1.  Play Doiley II                 "; : COLOR 14: PRINT " º"
LOCATE , 14: PRINT "º" + SPACE$(51) + "º"
LOCATE , 14: PRINT "º"; : COLOR 12: PRINT SPACE$(15) + "2.  View High Scores                "; : COLOR 14: PRINT "º"
LOCATE , 14: PRINT "º" + SPACE$(51) + "º"
LOCATE , 14: PRINT "º"; : COLOR 12: PRINT SPACE$(15) + "3.  Instructions                    "; : COLOR 14: PRINT "º"
LOCATE , 14: PRINT "º" + SPACE$(51) + "º"
LOCATE , 14: PRINT "º"; : COLOR 12: PRINT SPACE$(15) + "4.  Quit                            "; : COLOR 14: PRINT "º"
LOCATE , 14: PRINT "º"; : COLOR 10: PRINT " ÉÍ»                                           ÉÍ» "; : COLOR 14: PRINT "º"
LOCATE , 14: PRINT "º"; : COLOR 10: PRINT " ÈÍ¼        "; : COLOR 9: PRINT "(C) Djoffe Software 1993"; : COLOR 10: PRINT "           ÈÍ¼ "; : COLOR 14: PRINT "º"
LOCATE , 14: PRINT "È" + STRING$(51, 205) + "¼"
COLOR 0, 9: LOCATE 20, 16: PRINT STRING$(52, 178)
FOR i = 4 TO 19
  LOCATE i, 67: PRINT "²²"
NEXT i
SOUND 65, .5: delay .5

HaveWonTrue = 0

' Intro here, I think, should actually be "Menu"
IntroLoop:
  ' read keyboard
  a$ = INKEY$
  SELECT CASE a$
    CASE "": GOTO IntroLoop
    CASE "1": GOTO PlayDoiley
    CASE "2": GOTO HighScoreDraw
    CASE "3": GOTO Instructions
    CASE "4": GOTO QuitDoiley
  END SELECT
GOTO IntroLoop

Instructions:
  GOSUB ClearScreen
  COLOR 14, 0
  LOCATE 2, 10: PRINT "ÉÍ» É" + STRING$(52, 205) + "» ÉÍ»"
  LOCATE , 10: PRINT "ÈÍ¼ º"; : COLOR 13: PRINT "          ÍËÍÍÍ»        þ  Í»                      "; : COLOR 14: PRINT " º ÈÍ¼"
  LOCATE , 10: PRINT "ÉÍÍÍ¼"; : COLOR 13: PRINT "           º   º ÉÍÍÍ» Í»   º  ÉÍÍÍ» Ë   Ë         "; : COLOR 14: PRINT " ÈÍÍÍ»"
  LOCATE , 10: PRINT "º"; : COLOR 13: PRINT "               º   º º   º  º   º  ÌÍÍÍ¼ º   º              "; : COLOR 14: PRINT "º"
  LOCATE , 10: PRINT "º"; : COLOR 13: PRINT "              ÍÊÍÍÍ¼ ÈÍÍÍ¼ ÍÊÍ ÍÊÍ ÈÍÍÍ¼ ÈÍÍÍ¹              "; : COLOR 14: PRINT "º"
  LOCATE , 10: PRINT "º"; : COLOR 13: PRINT "            È" + STRING$(32, 205) + "¼              "; : COLOR 14: PRINT "º"
  LOCATE , 10: PRINT "º"; : COLOR 12: PRINT "                         ver 2.00                           "; : COLOR 14: PRINT "º"
  LOCATE , 10: PRINT "º"; : COLOR 10: PRINT "                   (C) Djoffe Software                      "; : COLOR 14: PRINT "º"
  LOCATE , 10: PRINT "º" + SPACE$(60) + "º"
  LOCATE , 10: PRINT "º"; : COLOR 11: PRINT "    " + STRING$(52, 45) + "    "; : COLOR 14: PRINT "º"
  LOCATE , 10: PRINT "º"; : COLOR 11: PRINT "     The aim of Doiley is to arrange the letters in the     "; : COLOR 14: PRINT "º"
  LOCATE , 10: PRINT "º"; : COLOR 11: PRINT "    grid in alphabetical order. Use the keys to position    "; : COLOR 14: PRINT "º"
  LOCATE , 10: PRINT "º"; : COLOR 11: PRINT "     the cursor over the piece you would like to shift.     "; : COLOR 14: PRINT "º"
  LOCATE , 10: PRINT "º"; : COLOR 11: PRINT "        Then hit your 'Shuffle' button and the piece        "; : COLOR 14: PRINT "º"
  LOCATE , 10: PRINT "º"; : COLOR 11: PRINT "                   will slide into place.                   "; : COLOR 14: PRINT "º"
  LOCATE , 10: PRINT "º"; : COLOR 11: PRINT "    " + STRING$(52, 45) + "    "; : COLOR 14: PRINT "º"
  LOCATE , 10: PRINT "ÈÍÍÍ»" + SPACE$(52) + "ÉÍÍÍ¼"
  LOCATE , 10: PRINT "ÉÍ» º" + SPACE$(52) + "º ÉÍ»"
  LOCATE , 10: PRINT "ÈÍ¼ È" + STRING$(52, 205) + "¼ ÈÍ¼"
  COLOR 0, 9: LOCATE 21, 12: PRINT STRING$(62, 178)
  FOR i = 3 TO 20
    LOCATE i, 72: PRINT "²²"
  NEXT i
  SOUND 65, .5
  COLOR 9, 0
 
  gr = 15
  ' Here is an example of bad programming. When I first started
  ' programming, the value of meaningful identifier names hadn't
  ' quite sunk in yet :-)
LoopiDeLoop:
    ' Waits for keypress while animating little blue block
    a$ = INKEY$
    LOCATE 19, gr: PRINT " ": LOCATE 19, 80 - gr + 1: PRINT " "
    gr = gr + 1
    IF gr = 41 THEN gr = 15
    LOCATE 19, gr: PRINT "þ": LOCATE 19, 80 - gr + 1: PRINT "þ"
    delay .01
    IF a$ <> "" THEN
      GOSUB ClearScreen
      GOTO IntroScreen
    END IF
GOTO LoopiDeLoop

' Hmmm... seems I spent most the time in this program drawing fancy
' screens.
QuitDoiley:
  GOSUB ClearScreen
  COLOR 14, 0
  LOCATE 2, 10: PRINT "ÉÍ» É" + STRING$(52, 205) + "» ÉÍ»"
  LOCATE , 10: PRINT "ÈÍ¼ º                   Quitting ...                     º ÈÍ¼"
  LOCATE , 10: PRINT "ÉÍÍÍ¼"; : COLOR 13: PRINT "          ÍËÍÍÍ»        þ  Í»                      "; : COLOR 14: PRINT " ÈÍÍÍ»"
  LOCATE , 10: PRINT "º"; : COLOR 13: PRINT "               º   º ÉÍÍÍ» Í»   º  ÉÍÍÍ» Ë   Ë              "; : COLOR 14: PRINT "º"
  LOCATE , 10: PRINT "º"; : COLOR 13: PRINT "               º   º º   º  º   º  ÌÍÍÍ¼ º   º              "; : COLOR 14: PRINT "º"
  LOCATE , 10: PRINT "º"; : COLOR 13: PRINT "              ÍÊÍÍÍ¼ ÈÍÍÍ¼ ÍÊÍ ÍÊÍ ÈÍÍÍ¼ ÈÍÍÍ¹              "; : COLOR 14: PRINT "º"
  LOCATE , 10: PRINT "º"; : COLOR 13: PRINT "            È" + STRING$(32, 205) + "¼              "; : COLOR 14: PRINT "º"
  LOCATE , 10: PRINT "º"; : COLOR 10: PRINT "                         ver 2.00                           "; : COLOR 14: PRINT "º"
  LOCATE , 10: PRINT "º"; : COLOR 9: PRINT "                   (C) Djoffe Software                      "; : COLOR 14: PRINT "º"
  LOCATE , 10: PRINT "º" + SPACE$(60) + "º"
  LOCATE , 10: PRINT "º"; : COLOR 12: PRINT "  ÉÍÍ»            Ë   Ë            ÉÍÍÍ»            ÉÍÍÍ»   "; : COLOR 14: PRINT "º"
  LOCATE , 10: PRINT "º"; : COLOR 12: PRINT "  ÌÍÍ¹ÉÍÍ»ÉÍÍ»    º   ºÉÍÍ»Ë  Ë    ÈÍÍÍ»Ë  ËÉÍÍ»ÉÍÍ»  ÉÍ¼   "; : COLOR 14: PRINT "º"
  LOCATE , 10: PRINT "º"; : COLOR 12: PRINT "  Ê  ÊÊ   ÈÍÍ     ÈÍÍÍ¹ÈÍÍ¼ÈÍÍ¼    ÈÍÍÍ¼ÈÍÍ¼Ê   ÈÍÍ   þ     "; : COLOR 14: PRINT "º"
  LOCATE , 10: PRINT "º"; : COLOR 12: PRINT "                  ÍÍÍÍ¼                                     "; : COLOR 14: PRINT "º"
  t$ = SPACE$(22) + "º"
  LOCATE , 10: PRINT "º" + SPACE$(19) + "ÉÍÍ             ÍÍ»" + t$
  LOCATE , 10: PRINT "º" + SPACE$(19) + "º Ë   Ë     ÉÍ» Ë º" + t$
  LOCATE , 10: PRINT "º" + SPACE$(19) + "º ÈÍÍÍ¹  þ  º º º º" + t$
  LOCATE , 10: PRINT "ÈÍÍÍ»               º ÍÍÍÍ¼     Ê ÈÍ¼ º" + SPACE$(18) + "ÉÍÍÍ¼"
  LOCATE , 10: PRINT "ÉÍ» º               ÈÍÍ             ÍÍ¼" + SPACE$(18) + "º ÉÍ»"
  LOCATE , 10: PRINT "ÈÍ¼ È" + STRING$(52, 205) + "¼ ÈÍ¼"
  COLOR 0, 9: LOCATE 22, 12: PRINT STRING$(62, 178)
  FOR i = 3 TO 21
    LOCATE i, 72: PRINT "²²"
  NEXT i
  SOUND 65, .5
QuitLoop:
    a$ = INKEY$
    SELECT CASE a$
      CASE "": GOTO QuitLoop
      CASE "Y", "y"
        COLOR 1, 15
        FOR i = 2 TO 22
          LOCATE i, 10: PRINT STRING$(64, 219)
        NEXT i
        SOUND 65, .5
        COLOR 15, 0: CLS
        t$ = "        "
        PRINT t$ + "É" + STRING$(58, 205) + "»"
        PRINT t$ + "º" + SPACE$(19) + "Thank you for playing" + SPACE$(18) + "º"
        PRINT t$ + "º       ÍËÍÍÍ»        þ  Í»                ÍÍËÍÍÍËÍÍ       º"
        PRINT t$ + "º        º   º ÉÍÍÍ» Í»   º  ÉÍÍÍ» Ë   Ë     º   º         º"
        PRINT t$ + "º        º   º º   º  º   º  ÌÍÍÍ¼ º   º     º   º         º"
        PRINT t$ + "º       ÍÊÍÍÍ¼ ÈÍÍÍ¼ ÍÊÍ ÍÊÍ ÈÍÍÍ¼ ÈÍÍÍ¹   ÍÍÊÍÍÍÊÍÍ       º"
        PRINT t$ + "º      " + STRING$(32, 205) + "¼" + SPACE$(19) + "º"
        PRINT t$ + "º         From all of us here at Djoffe Software,          º"
        PRINT t$ + "º" + SPACE$(19) + "HAVE A NICE DAY!" + SPACE$(23) + "º"
        PRINT t$ + "È" + STRING$(58, 205) + "¼"
        PRINT
        ' Addition March 1997:
        COLOR 15, 0
        PRINT t$ + "ùÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄù"
        COLOR 14, 0
        PRINT t$ + " ³ °±²ÛÛ²±°  Notes added March 1997:  °±²ÛÛ²±° ³"
        COLOR 10, 0
        PRINT t$ + " ³ Djoffe Software is no more; due to people's ³"
        PRINT t$ + " ³ general inability to pronounce it correctly.³"
        COLOR 12, 0
        PRINT t$ + " ³ It is now called DJ Software.               ³"
        COLOR 11, 0
        PRINT t$ + " ³-- Author info: -----------------------------³"
        COLOR 9, 0
        PRINT t$ + " ³ þ David Joffe               dj1@pixie.co.za ³"
        PRINT t$ + " ³ þ http://www.geocities.com/SoHo/Lofts/2018/ ³"
        COLOR 15, 0
        PRINT t$ + "ùÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄù"
        END
      CASE "N", "n"
        COLOR 1, 15
        FOR i = 2 TO 22
          LOCATE i, 10: PRINT STRING$(64, 219)
        NEXT i
        SOUND 65, .5: delay .5
        GOTO IntroScreen
    END SELECT
GOTO QuitLoop

PlayDoiley:
  GOSUB ClearScreen
  COLOR 14, 0
  LOCATE 7, 15: PRINT "É" + STRING$(49, 205) + "»"
  LOCATE , 15: PRINT "º ÉÍÍÍ» Ë           ÉÍÍÍ ÉÍÍÍ Í»  þ               º"
  LOCATE , 15: PRINT "º ÈÍÍÍ» ÌÍÍÍ» Ë   Ë ÌÍÍ  ÌÍÍ   º  » ÉÍÍÍ» ÉÍÍÍË   º"
  LOCATE , 15: PRINT "º ÈÍÍÍ¼ Ê   Ê ÈÍÍÍ¼ Ê    Ê    ÍÊÍ Ê Ê   Ê ÈÍÍÍ¹   º"
  LOCATE , 15: PRINT "º            ÉÍÍÍ»       þ     Ë          ÍÍÍÍ¼   º"
  LOCATE , 15: PRINT "º            º  Í» ÉÍÍÍ» » ÉÍÍÍ¹" + SPACE$(18) + "º"
  LOCATE , 15: PRINT "º            ÈÍÍÍ¼ Ê     Ê ÈÍÍÍ¼ Í Í Í            º"
  LOCATE , 15: PRINT "È" + STRING$(49, 205) + "¼"
  COLOR 0, 9: LOCATE 15, 17: PRINT STRING$(51, 178)
  FOR i = 8 TO 15
    LOCATE i, 66: PRINT "²²"
  NEXT i
  SOUND 65, .5: delay .5

  ' Create grid unshuffled
  tel = 1
  FOR i = 1 TO 4
    FOR z = 1 TO 4
      rand(i, z) = tel
      tel = tel + 1
      NEXT z
  NEXT i
 
  ' This .. um .. er .. shuffles the grid.
  x = 4: y = 4
  FOR i = 1 TO 2000
RandomANumber:
    num = INT(RND * 4) + 1
    ' Generate a random direction to shuffle space
    SELECT CASE num
      CASE 1: xd = 1: yd = 0
      CASE 2: xd = -1: yd = 0
      CASE 3: xd = 0: yd = 1
      CASE 4: xd = 0: yd = -1
    END SELECT
Shuffle:
    IF x + xd > 4 OR y + yd > 4 OR x + xd < 1 OR y + yd < 1 THEN GOTO RandomANumber
    SWAP rand(x, y), rand(x + xd, y + yd)
    x = x + xd: y = y + yd
  NEXT i

  ' Get the space back to the corner
  WHILE x < 4
    SWAP rand(x, y), rand(x + 1, y): x = x + 1
  WEND
  WHILE y < 4
    SWAP rand(x, y), rand(x, y + 1): y = y + 1
  WEND

  GOSUB ClearScreen
  COLOR 14, 0
  LOCATE 3, 8: PRINT "ÉÍÍÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍ»"
  FOR ii = 1 TO 3
    FOR i = 1 TO 3
      LOCATE , 8: PRINT "º         ³         ³         ³         º"
    NEXT i
    LOCATE , 8: PRINT "ÇÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄ¶"
  NEXT ii
  FOR i = 1 TO 3
    LOCATE , 8: PRINT "º         ³         ³         ³         º"
  NEXT i
  LOCATE , 8: PRINT "ÈÍÍÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍ¼"
  COLOR 0, 9: LOCATE 20, 10: PRINT STRING$(41, 178)
  FOR i = 4 TO 19
    LOCATE i, 49: PRINT "²²"
  NEXT i

  LOCATE 16, 40: PRINT "²"; : COLOR 13, 0: PRINT "ÚÄÄÄ¿"; : COLOR 0, 9: PRINT "²"
  LOCATE , 40: PRINT "²"; : COLOR 13, 0: PRINT "³"; : COLOR 0, 9: PRINT "   "; : COLOR 13, 9: PRINT "³"; : COLOR 0, 9: PRINT " "
  LOCATE , 40: PRINT "²"; : COLOR 13, 0: PRINT "À"; : COLOR 13, 9: PRINT "ÄÄÄÙ"; : COLOR 0, 9: PRINT " "

  SOUND 65, .5: delay .5

  COLOR 14, 0
  LOCATE 12
  t$ = "ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ"
  LOCATE , 55: PRINT "É" + t$ + "»"
  FOR i = 1 TO 6
    LOCATE , 55: PRINT "º                º"
  NEXT i
  LOCATE , 55: PRINT "È" + t$ + "¼"
  COLOR 10
  LOCATE 13, 56: PRINT "ËÍÍ»   þ»       "
  LOCATE , 56: PRINT "º  ºÉÍ»»ºÉÍ»Ë  Ë"
  LOCATE , 56: PRINT "ÊÍÍ¼ÈÍ¼ÊÊÈÍ ÈÍÍ¹"
  LOCATE , 56: PRINT "ÍÍÍÍÍËÍÍÍÍËÍÍÍÍ¼"
  LOCATE , 56: PRINT "     º    º     "
  LOCATE , 56: PRINT "ÍÍÍÍÍÊÍÍÍÍÊÍÍÍÍÍ"

  COLOR 0, 9: LOCATE 20, 57: PRINT STRING$(18, 178)
  FOR i = 13 TO 20
    LOCATE i, 73: PRINT "²²"
  NEXT i
  SOUND 65, .5: delay .5

  COLOR 14, 0
  LOCATE 3, 55: PRINT "É" + t$ + "»"
  LOCATE , 55: PRINT "º  Your Time:    º"
  LOCATE , 55: PRINT "Ì" + t$ + "¹"
  FOR i = 1 TO 3
  LOCATE , 55: PRINT "º                º": NEXT i
  LOCATE , 55: PRINT "È" + t$ + "¼"
  Speed = -1: GOSUB SpeedUpDate
  COLOR 0, 9: LOCATE 10, 57: PRINT STRING$(18, 178)
  FOR i = 4 TO 10
    LOCATE i, 73: PRINT "²²"
  NEXT i
  SOUND 65, .5: delay .5

  COLOR 15, 0
  FOR i = 5 TO 17 STEP 4
     FOR z = 13 TO 43 STEP 10
       grid$(i, z) = CHR$(rand((i - 1) / 4, (z - 3) / 10) + 64)
       LOCATE i, z: IF grid$(i, z) <> "P" THEN PRINT grid$(i, z)
     NEXT z
  NEXT i

  grid$(17, 43) = " "
  COLOR 0, 9: LOCATE 17, 43: PRINT " "

  x = 17: y = 43
  p = 17: t = 43
  winner = 0: Speed = 0: HaveWonTrue = 0
  t$ = TIME$

MainLoop:
    ' Stop counting seconds at 1000
    IF Speed < 1000 THEN GOSUB ChkTime
    a$ = INKEY$
    SELECT CASE a$
      CASE "": GOTO MainLoop
      ' left
      CASE CHR$(0) + "K": xd = 0: yd = -10: GOTO UpdateCursor
      ' right
      CASE CHR$(0) + "M": xd = 0: yd = 10: GOTO UpdateCursor
      ' up
      CASE CHR$(0) + "H": xd = -4: yd = 0: GOTO UpdateCursor
      ' down
      CASE CHR$(0) + "P": xd = 4: yd = 0: GOTO UpdateCursor
      ' escape
      CASE CHR$(27): GOSUB ClearScreen: GOTO IntroScreen
      CASE " ": GOTO Swop
    END SELECT
  GOTO MainLoop

UpdateCursor:
  IF Speed < 1000 THEN GOSUB ChkTime
  IF x + xd > 17 OR x + xd < 5 OR y + yd > 43 OR y + yd < 13 THEN GOTO MainLoop
  GOSUB ChkStateOfCursor
  x = x + xd: y = y + yd
  IF grid$(x, y) = " " THEN
    COLOR 0, 9
    LOCATE x - 1, y - 3: PRINT "²"; : COLOR 13, 0: PRINT "ÚÄÄÄ¿"; : COLOR 0, 9: PRINT "²"
    LOCATE x, y - 3: PRINT "²"; : COLOR 13, 0: PRINT "³"; : COLOR 0, 9: PRINT "   "; : COLOR 13, 9: PRINT "³"; : COLOR 0, 9: PRINT " "
    LOCATE x + 1, y - 3: PRINT "²"; : COLOR 13, 0: PRINT "À"; : COLOR 13, 9: PRINT "ÄÄÄÙ"; : COLOR 0, 9: PRINT " "
  ELSE
    COLOR 13, 0: LOCATE x - 1, y - 2: PRINT "ÚÄÄÄ¿"
    LOCATE x, y - 2: PRINT "³": LOCATE x, y + 2: PRINT "³"
    LOCATE x + 1, y - 2: PRINT "ÀÄÄÄÙ"
  END IF

' All these GOTO's are BAD PROGRAMMING!!!
GOTO MainLoop

ChkStateOfCursor:
  IF grid$(x, y) <> " " THEN
    LOCATE x - 1, y - 2: PRINT "     "
    LOCATE x, y - 2: PRINT " ": LOCATE x, y + 2: PRINT " "
    LOCATE x + 1, y - 2: PRINT "     "
  END IF
  IF grid$(x, y) = " " THEN
    COLOR 0, 9

    LOCATE x - 1, y - 2: PRINT "²²²²²"
    LOCATE x, y - 2: PRINT "²"
    LOCATE x, y + 2: PRINT " "
    LOCATE x + 1, y - 2: PRINT "²    "
  END IF
RETURN

Swop:
  IF Speed < 1000 THEN GOSUB ChkTime
  IF grid$(x - 4, y) = " " THEN SWAP grid$(x - 4, y), grid$(x, y): xd = -4: yd = 0: GOTO Redraw
  IF grid$(x + 4, y) = " " THEN SWAP grid$(x + 4, y), grid$(x, y): xd = 4: yd = 0: GOTO Redraw
  IF grid$(x, y - 10) = " " THEN SWAP grid$(x, y - 10), grid$(x, y): xd = 0: yd = -10: GOTO Redraw
  IF grid$(x, y + 10) = " " THEN SWAP grid$(x, y + 10), grid$(x, y): xd = 0: yd = 10: GOTO Redraw
GOTO MainLoop

Redraw:
  IF Speed < 1000 THEN GOSUB ChkTime
  COLOR 0, 9
  LOCATE x - 1, y - 3: PRINT "²"; : COLOR 13, 0: PRINT "ÚÄÄÄ¿"; : COLOR 0, 9: PRINT "²"
  LOCATE x, y - 3: PRINT "²"; : COLOR 13, 0: PRINT "³"; : COLOR 0, 9: PRINT "   "; : COLOR 13, 9: PRINT "³"; : COLOR 0, 9: PRINT " "
  LOCATE x + 1, y - 3: PRINT "²"; : COLOR 13, 0: PRINT "À"; : COLOR 13, 9: PRINT "ÄÄÄÙ"; : COLOR 0, 9: PRINT " "
  COLOR 15, 0
  LOCATE x + xd - 1, y + yd - 4: PRINT "         "
  LOCATE x + xd, y + yd - 4: PRINT "    "; grid$(x + xd, y + yd); "    "
  LOCATE x + xd + 1, y + yd - 4: PRINT "         "

  ' Check if puzzle is solved
  count = 0: count2 = 0
  FOR i = 5 TO 17 STEP 4
    FOR z = 13 TO 43 STEP 10
      count2 = count2 + 1
      IF (ASC(grid$(i, z)) = count2 + 64) OR (i = 17 AND z = 43 AND grid$(i, z) = " ") THEN count = count + 1
    NEXT z
  NEXT i
  IF count = 16 THEN GOTO YouHaveWon
GOTO MainLoop

' Update the time taken display
SpeedUpDate:
  COLOR 12, 0
  Speed = Speed + 1
  sprint$ = STR$(Speed)
  lsprint = LEN(sprint$)
  sprint$ = RIGHT$(sprint$, lsprint - 1)
  lsprint = LEN(sprint$)
  FOR i = 1 TO lsprint
    sy = 67 - ((lsprint - i) * 5)
    LOCATE 6
    SELECT CASE MID$(sprint$, i, 1)
      CASE "0"
        LOCATE , sy: PRINT "ÉÍÍ»"
        LOCATE , sy: PRINT "º  º"
        LOCATE , sy: PRINT "ÈÍÍ¼"
      CASE "1"
        LOCATE , sy: PRINT " Í» "
        LOCATE , sy: PRINT "  º "
        LOCATE , sy: PRINT " ÍÊÍ"
      CASE "2"
        LOCATE , sy: PRINT "ÉÍÍ»"
        LOCATE , sy: PRINT "ÉÍÍ¼"
        LOCATE , sy: PRINT "ÈÍÍ¼"
      CASE "3"
        LOCATE , sy: PRINT "ÉÍÍ»"
        LOCATE , sy: PRINT " ÍÍ¹"
        LOCATE , sy: PRINT "ÈÍÍ¼"
      CASE "4"
        LOCATE , sy: PRINT "Ë   "
        LOCATE , sy: PRINT "º   "
        LOCATE , sy: PRINT "ÈÍÎÍ"
      CASE "5"
        LOCATE , sy: PRINT "ÉÍÍ»"
        LOCATE , sy: PRINT "ÈÍÍ»"
        LOCATE , sy: PRINT "ÈÍÍ¼"
      CASE "6"
        LOCATE , sy: PRINT "Ë   "
        LOCATE , sy: PRINT "ÌÍÍ»"
        LOCATE , sy: PRINT "ÈÍÍ¼"
      CASE "7"
        LOCATE , sy: PRINT "ÉÍÍ»"
        LOCATE , sy: PRINT "   º"
        LOCATE , sy: PRINT "   Ê"
      CASE "8"
        LOCATE , sy: PRINT "ÉÍÍ»"
        LOCATE , sy: PRINT "ÌÍÍ¹"
        LOCATE , sy: PRINT "ÈÍÍ¼"
      CASE "9"
        LOCATE , sy: PRINT "ÉÍÍ»"
        LOCATE , sy: PRINT "ÈÍÍ¹"
        LOCATE , sy: PRINT "ÈÍÍ¼"
    END SELECT
  NEXT i
RETURN

ChkTime:
  t2$ = TIME$
  ' If TIME$ hasn't changed:
  IF t$ = t2$ THEN RETURN
  ' If TIME$ has changed:
  t$ = t2$: GOSUB SpeedUpDate
RETURN

YouHaveWon:
  COLOR 1, 15
  FOR i = 2 TO 22
    LOCATE i, 8: PRINT STRING$(67, 219)
  NEXT i
 
  ' Check if you've made the high score list
  ' If so, insert your score
  HaveWonTrue = 0
  FOR i = 1 TO 10
    IF Speed <= hight(i) THEN
      HaveWonTrue = i
      ' Move all other scores below yours one down
      FOR j = 9 TO i STEP -1
        high$(j + 1) = high$(j)
        hight(j + 1) = hight(j)
      NEXT j
      hight(i) = Speed
      EXIT FOR
    END IF
  NEXT i
GOTO HighScoreDraw

' Handler that creates default high score table
MakeNewHighScoreList:
  OPEN "doiley2.hst" FOR OUTPUT AS #1
    FOR i = 1 TO 10: PRINT #1, CHR$(34) + "Joe Schmuck" + CHR$(34): PRINT #1, 999: NEXT i
  CLOSE
RESUME

HighScoreDraw:
  GOSUB ClearScreen
  COLOR 14, 0
  LOCATE 2
  LOCATE , 10: PRINT "É" + STRING$(59, 205) + "»"
  LOCATE , 10: PRINT "º"; : COLOR 13: PRINT "  ÍËÍÍÍÍ»                   ÉÍÍÍËÍÍÍ»                      "; : COLOR 14: PRINT "º"
  LOCATE , 10: PRINT "º"; : COLOR 13: PRINT "   º    º           º           º     þ                    "; : COLOR 14: PRINT "º"
  LOCATE , 10: PRINT "º"; : COLOR 13: PRINT "   ÌÍÍÍÍ¹ ÉÍÍ» ÉÍÍ» ÌÍ          º     » ÉÍËÍ» ÉÍÍ» ÉÍÍ» Ü  "; : COLOR 14: PRINT "º"
  LOCATE , 10: PRINT "º"; : COLOR 13: PRINT "   º    º ÌÍÍ¼ ÈÍÍ» º           º     º º Ê º ÌÍÍ¼ ÈÍÍ» Ü  "; : COLOR 14: PRINT "º"
  LOCATE , 10: PRINT "º"; : COLOR 13: PRINT "  ÍÊÍÍÍÍ¼ ÈÍÍÍ ÈÍÍ¼ ÈÍÍÍÍ      ÍÊÍ    Ê Ê   Ê ÈÍÍÍ ÈÍÍ¼    "; : COLOR 14: PRINT "º"
  LOCATE , 10: PRINT "Ç" + STRING$(46, 196) + "ÂÄÄÄÄÄÄÄÄÄÄÄÄ¶"
  LOCATE , 10: PRINT "º" + SPACE$(46) + "³            º"
  FOR i = 1 TO 9
    LOCATE , 10: PRINT "º"; : COLOR 12: PRINT " " + STR$(i) + "." + SPACE$(42); : COLOR 14: PRINT "³            º"
  NEXT i
  LOCATE , 10: PRINT "º"; : COLOR 12: PRINT " 10." + SPACE$(42); : COLOR 14: PRINT "³            º"
  LOCATE , 10: PRINT "º" + SPACE$(46) + "³            º"
  LOCATE , 10: PRINT "È" + STRING$(46, 205) + "ÏÍÍÍÍÍÍÍÍÍÍÍÍ¼"
  COLOR 12, 0
 
  FOR i = 1 TO 10
    ' If most recent high score list, then hi-lite it green
    IF i = HaveWonTrue THEN COLOR 10 ELSE COLOR 12
    LOCATE i + 9, 61: PRINT hight(i)
    COLOR 12, 0
    IF i <> HaveWonTrue THEN LOCATE i + 9, 16: PRINT high$(i)
  NEXT i
 
  COLOR 0, 9: LOCATE 22, 12: PRINT STRING$(61, 178)
  FOR i = 3 TO 21
    LOCATE i, 71: PRINT "²²"
  NEXT i
 
  SOUND 65, .5: delay .5
  IF HaveWonTrue <> 0 THEN
    COLOR 10, 0: LOCATE HaveWonTrue + 9, 15: PRINT SPACE$(41)
    LOCATE HaveWonTrue + 9, 15: INPUT " ", high$(HaveWonTrue)
    ' Save high score list
    OPEN "doiley2.hst" FOR OUTPUT AS #1
      FOR i = 1 TO 10: PRINT #1, CHR$(34) + high$(i) + CHR$(34): PRINT #1, hight(i): NEXT i
    CLOSE
    COLOR 12, 0: LOCATE HaveWonTrue + 9, 16: PRINT high$(HaveWonTrue)
    LOCATE HaveWonTrue + 9, 61: PRINT hight(HaveWonTrue)
  END IF
  ' Wait for keypress
  WHILE INKEY$ = "": WEND
  GOSUB ClearScreen
GOTO IntroScreen

ClearScreen:
  COLOR 1, 15
  FOR i = 2 TO 22
    LOCATE i, 6: PRINT STRING$(70, 219)
  NEXT i
  SOUND 65, .5: delay .5
RETURN

SUB delay (ticks!)
s! = TIMER
f:
d! = TIMER: IF d! < s! + ticks! THEN GOTO f
END SUB
