'===========================================================================
' Subject: MASTERMIND GAME                    Date: 11-18-98 (18:10)       
'  Author: Dominik Kaspar                     Code: QB, QBasic, PDS        
'  Origin: pedok@pop.agri.ch                Packet: GAMES.ABC
'===========================================================================
'MasterMind programmed by: Dominik Kaspar
'                          Ahornweg 15
'                          5615 Fahrwangen
'                          Switzerland     (pedok@pop.agri.ch)

DECLARE SUB IMPUT (Text$, Range!, Row!, Col!, Hide)
DECLARE SUB HighScore ()
DECLARE SUB Instructions ()
DECLARE SUB PlayGame ()
DECLARE SUB Center (Row!, Text$)
DECLARE SUB EnterPassword ()

RANDOMIZE TIMER

TYPE HighScoreTopTen
     Score  AS INTEGER
     Time   AS INTEGER
     PName  AS STRING * 20
END TYPE

DIM SHARED TopTen AS HighScoreTopTen
DIM SHARED Time
           Time = TIMER
DIM SHARED Score, PlayTime
DIM SHARED Answer$
DIM SHARED Password$, Password

MAINMENU:
 COLOR , 1
 CLS
 COLOR 14, 4
 Center 2, "Ι" + STRING$(47, 205) + "»"
 Center 3, "Ί                                               Ί"
 Center 4, "Ί   ΙΝΝΛΝΝ»  ΙΝΝΝ»  ΙΝΝΝ  ΝΝΛΝΝ  ΙΝΝΝΝ  ΙΝΝΝ»   Ί"
 Center 5, "Ί   Ί  Ί  Ί  Ί   Ί  Ί       Ί    Ί      Ί   Ί   Ί"
 Center 6, "Ί   Ί  Ί  Ί  ΜΝΝΝΉ  ΘΝΝ»    Ί    ΜΝΝ    ΜΝΝΛΌ   Ί"
 Center 7, "Ί   Ί  Ί  Ί  Ί   Ί     Ί    Ί    Ί      Ί  Ί    Ί"
 Center 8, "Ί   Ί  Ί  Ί  Ί   Ί  ΝΝΝΌ    Ί    ΘΝΝΝΝ  Ί  Ί    Ί"
 Center 9, "Ί" + STRING$(47, 32) + "Ί"
 Center 10, "Ί          ΙΝΝΛΝΝ»  Ί  ΙΝΝΝΝ»       Ί           Ί"
 Center 11, "Ί          Ί  Ί  Ί     Ί    Ί       Ί           Ί"
 Center 12, "Ί          Ί  Ί  Ί  Ί  Ί    Ί  ΙΝΝΝΝΉ  1997 by  Ί"
 Center 13, "Ί          Ί  Ί  Ί  Ί  Ί    Ί  Ί    Ί  Dominik  Ί"
 Center 14, "Ί          Ί  Ί  Ί  Ί  Ί    Ί  ΘΝΝΝΝΌ  Kaspar.  Ί"
 Center 15, "Ί                                               Ί"
 Center 16, "Θ" + STRING$(47, 205) + "Ό"
 Center 18, "ΙΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝ»"
 Center 19, "Ί [1] Play the game!   Ί"
 Center 20, "Ί [2] Instructions     Ί"
 Center 21, "Ί [3] View High Score  Ί"
 Center 22, "Ί [4] Quit             Ί"
 Center 23, "ΘΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΌ"

CHOICE:
 DO
  Key$ = INKEY$
 LOOP UNTIL LEN(Key$)
 SELECT CASE VAL(Key$)
        CASE 1: PlayGame
        CASE 2: Instructions
        CASE 3: Score = 0: HighScore
        CASE 4: GOSUB QUIT
        CASE ELSE: GOTO CHOICE
 END SELECT

GOTO MAINMENU

QUIT:
 PCOPY 0, 1: COLOR 15, 2
 Min = CINT(INT(TIMER - Time) / 60)
 Min$ = STR$(Min) + " Minute(s)!" + SPACE$(11 - LEN(STR$(Min))) + "Ί"
 Center 10, "ΙΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝ»"
 Center 11, "Ί Are you a hundred percent sure that you  Ί"
 Center 12, "Ί want to quit this program NOW (Y/N)?     Ί"
 Center 13, "Ί You only played for" + Min$
 Center 14, "ΘΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΌ"
CHOICE2: a$ = "": DO: a$ = INKEY$: LOOP WHILE a$ = ""
 SELECT CASE UCASE$(a$)
        CASE "Y": SYSTEM
        CASE "N": PCOPY 1, 0: COLOR 15, 2: RETURN
        CASE ELSE: GOTO CHOICE2
 END SELECT

SUB Center (Row, Text$)
 LOCATE Row, (80 - LEN(Text$)) \ 2
 PRINT Text$;
END SUB

SUB EnterPassword

Center 18, "ΙΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝ»"
Center 19, "Ί                      Ί"
Center 20, "Ί [1] Apply Password   Ί"
Center 21, "Ί [2] Change Password  Ί"
Center 22, "Ί                      Ί"
Center 23, "ΘΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΌ"

OPEN "MASTER.PSW" FOR RANDOM AS #1 LEN = 62
  IF LOF(1) = 0 THEN
     StandardPassword$ = "ΘΠΘΘΡΟΙΙΝΙΙΝΙΙΡΙΙΙΙΙΜΙΘΘ"
     PUT #1, 1, StandardPassword$
  END IF
 GET #1, 1, Encrypt$
 FOR i = 1 TO LEN(Encrypt$)
     MID$(Encrypt$, i, 1) = LTRIM$(STR$(ASC(MID$(Encrypt$, i, 1)) - 200))
 NEXT i
 Password$ = ""
 FOR i = 1 TO LEN(Encrypt$) STEP 3
     Password$ = Password$ + CHR$(VAL(MID$(Encrypt$, i, 3)))
 NEXT i


CHOICE5:
 DO: Key$ = INKEY$: LOOP UNTIL LEN(Key$)
 SELECT CASE VAL(Key$)
        CASE 1: GOTO APPLY
        CASE 2: GOTO CHANGE
        CASE ELSE: GOTO CHOICE5
 END SELECT

APPLY:
 Center 18, "ΙΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝ»"
 Center 19, "Ί                      Ί"
 Center 20, "Ί Enter your password: Ί"
 Center 21, "Ί                      Ί"
 Center 22, "Ί                      Ί"
 Center 23, "ΘΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΌ"

 IMPUT "", 20, 21, 29, 1
 LOCATE 21, 30
 IF Answer$ = Password$ THEN
    PRINT "Password is OK!     "
    Password = 1
 ELSE
    PRINT "Wrong Password!     "
    Password = 0
 END IF

 DO: LOOP UNTIL INKEY$ = CHR$(13)
 CLOSE #1
 EXIT SUB

CHANGE:
 Center 18, "ΙΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝ»"
 Center 19, "Ί                      Ί"
 Center 20, "Ί Enter old password:  Ί"
 Center 21, "Ί                      Ί"
 Center 22, "Ί                      Ί"
 Center 23, "ΘΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΌ"

 IMPUT "", 20, 21, 29, 1
 IF Answer$ = Password$ THEN
    Center 18, "ΙΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝ»"
    Center 19, "Ί                      Ί"
    Center 20, "Ί Enter new password:  Ί"
    Center 21, "Ί                      Ί"
    Center 22, "Ί                      Ί"
    Center 23, "ΘΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΌ"
    IMPUT "", 20, 21, 29, 1
    Encrypt$ = ""
    FOR i = 1 TO LEN(Answer$)
        Z$ = LTRIM$(STR$(ASC(MID$(Answer$, i, 1))))
        Encrypt$ = Encrypt$ + STRING$(3 - LEN(Z$), ASC(CHR$(48))) + Z$
    NEXT i
    FOR i = 1 TO LEN(Encrypt$)
        MID$(Encrypt$, i, 1) = CHR$(VAL(MID$(Encrypt$, i, 1)) + 200)
    NEXT i
    PUT #1, 1, Encrypt$
    LOCATE 21, 30: PRINT "New Password saved. "
 ELSE
    LOCATE 21, 30: PRINT "Wrong Password!     "
 END IF

 DO: LOOP UNTIL INKEY$ = CHR$(13)
 CLOSE #1

END SUB

SUB HighScore
COLOR , 1: CLS
LOCATE 3, 10: PRINT "Loading... (please wait)"
COLOR 14, 4
LOCATE 2, 60: PRINT "ΙΝΝΝΝΝΝΝΝΝΝΝΝ»"
LOCATE 3, 60: PRINT "Ί HIGH SCORE Ί"
LOCATE 4, 60: PRINT "ΘΝΝΝΝΝΝΝΝΝΝΝΝΌ"

OPEN "MASTER.TOP" FOR RANDOM AS #1 LEN = LEN(TopTen)

 IF LOF(1) = 0 THEN
    FOR i = 1 TO 10
        TopTen.Score = 10
        TopTen.Time = 10000
        TopTen.PName = "No Entry"
      PUT #1, i, TopTen
    NEXT i
 END IF

 COLOR 14, 4
 LOCATE 2, 2: PRINT "ΙΝΝΝΝΝΝΝΛΝΝΝΝΝΝΝΛΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝ»"
 FOR i = 3 TO 23
  LOCATE i, 2
  IF i MOD 2 = 0 THEN
     PRINT "ΜΝΝΝΝΝΝΝΞΝΝΝΝΝΝΝΞΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΉ"
  ELSE
     PRINT "Ί       Ί       Ί                      Ί"
  END IF
 NEXT i
 LOCATE 24, 2: PRINT "ΘΝΝΝΝΝΝΝΚΝΝΝΝΝΝΝΚΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΌ";
 LOCATE 3, 4: PRINT "SCORE"
 LOCATE 3, 12: PRINT "TIME"
 LOCATE 3, 20: PRINT "NAME"
  
IF Score > 0 THEN
   Place = 0
   FOR i = 1 TO 10
       GET #1, i, TopTen
       IF Place = 0 THEN
          IF (Score * 100000 + PlayTime) <= (TopTen.Score * 100000 + TopTen.Time) THEN
             Place = i
             FOR j = 9 TO i STEP -1
                 GET #1, j, TopTen
                 PUT #1, j + 1, TopTen
             NEXT j
             LOCATE 7, 51: PRINT "ΙΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝ»"
             LOCATE 8, 51: PRINT "Ί You reached a place Ί"
             LOCATE 9, 51: PRINT "Ί the Top 10.         Ί"
             LOCATE 10, 51: PRINT "Ί Please Enter your   Ί"
             LOCATE 11, 51: PRINT "Ί name or initials... Ί"
             LOCATE 12, 51: PRINT "ΘΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΌ"
             LOCATE 3 + Place * 2, 3: PRINT Score;
             LOCATE , 11: PRINT PlayTime;
             IF Password = 1 THEN
                DIM Cheat$(3)
                Cheat$(0) = "A mean cheater"
                Cheat$(1) = "An insidious fraud"
                Cheat$(2) = "Some swindler"
                Cheat$(3) = "A nasty thief"
                Answer$ = Cheat$(INT(RND * 4))
             ELSE
                IMPUT "", 20, 3 + Place * 2, 19, 0
             END IF
             TopTen.PName = Answer$
             TopTen.Score = Score
             TopTen.Time = PlayTime
             PUT #1, i, TopTen
          END IF
       END IF
       LOCATE 3 + i * 2, 3: PRINT TopTen.Score;
       LOCATE , 11: PRINT TopTen.Time;
       LOCATE , 20: PRINT TopTen.PName
   NEXT i
ELSE
   FOR i = 1 TO 10
       GET #1, i, TopTen
       LOCATE 3 + i * 2, 3: PRINT TopTen.Score;
       LOCATE , 11: PRINT TopTen.Time;
       LOCATE , 20: PRINT TopTen.PName
   NEXT i
END IF
  
LOCATE 22, 49: PRINT "ΙΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝ»"
LOCATE 23, 49: PRINT "Ί press ESC to continue Ί"
LOCATE 24, 49: PRINT "ΘΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΌ";

CLOSE #1

DO: LOOP UNTIL INKEY$ = CHR$(27)

END SUB

SUB IMPUT (Text$, Range, Row, Col, Hide)

 PRINT Text$
 Answer$ = ""
 DO
   DO
     a$ = INKEY$
   LOOP WHILE a$ = ""
   IF ASC(a$) = 8 THEN
      IF LEN(Answer$) > 0 THEN Answer$ = LEFT$(Answer$, LEN(Answer$) - 1): GOTO 1
   END IF
   SELECT CASE ASC(a$)
          CASE 13: EXIT DO
          CASE 32 TO 255: IF LEN(Answer$) = Range THEN GOTO 1
          Answer$ = Answer$ + a$
   END SELECT
1 : LOCATE Row, Col + LEN(Text$) + 1
    IF Hide = 0 THEN PRINT Answer$;  ELSE PRINT STRING$(LEN(Answer$), 42);
    PRINT SPACE$(Range - (LEN(Answer$)))
    a$ = ""
 LOOP

END SUB

SUB Instructions
 COLOR 14, 1
 CLS
 COLOR , 4
 Center 2, "Ι" + STRING$(29, 205) + "»"
 Center 3, "Ί Instructions to Master Mind Ί"
 Center 4, "Θ" + STRING$(29, 205) + "Ό"
 COLOR , 1
 Center 7, "This is a game to get your old brain cells in new shape!"
 Center 9, "The computer will create a four digit random number that you have to"
 Center 10, "find out by guessing and making smart conclusions."
 Center 11, "The only hints the computer provides for you are how many digits of"
 Center 12, "your guess are correct, and how many are on the wrong place but"
 Center 13, "included in the computer's number."
 Center 15, "If you reach a good score, you might be able to join the High Score"
 Center 16, "and immortalize your name (till someone beats you)."
 Center 18, "GOOD LUCK and HAVE FUN!"
 COLOR 14, 4
 LOCATE 22, 49: PRINT "ΙΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝ»"
 LOCATE 23, 49: PRINT "Ί press ESC to continue Ί"
 LOCATE 24, 49: PRINT "ΘΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΌ";
 DO: LOOP UNTIL INKEY$ = CHR$(27)

END SUB

SUB PlayGame

 Center 18, "ΙΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝ»"
 Center 19, "Ί Choose one:          Ί"
 Center 20, "Ί [1] Let's play!      Ί"
 Center 21, "Ί [2] Password         Ί"
 Center 22, "Ί [3] Main Menu        Ί"
 Center 23, "ΘΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΌ"

CHOICE3:
 DO: Key$ = INKEY$: LOOP UNTIL LEN(Key$)
 SELECT CASE VAL(Key$)
        CASE 1:
        CASE 2: EnterPassword
        CASE 3: EXIT SUB
        CASE ELSE: GOTO CHOICE3
 END SELECT

PLAYBEGINS:
 
 Score = 0
 PlayTime = TIMER

 Number$ = ""
 DO
     N$ = LTRIM$(STR$(INT(RND * 10)))
     IF INSTR(1, Number$, N$) = 0 THEN Number$ = Number$ + N$
 LOOP UNTIL LEN(Number$) = 4

 COLOR , 1: CLS
 COLOR 14, 4
 LOCATE 2, 2: PRINT "ΙΝΝΝΛΝΝΝΛΝΝΝΛΝΝΝ»"
 FOR i = 3 TO 23
  LOCATE i, 2
  IF i MOD 2 = 0 THEN
     PRINT "ΜΝΝΝΞΝΝΝΞΝΝΝΞΝΝΝΉ"
  ELSE
     PRINT "Ί   Ί   Ί   Ί   Ί"
  END IF
 NEXT i
 LOCATE 24, 2: PRINT "ΘΝΝΝΚΝΝΝΚΝΝΝΚΝΝΝΌ";
 FOR i = 4 TO 16 STEP 4
     LOCATE 23, i
     IF Password = 1 THEN
        PRINT MID$(Number$, i / 4, 1)
     ELSE
        PRINT "?"
     END IF
 NEXT i

 LOCATE 22, 21: PRINT "ΙΝΝΝΛΝΝΝΛΝΝΝΛΝΝΝ»"
 LOCATE 23, 21: PRINT "Ί   Ί   Ί   Ί   Ί"
 LOCATE 24, 21: PRINT "ΘΝΝΝΚΝΝΝΚΝΝΝΚΝΝΝΌ";
 COLOR , 1: LOCATE 23, 40: PRINT "MAKE YOUR GUESS  [choose a number]"

 Guess$ = ""
CHOICE4:
 COLOR 10, 4
 FOR i = 1 TO 4
     LOCATE 23, 19 + i * 4
     IF MID$(Guess$, i, 1) = "" THEN
        PRINT CHR$(32)
     ELSE
        PRINT MID$(Guess$, i, 1)
     END IF
 NEXT i
 Guess$ = RTRIM$(Guess$)
 DO: Key$ = INKEY$: LOOP UNTIL LEN(Key$)
 SELECT CASE ASC(Key$)
        CASE 48 TO 57: IF LEN(Guess$) < 4 THEN Guess$ = Guess$ + Key$
                       GOTO CHOICE4
        CASE 8: IF LEN(Guess$) > 0 THEN Guess$ = LEFT$(Guess$, LEN(Guess$) - 1)
                GOTO CHOICE4
        CASE 13: IF LEN(Guess$) < 4 THEN GOTO CHOICE4
        CASE 27: PCOPY 0, 1: COLOR 15, 2
                 Center 10, "ΙΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝ»"
                 Center 11, "Ί Do you really want to quit playing Ί"
                 Center 12, "Ί this game of Master Mind (Y/N)?    Ί"
                 Center 13, "ΘΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΌ"
                 DO: Key$ = INKEY$: LOOP UNTIL LEN(Key$)
                 IF UCASE$(Key$) = "Y" THEN
                    GameQuit = 1: GOTO GAMEOVER
                 ELSE
                    PCOPY 1, 0: GOTO CHOICE4
                 END IF
        CASE ELSE: GOTO CHOICE4
 END SELECT

 Score = Score + 1
 Correct = 0
 WrongPlace = 0

 FOR i = 1 TO 4
     IF MID$(Guess$, i, 1) = MID$(Number$, i, 1) THEN
        Correct = Correct + 1
     ELSE
     IF INSTR(Guess$, MID$(Number$, i, 1)) THEN WrongPlace = WrongPlace + 1
     END IF
 NEXT i
 COLOR 14, 1
 LOCATE 1 + 2 * Score, 20
 PRINT "CORRECT: "; Correct, "WRONG PLACE: "; WrongPlace;
 COLOR 13, 4
 FOR i = 4 TO 16 STEP 4
     LOCATE 1 + 2 * Score, i
     PRINT MID$(Guess$, i / 4, 1)
 NEXT i


 IF Correct = 4 THEN
    PlayTime = CINT(TIMER - PlayTime)
    PlayTime$ = STR$(PlayTime) + " seconds" + STRING$(23 - LEN(STR$(PlayTime)), 32) + "Ί"
    Tries$ = STR$(Score) + STRING$(31 - LEN(STR$(Score)), 32) + "Ί"
    COLOR 15, 2
    Center 10, "Ι" + STRING$(38, 205) + "»"
    Center 11, "Ί YOU WON THIS GAME!                   Ί"
    Center 12, "Ί The right number was " + Number$ + "            Ί"
    Center 13, "Ί Tries:" + Tries$
    Center 14, "Ί Time :" + PlayTime$
    Center 15, "Ί Let's have a look at the High Score. Ί"
    Center 16, "Θ" + STRING$(38, 205) + "Ό"
    DO: LOOP UNTIL INKEY$ = CHR$(13)
    HighScore
    EXIT SUB
 END IF

GAMEOVER:
 IF Score = 10 OR GameQuit = 1 THEN
    IF GameQuit = 1 THEN GameStr$ = "QUIT" ELSE GameStr$ = "LOST"
    COLOR 15, 2
    Center 10, "ΙΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝ»"
    Center 11, "Ί YOU " + GameStr$ + " THE GAME! Ί"
    Center 12, "Ί The right Number:  Ί"
    Center 13, "Ί        " + Number$ + "        Ί"
    Center 14, "ΘΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΌ"
    DO: LOOP UNTIL INKEY$ = CHR$(13)
    EXIT SUB
 END IF


 Guess$ = "    "
 GOTO CHOICE4

END SUB
