My Forth game "21 match sticks"
Hello Everyone,
Below is my Forth game "21 match sticks" you play against the P2. So to play the game just type in 21STICKS upper or lower-case it doesn't matter.
HydraHacker
\ constants
21 := TOT_NUM_STKS
7 := BELL
0 := HEADS
1 := TAILS
"t" := T_KEY
"h" := H_KEY
"y" := Y_KEY
"n" := N_KEY
0 := PLAYER
1 := P2
\ variables
byte
stksLft
byte
p2Wns
byte
plyrWns
byte
frstNxtMove
\ word definitions
pub PRNTSTKS ( n -- )
stksLft C@ 0= if 20 FOR 42 SPACES CRLF 20 ms NEXT NIP EXIT THEN
DUP TOT_NUM_STKS SWAP - 2*
20 FOR
2DUP
SPACES
FOR
219 EMIT
32 EMIT
NEXT
CRLF
20 ms
NEXT
2DROP
;
pub INSTRUC ( -- )
CRLF
CRLF
." To play the game '21 match sticks' you are allowed to select-" CRLF
." between 1-4 match sticks. The Player who draws the last stick-" CRLF
." 'loses' the game... so good luck!" CRLF
;
pub COINTOSS ( -- n )
GETRND 100 // 1+
FOR
GETRND 2 //
I 1 = IF DUP THEN
IF ." t" ELSE ." h" THEN
1 ms
NEXT
;
pub HEADSTAILS ( -- c )
." Press 'h' for heads or 't' for tails"
CRLF
BEGIN
WKEY
DUP H_KEY = OVER T_KEY = OR
IF DUP EMIT CRLF EXIT ELSE BELL EMIT DROP THEN
AGAIN
;
pub P2MOVES ( st -- ns)
stksLft C@ DUP 6 < IF 1- DUP 0= ABS + NIP EXIT THEN
DROP
DUP
5 / 1+ 5 * SWAP -
DUP 5 = IF GETRND 4 U// DROP 1+ NIP THEN
;
pub WINSTOSS ( c n -- )
SWAP H_KEY = IF HEADS ELSE TAILS THEN =
DUP IF PLAYER frstNxtMove C! ELSE P2 frstNxtMove C! THEN
IF ." Player has 'won' the coin toss!" ELSE ." P2 has 'won' the coin toss!" THEN
;
pub INITVARS
0 0 plyrWns C! p2Wns C!
TOT_NUM_STKS stksLft C!
;
pub PLYRMOVES ( -- numStks)
BEGIN
WKEY
"0" -
DUP
1 stksLft C@ 4 < IF stksLft C@ ELSE 4 THEN
WITHIN
IF EXIT ELSE DROP BELL EMIT THEN
AGAIN
;
pub NEXTMOVE ( -- )
frstNxtMove C@ 1 XOR frstNxtMove C!
;
pub SCORES ( -- )
CRLF
CRLF
." Player #wins " plyrWns C@ . 5 SPACES ." P2 #wins " p2Wns C@ .
;
pub PLYP2MOVES ( -- )
frstNxtMove C@
SWITCH
PLAYER CASE
CRLF
CRLF
." Player it is your turn "
PLYRMOVES
stksLft C@ SWAP - DUP stksLft C!
CRLF
CRLF
PRNTSTKS
BREAK
P2 CASE
CRLF
CRLF
." Press 'any' key for P2 to make a move "
WKEY
DROP
CRLF
CRLF
TOT_NUM_STKS stksLft C@ - P2MOVES
stksLft C@ SWAP - DUP stksLft C!
CRLF
CRLF
PRNTSTKS
BREAK
;
pub WHOWON ( -- )
stksLft C@ 0<> if EXIT THEN
frstNxtMove C@
SWITCH
PLAYER CASE
plyrWns C@ 1+ plyrWns C!
CRLF
CRLF
." Congratulations 'Player' you have beaten the P2!"
SCORES
BREAK
P2 CASE
p2Wns C@ 1+ p2Wns C!
CRLF
CRLF
." The P2!!! has beaten you...sorry!"
SCORES
BREAK
;
pub NEWGAME ( -- )
stksLft C@ 0<> IF EXIT THEN
CRLF
CRLF
." Press 'y' for new-game ELSE Press 'n' to exit to TERMINAL "
BEGIN
WKEY
SWITCH
Y_KEY CASE
TOT_NUM_STKS stksLft C!
CRLF
CRLF
HEADSTAILS
CRLF
COINTOSS
CRLF
CRLF
WINSTOSS
CRLF
CRLF
21 PRNTSTKS
BREAK
N_KEY CASE
TERM
BREAK
BELL EMIT
AGAIN
;
pub 21STICKS ( -- )
INITVARS
INSTRUC
CRLF
HEADSTAILS
CRLF
COINTOSS
CRLF
CRLF
WINSTOSS
CRLF
CRLF
21 PRNTSTKS
--- game loop
BEGIN
PLYP2MOVES
NEXTMOVE
WHOWON
NEWGAME
AGAIN
;
ModEdit: Added extra ticks for code display (triple ticks required)
