\ Schuifspelletje (Albert Nijhof) \ De speler schuift de blokjes in de goede stand. FORTH DEFINITIONS DECIMAL : CHAR-ARRAY ( amount -- ) \ Definiërend woord CREATE 255 UMIN \ Max. lengte? ( **) DUP C, 1+ ALLOT ALIGN DOES> ( index -- address ) COUNT ROT UMIN + ; \ Range? ( **) 16 CHAR-ARRAY BORD \ 15 tekens en een lege plek 0 value HIER \ Positie vd lege plek (spatie) : EINDSTAND ( -- ) S" VIJGEBLAD*FORTH " DUP 1- TO HIER 0 BORD SWAP MOVE ; : .BORD ( -- ) 0 5 AT-XY 0 BORD 4 0 DO CR CR 33 SPACES 4 0 DO COUNT EMIT 3 SPACES LOOP LOOP DROP 7 SPACES ; \ De speler kiest de te schuiven letter. \ Daarom moeten alle tekens verschillend zijn. 0 VALUE TOETS : >CODE ( ch -- c ) DUP 32 AND - ; \ Upper? ( **) : SPELER ( -- ) key >code to toets ; \ Pos = positie t.o.v. HIER. Let op de bordrand. : WEST? ( -- pos ) HIER 3 AND 0<> -1 AND ; ( **) : OOST? ( -- pos ) HIER 1+ 3 AND 0<> 1 AND ; ( **) : NOORD? ( -- pos ) HIER 3 > -4 AND ; ( **) : ZUID? ( -- pos ) HIER 12 < 4 AND ; ( **) : LETTER? ( pos -- pos ) \ De goede letter? DUP HIER + BORD C@ >CODE TOETS = AND ; ( **) : DAAR ( -- nr ) \ Positie vd te schuiven letter NOORD? LETTER? WEST? LETTER? OR OOST? LETTER? OR ZUID? LETTER? OR HIER + ; : SCHUIF ( nr -- ) DUP BORD HIER BORD OVER C@ OVER C@ -ROT SWAP C! SWAP C! TO HIER ; : SPEEL ( -- ) PAGE EINDSTAND .BORD 1997 MS 32 0 DO RANDOM 15 AND SCHUIF .BORD LOOP BEGIN SPELER DAAR SCHUIF .BORD TOETS 27 = \ [Escape]? UNTIL ; \ ----- einde -----