'===========================================================================
' Subject: MEMORY/CONCENTRATION GAME          Date: 07-12-99 (18:49)       
'  Author: Dennis M. Crudden                  Code: QB, QBasic, PDS        
'  Origin: www.geocities.com/~qbasic2/      Packet: GAMES.ABC
'===========================================================================
REM  +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
REM  +                                                                   +
REM  +                                                                   +
REM  +                                                                   +
REM  +                      Welcome to Memory                            +                         +
REM  +                                                                   +
REM  +                    By D M Crudden   1996                          +                  +
REM  +                                                                   +
REM  +                      dennisc896@aol.com                           +
REM  +                                                                   +
REM  +                                                                   +
REM  +                                                                   +
REM  +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++


TOP:
  SCREEN 1: CLS
  CLEAR
REM Timer trap (Obsolete 3 15 92 by use of TIMER and now universal)
  TIMER ON
  STARTTIME = TIMER
  FOR Z = 1 TO 1000
  NEXT Z
  TIMEPAST = TIMER - STARTTIME
  PAUSER% = 2
REM END TRAP ROUTINE
  DIM Q%(28)
  DIM A$(6)
  M = 0: CO = 0: TU = 0
  GOTO TITLESCREEN


DRAWSCREEN: REM draw the board ++++++++++++++++++++++++++++++++++++++++++++++
  SCREEN 9: CLS
 FOR Y = 26 TO 298 STEP 70
  FOR X = 50 TO 560 STEP 80
   LINE (X, Y)-(X + 62, Y + 58), 15, B
   LINE (X + 1, Y + 1)-(X + 64, Y + 60), 15, B
   LINE (X + 2, Y + 2)-(X + 61, Y + 57), 12, BF
  NEXT X
 NEXT Y
  LOCATE 1, 10
  PRINT "1         2         3         4         5         6         7"
  LOCATE 5, 3: PRINT "a"
  LOCATE 10, 3: PRINT "b"
  LOCATE 15, 3: PRINT "c"
  LOCATE 20, 3: PRINT "d"

REM MAIN LOOP STARTS HERE ***********************************************
START:
  X = X + 1: IF X > P THEN X = 1
PICK1:
  TU = TU + 1
  C = 1
  LOCATE 23, 3: PRINT "                                               "
  LOCATE 23, 3: PRINT A$(X); "'s turn choose card one ";
  INPUT O$
  GOTO legit1
PICK2:
  C = 2
  LOCATE 23, 3: PRINT "                                               "
  LOCATE 23, 3: PRINT A$(X); "'s turn choose card two ";
  INPUT T$
  GOTO LEGIT2


TITLESCREEN: REM Opening Title Page+++++++++++++++++++++++++++++++++++++++++
  SCREEN 0
  CLS
  COLOR 15
  X$ = "W E L C O M E  T O  M E M O R Y"
  LOCATE 12, 5
  FOR A = 1 TO LEN(X$) STEP 2
  PRINT MID$(X$, A, 2);
  SOUND 600 * RND + 400, 4 * RND
  NEXT
  NOW! = TIMER
  DO
  LOOP UNTIL TIMER > NOW! + 2
  LOCATE 14, 9
  PRINT " By CruddenSoft  1996"
  REM dennisc896@aol.com
  SOUND 40, 15
  LOCATE 20, 1


REM music from Cats.....
  PLAY "MBl3 cc"
  PLAY "l9<b>cdc<a"
  PLAY "l3>cc"
  PLAY "l9<b>cdc<g"
  PLAY "l3aa"
  PLAY "l9fgagfl2e"
 DO
  INPUT "How many players "; P
  IF P > 0 AND P < 6 THEN EXIT DO
 LOOP
  DIM S%(P)
 FOR X = 1 TO P
  PRINT "Player number "; X; ", enter your name: ": INPUT A$(X)
  IF LEN(A$(X)) > 8 THEN A$(X) = LEFT$(A$(X), 8)
 NEXT X

REM randomize  +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
RANDOMIZE TIMER
  DIM T%(28): DIM P%(28)
  FOR J = 1 TO 28: P%(J) = J: NEXT
  FOR J = 1 TO 28
   I = INT(RND(2) * 27) + 1
   T% = P%(J): P%(J) = P%(I): P%(I) = T%: NEXT
  FOR X = 1 TO 28
   IF P%(X) > 14 THEN LET P%(X) = P%(X) - 14
  NEXT X
  GOTO DRAWSCREEN





legit1:
  IF LEN(O$) <> 2 THEN SOUND 40, 10: GOTO PICK1
  L$ = LEFT$(O$, 1)
  IF L$ <> "a" AND L$ <> "b" AND L$ <> "c" AND L$ <> "d" THEN SOUND 40, 10: GOTO PICK1
  L$ = RIGHT$(O$, 1)
  L = VAL(L$)
  IF L > 7 OR L < 1 THEN SOUND 40, 10: GOTO PICK1
  LET L$ = O$: C = 1
  GOTO SCREENLOCATION
LEGIT2:
  IF LEN(T$) <> 2 THEN SOUND 40, 10: GOTO PICK2
  L$ = LEFT$(T$, 1)
  IF L$ <> "a" AND L$ <> "b" AND L$ <> "c" AND L$ <> "d" THEN SOUND 40, 10: GOTO PICK2
  L$ = RIGHT$(T$, 1)
  L = VAL(L$)
  IF L > 7 OR L < 1 THEN SOUND 40, 10: GOTO PICK2
  LET L$ = T$: C = 2
  IF O$ = T$ THEN SOUND 40, 10: C = 2: CO = 3: GOTO PICK2
SCREENLOCATION:
  K$ = LEFT$(L$, 1)
  IF K$ = "a" THEN V(C) = 26: K(C) = 0
  IF K$ = "b" THEN V(C) = 96: K(C) = 7
  IF K$ = "c" THEN V(C) = 166: K(C) = 14
  IF K$ = "d" THEN V(C) = 236: K(C) = 21
  K$ = RIGHT$(L$, 1)
  O = VAL(K$)
  H(C) = ((O - 1) * 80) + 50
  SQ(C) = K(C) + O
  IF Q%(SQ(C)) = 5 THEN SOUND 40, 10: GOTO START




REM DRAW THE SHAPES+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  Q = SQ(C)
  QU = P%(Q)
  PAINT (H(C) + 2, V(C) + 2), 0
  IF QU = 1 THEN GOTO shape1
  IF QU = 2 THEN GOTO shape2
  IF QU = 3 THEN GOTO shape3
  IF QU = 4 THEN GOTO shape4
  IF QU = 5 THEN GOTO shape5
  IF QU = 6 THEN GOTO shape6
  IF QU = 7 THEN GOTO shape7
  IF QU = 8 THEN GOTO shape8
  IF QU = 9 THEN GOTO shape9
  IF QU = 10 THEN GOTO shape10
  IF QU = 11 THEN GOTO SHAPE11
  IF QU = 12 THEN GOTO shape12
  IF QU = 13 THEN GOTO shape13
  IF QU = 14 THEN GOTO shape14
shape1: REM Triangle
  R(1) = H(C) + 3: R(2) = H(C) + 58
  Y(1) = V(C) + 3: Y(2) = V(C) + 58
  LINE (R(1), Y(2))-(R(2), Y(1)), 15
  LINE (R(2), Y(1))-(R(2), Y(2)), 15
  LINE (R(2), Y(2))-(R(1), Y(2)), 15
  PAINT (H(C) + 54, V(C) + 54), 9, 15
  GOTO NEXTCARD
shape2: REM Meatball
  CIRCLE (H(C) + 32, V(C) + 30), 28, 13
  PAINT (H(C) + 32, V(C) + 30), 13, 13
  CIRCLE (H(C) + 32, V(C) + 30), 16, 1
  PAINT (H(C) + 32, V(C) + 30), 1, 1
GOTO NEXTCARD
shape3: REM hollow square
  LINE (H(C) + 3, V(C) + 3)-(H(C) + 58, V(C) + 56), 14, BF
  LINE (H(C) + 13, V(C) + 13)-(H(C) + 48, V(C) + 46), 0, BF
  GOTO NEXTCARD
shape4: REM checkerboard
   LINE (H(C) + 6, V(C) + 6)-(H(C) + 58, V(C) + 58), 15, BF
   LINE (H(C) + 8, V(C) + 8)-(H(C) + 24, V(C) + 24), 12, BF
   LINE (H(C) + 8, V(C) + 40)-(H(C) + 24, V(C) + 56), 12, BF
   LINE (H(C) + 24, V(C) + 24)-(H(C) + 40, V(C) + 40), 12, BF
   LINE (H(C) + 40, V(C) + 8)-(H(C) + 56, V(C) + 24), 12, BF
   LINE (H(C) + 40, V(C) + 40)-(H(C) + 56, V(C) + 56), 12, BF
   GOTO NEXTCARD
shape5: REM diamond
  LINE (H(C) + 32, V(C) + 6)-(H(C) + 58, V(C) + 32), 10
  LINE (H(C) + 58, V(C) + 32)-(H(C) + 32, V(C) + 58), 10
  LINE (H(C) + 32, V(C) + 58)-(H(C) + 6, V(C) + 32), 10
  LINE (H(C) + 6, V(C) + 32)-(H(C) + 32, V(C) + 6), 10
  PAINT (H(C) + 32, V(C) + 32), 10, 10
  GOTO NEXTCARD
shape6: REM  pink square
  LINE (H(C) + 10, V(C) + 10)-(H(C) + 54, V(C) + 54), 5, BF
  LINE (H(C) + 10, V(C) + 25)-(H(C) + 54, V(C) + 39), 14, BF
  GOTO NEXTCARD:
shape7: REM 2 tall red deals
  LINE (H(C) + 6, V(C) + 6)-(H(C) + 28, V(C) + 58), 13, BF
  LINE (H(C) + 36, V(C) + 6)-(H(C) + 58, V(C) + 58), 13, BF
  GOTO NEXTCARD:
shape8: REM red square white square
  LINE (H(C) + 6, V(C) + 6)-(H(C) + 32, V(C) + 32), 15, BF
  LINE (H(C) + 32, V(C) + 32)-(H(C) + 58, V(C) + 58), 12, BF
  GOTO NEXTCARD:
shape9: REM cross plus
  LINE (H(C) + 29, V(C) + 6)-(H(C) + 34, V(C) + 58), 15, BF
  LINE (H(C) + 6, V(C) + 29)-(H(C) + 58, V(C) + 34), 15, BF
  GOTO NEXTCARD:
shape10: REM PC
  LINE (H(C) + 6, V(C) + 58)-(H(C) + 58, V(C) + 58), 15
  LINE (H(C) + 6, V(C) + 58)-(H(C) + 12, V(C) + 42)
  LINE (H(C) + 58, V(C) + 58)-(H(C) + 52, V(C) + 42)
  LINE (H(C) + 12, V(C) + 42)-(H(C) + 52, V(C) + 42)
  LINE (H(C) + 12, V(C) + 6)-(H(C) + 52, V(C) + 38), 15, B
  LINE (H(C) + 18, V(C) + 12)-(H(C) + 46, V(C) + 32), 7, BF
  GOTO NEXTCARD:
SHAPE11: REM 2 wide hollow boxes
  LINE (H(C) + 6, V(C) + 6)-(H(C) + 58, V(C) + 28), 11, BF
  LINE (H(C) + 6, V(C) + 36)-(H(C) + 58, V(C) + 58), 7, BF
  GOTO NEXTCARD:
shape12:
  LINE (H(C) + 6, V(C) + 6)-(H(C) + 58, V(C) + 58), 7, BF
  CIRCLE (H(C) + 32, V(C) + 32), 22, 9
  PAINT (H(C) + 16, V(C) + 32), 9, 9
  GOTO NEXTCARD:
shape13:
  CIRCLE (H(C) + 32, V(C) + 32), 28, 15
  PAINT (H(C) + 32, V(C) + 32), 15
  LINE (H(C) + 16, V(C) + 16)-(H(C) + 48, V(C) + 48), 5, BF
  GOTO NEXTCARD
shape14:
  LINE (H(C) + 6, V(C) + 6)-(H(C) + 58, V(C) + 58), 15, B
  LINE (H(C) + 10, V(C) + 10)-(H(C) + 54, V(C) + 54), 15, B
  LINE (H(C) + 14, V(C) + 14)-(H(C) + 50, V(C) + 50), 15, B
  LINE (H(C) + 18, V(C) + 18)-(H(C) + 46, V(C) + 46), 15, B
NEXTCARD:
  IF C = 1 THEN GOTO PICK2
REM CHECK FOR MATCH=======================================================
  IF P%(SQ(1)) = P%(SQ(2)) THEN GOTO MATCH
  NOW! = TIMER
  DO
  LOOP UNTIL TIMER > NOW! + 2
ERASECARD:
  C = 1: GOTO ERA
ERA:
  LINE (H(C), V(C))-(H(C) + 64, V(C) + 60), 0, BF
  LINE (H(C), V(C))-(H(C) + 62, V(C) + 58), 15, B
  LINE (H(C) + 1, V(C) + 1)-(H(C) + 64, V(C) + 60), 15, B
  PAINT (H(C) + 2, V(C) + 2), 12, 15
  IF C = 1 THEN C = 2: GOTO ERA
GOTO START


MATCH: REM match!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  LOCATE 23, 3: PRINT " IT'S A MATCH !!!                  "
  MUS% = MUS% + 1: IF MUS% = 4 THEN MUS% = 1
  SELECT CASE MUS%
  CASE 1
   FOR S = 800 TO 1200 STEP 15
   SOUND S, 2
   NEXT S
  CASE 2: REM Thanks for the Memories
   PLAY "MBl3c<l8ap20l9gl12fl9dl2d"
  CASE 3: REM The Way we was
   PLAY "MB>l2al2g.l8ga>c<bagl2e"
  END SELECT
   LET S%(X) = S%(X) + 1
   Q%(SQ(1)) = 5: Q%(SQ(2)) = 5
   NOW! = TIMER
   DO
   LOOP UNTIL TIMER > NOW! + 1
   LET M = M + 1
   IF M = 14 THEN GOTO scores
   C = 1
CLEARTHEM:
   LINE (H(C), V(C))-(H(C) + 64, V(C) + 60), 0, BF
   IF C = 1 THEN C = 2: GOTO CLEARTHEM
   GOTO PICK1
scores: REM show scores++++++++++++++++++++++++++++++++++++++++++++++++++++++
  SOUND 8000, 1
  SCREEN 0: WIDTH 40
  CLS : COLOR 15, 0
  NOW! = TIMER
  DO
  LOOP UNTIL TIMER > NOW! + 2
  LOCATE 6, 1
  FOR Z = 1 TO P
  Q$ = A$(Z) + " Has" + STR$(S%(Z)) + " Matches"
  GOSUB CLICKER
  PRINT : PRINT
  NEXT Z
  PRINT
  Q$ = "Scoring avg.=" + STR$(INT(100 * (14 / TU))) + "% of tries"
    GOSUB CLICKER
  Q$ = " yield match"
    GOSUB CLICKER
  PRINT : PRINT
  IF TU < 27 THEN Q$ = "              EXCELLENT! "
  IF TU > 26 AND TU < 37 THEN Q$ = "             GOOD"
  IF TU > 36 THEN Q$ = "              TERRIBLE!"
    GOSUB CLICKER
  PRINT : PRINT
  Q$ = "Touch P to play again"
    GOSUB CLICKER
 DO
  A$ = INKEY$
  IF A$ = "p" OR A$ = "P" THEN GOTO TOP
 LOOP
CLICKER:
  FOR I = 1 TO LEN(Q$)
  PRINT MID$(Q$, I, 1);
  SOUND 10000, 1
  FOR X = 1 TO 15: NEXT X
  NEXT I
  RETURN
SUB legit1
END SUB
