PiF 7

  <terug>
Een cursor voor de de sudoku


HIER

Het is wel erg bewerkelijk als je bij ieder vakje dat je in wilt vullen eerst de coordinaten op moet geven. Daarom hebben we een cursor nodig waarmee je op een comfortabele manier een vakje aan kunt wijzen.
 0 value hier
In het woord .VAKJE vervangen we de eerste SPACE door deze code:
   hier over =
   if   [char] >
   else bl
   then emit
of
   hier over = [char] > and bl or emit
Als de cursor naar het vakje wijst wordt er een ">" afgedrukt in plaats van een spatie.
 : .vakje ( nr -- )
   hier over = [char] > and bl or emit   \ Markeer cursorvakje.
   (sdk + c@ >symbool emit
   space ;


Het hoofdwoord SU

Vervolgens zetten we het afdrukken van de sudoku in een lus van waaruit de gebruiker via KEY kan bepalen wat er moet gebeuren.
 : SU ( -- ) \ Het hoofdwoord
   page
   begin 0 0 at-xy
         .sdk
         cr cr key
         27 over <>   \ Stop met [Esc]
   while doen drop
   repeat
   drop ;
Als je forth geen AT-XY kent zou je 0 0 AT-XY door PAGE kunnen vervangen of door het afdrukken van een escape-code (ESC H of ...) die door de terminal begrepen wordt.


DOEN

DOEN zou er zo uit kunnen zien:
 : 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
   ;
De woorden WEST OOST NOORD ZUID en INVULLEN? moeten nog gemaakt worden. Uit dit voorbeeld kun je wel opmaken wat ze moeten doen. Ik heb de toetsen [ ] = en ' gekozen voor de vier richtingen omdat ze (op mijn toetsenbord) in deze posities ten opzichte van elkaar staan:
    =           noord

  [   ]       west  oost

    '           zuid
Als je forth het mogelijk maakt, kun je beter de vier pijltjestoetsen gebruiken. Met KEY . zijn hun toetscodes te vinden.

Als voorbeeld komt hier de code van WEST

 : west ( vaknr1 -- vaknr2 )
   dup z mod 0=              \ Vooraan een regel?
   if z + then               \ Dan eerst z bijtellen.
   1- ;
Het kan ook zo:
 : west ( vaknr1 -- vaknr2 )
   z   2dup mod 0=   and +   \ z of 0 bijtellen.
   1- ;
De cursor gaat een vakje naar links. Stond hij op het begin van een regel? Dan springt hij naar het eind van de regel. WEST blijft altijd op dezelfde regel.

Opgave 7

Maak de woorden OOST, NOORD en ZUID voor de cursorbewegingen,
van elk 2 versies: eenmaal met IF en eenmaal zonder IF.
Hier vind je sudo2.f, de file met de code tot nu toe.


 
Groeten,
A.N.
  <terug>