\ sudoku -- albert nijhof -- okt2007

anew -sdk
decimal

\ : align ; immediate

      3 constant zb   \ Zijde van een blok, 3
zb zb * constant z    \ Zijde van de sudoku, 9
z  z  * constant zz   \ Totaal aantal vakjes, 81


\ ----- De symbolen -----

create (symbolen   z allot
  char : c,   \ teken voor lege vakjes
  align

: !symbolen ( adr len -- )   z min   (symbolen swap move ;

s" 123456789" !symbolen
\ s" MAISFORTH" !symbolen

: >symbool ( icode -- ch )   z min   (symbolen +   c@ ;


\ ----- Sudoku afdrukken -----

create (sdk   zz allot   align

0 value hier   \ Cursorpositie

 : .vakje ( nr -- )
   hier over = [char] > and bl or emit
   (sdk + c@ >symbool emit
   space ;

: .sdk ( -- ) 0   \ teller
           zb 0 do
  cr cr    zb 0 do
  cr cr    zb 0 do
  3 spaces zb 0 do   dup .vakje 1+
                loop loop loop loop   drop ;


\ ----- Cursorbewegingen -----

: west ( vaknr1 -- vaknr2 )
  z   2dup mod 0=   and +   \ z of 0 bijtellen.
  1- ;

\ Nog te maken (opgave PiF 7a)
\ : oost  ( vaknr1 -- vaknr2 ) ... ;
\ : noord ( vaknr1 -- vaknr2 ) ... ;
\ : zuid  ( vaknr1 -- vaknr2 ) ... ;


\ ----- het hoofdwoord SU -----

: doen ( key -- key )
  [char] [ over = if  hier west  to hier  exit then
\ [char] ] over = if  hier oost  to hier  exit then
\ [char] = over = if  hier noord to hier  exit then
\ [char] ' over = if  hier zuid  to hier  exit then
\ dup invullen? ?exit then
\ ...   ( Andere opties)
;

: su ( -- ) \ Het hoofdwoord
  page
  begin 0 0 at-xy    \ of PAGE of een 'escape-code' voor de terminal.
        .sdk
        cr cr key
        27 over <>   \ Stop met [Esc] 
  while doen drop
  repeat
  drop ;

cr .(  ----- sudo2.f is geladen ----- )
