\ sticks.f
\ After "23 Matches" in Ahl, _Basic Computer Games_
\ Ahl attributes the original to Bob Albrecht

cr .( Reading sticks.f)

\ random number generator
s" random.f" included

\ Rules of the game
: rules  ( -- )
   cr ." Sticks"
   cr
   cr ." The game starts with 23 sticks.  "
      ." By turns, you and Forth take"
   cr ." from 1 to 3 sticks.  "
      ." Whoever takes the last stick loses."
   cr
   cr ." You take sticks by entering:  n STICKS"
   cr ." where n is 1, 2, or 3"
   cr ;

\ Display sticks
: .sticks  ( n -- )  0 ?do  ." |"  loop ;

\ Report remaining sticks
: left  ( sticks taken -- left )
   -  dup cr .sticks space dup . ." left." ;

\ The fates of Forth
: you-win  ( sticks -- )  drop  ." You win! " ;
: forth-wins  ( sticks -- )
   ." Forth took "  1- .
   cr ." 1 left - sorry!" ;
: 4-play  ( sticks -- left )
   ." Forth took " 3 choose 1+ dup . left ;

\ My esteemed opponent
: computer  ( sticks -- left| )
   cr
   dup 1 = if  you-win  else
      dup 5 < if  forth-wins  else
         4-play
   then then ;

\ First play
: coin  ( 23 -- n )
   2 choose
   cr ." A coin has been flipped:  "
   if   ." Heads, Forth is first."  computer
   else ." Tails, you start."
   then ;

\ Confine n between min and max
: clamp  ( n min max -- n )  rot min max ;

\ May take between 1 and 3 sticks, leaving at least 1
: legal  ( sticks try -- sticks taken )
  over 1- 3 min  1 swap clamp ;

\ My play
: programmer  ( sticks try -- left )  legal left ;

\ 1 Round
: sticks  ( sticks try -- left| )  programmer computer ;
\ Alias for STICKS
: stick ( sticks try -- left| )  sticks ;

: game  ( -- )
   rules  23 dup cr .sticks  randomize coin ;

cr .( Ready.  To play, enter: GAME)