'===========================================================================
' Subject: GAME OF NIM                        Date: 10/96 (00:00)          
'  Author: Steven Anthony Morisi              Code: QB, QBasic, PDS        
'  Origin: steve179@ix.netcom.com           Packet: GAMES.ABC
'===========================================================================
DECLARE SUB tokens ()
DECLARE SUB cputakes ()
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'Date   : 10/96                                                      '
'Author : Steven A. Morisi                                           '
'E-Mail : steve179@ix.netcom.com                                     '
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'Overview                                                            '
'The game of NIM is played between 2 players                         '
'There are 15 counters to start. On a turn a player must take either '
'1,2 or 3 counters. The player who takes the last counter loses.     '
'(there are variations where Taking the last counter wins).          '
'This program does NOT use perfect play ( since it was written to    '                                                             
'amuse my kids!) You can find the logic in several books. Try        '
'Martin Gardners Scientific American Compilations                    '
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
SCREEN 9  ' 640 x 350
DIM SHARED remaining%
COLOR 7, 1

'Start of game .... 15 tokens
remaining% = 15
done$ = "NO"
tokens
COLOR 7, 1

DO UNTIL done$ = "YES"
   move$ = "NG"
   DO UNTIL move$ = "OK"
      LOCATE 18, 23: PRINT "How many will you remove "
      LOCATE 18, 55: INPUT number%
      IF number% = 1 OR number% = 2 OR number% = 3 THEN
         move$ = "OK"
      ELSE
         BEEP
      END IF
   LOOP
   remaining% = remaining% - number%
   tokens
   IF remaining% = 1 THEN
      tokens
      LOCATE 22, 30: PRINT "You win !"
      done$ = "YES"
   END IF
   cputakes     'what it says!
   IF remaining% = 1 THEN
      LOCATE 22, 30: PRINT "I win !"
    '''''  FOR i% = 1 TO 10: SOUND 600 + (10 * i%), 1: NEXT i%
      done$ = "YES"
    END IF
LOOP
SLEEP
SYSTEM

SUB cputakes
'Very rudimentary logic to give it the impression that it is thinking
take% = 1
IF remaining% = 3 THEN take% = 2
IF remaining% = 2 THEN take% = 1
IF remaining% = 10 THEN take% = 3
IF remaining% = 7 THEN take% = 1

FOR cpu% = 1 TO take%
    whichone% = remaining%        'which one to disolve
    remaining% = remaining% - 1   'reset number remaining

    z% = 35 + (whichone% * 35)

    FOR r% = 1 TO 18
        CIRCLE (z%, 150), r%, 4
        SOUND 400 + (12 * r%), 1
        FOR delay% = 1 TO 30000: NEXT delay%
    NEXT r%

NEXT cpu%
END SUB

SUB tokens
CLS
'Title
LOCATE 2, 25: PRINT "ÛÛ   Û  ÛÛÛÛÛÛÛ   ÛÛ   ÛÛ "
LOCATE 3, 25: PRINT "Û Û  Û     Û      Û Û Û Û "
LOCATE 4, 25: PRINT "Û  Û Û     Û      Û  Û  Û "
LOCATE 5, 25: PRINT "Û   ÛÛ  ÛÛÛÛÛÛÛ   Û     Û "



'Paint the playing area
FOR i% = 1 TO 4
LINE (40 + i%, 100 + i%)-(600 - i%, 200 - i%), 4, BF
NEXT i%
 
'Print the remaining tokens
FOR i% = 1 TO remaining%
    x% = 35 + (i% * 35)
    CIRCLE (x%, 150), 15, 15: PAINT (x%, 150), 6, 15
NEXT i%
COLOR 11
LOCATE 20, 16: PRINT " On each turn you opt to remove 1,2 or 3 tokens      "
LOCATE 21, 16: PRINT " The player who is forced to take the last one loses "

END SUB
