User Interface Interaction

After creating a Match m, UI follows a relatively simple loop,

  1. Get events from m and present them to user one at a time.
  2. Collect one user action.
  3. Pass user action to m.
  4. Go back to step 1.

Collecting a user action can be as simple as reporting a button press, or slightly more complex such as collecting a move.

Below is a rough sketch of user code flow. It is written in pseudocode and omits some details, but is useful for understanding the overall structure. For a real example have a look at `../interfaces/tkbglight/tklight.tcl'.

For lack of better names I shall call the two sides Hal (computer) and Dave (human).

Create m, display match score, cube, and initial board.

LOOP until match is over
  Call actions (see below)

  IF Dave turn and he may double
     wait for Dave to either
       double  - and call Match::opDoubles
       or roll - and call opRolls
  ELSEIF Dave just rolled
    collect a move, then call opPlays

END-LOOP
Notes: Here is the actions code,

while ( unprocessed event e ) {
  switch ( type(e) ) {
    ROLLS:
      IF Hal rolled  - Draw dice on Hal side of the board[1].
      IF Dave rolled - Draw dice on Hal side of the board.

    MOVES:
      Move checkers on board.
      
      IF Hal moved
        IF Dave may double
	  Enable double button
        ELSE
	  // Nothing to do. The next action will be a roll for Dave.

      ELSE	
        // Dave moved. We get this only when automoves are enabled and this
	// was a forced move
	Pause for a short time to let Dave see what is happening.
      	
    DOUBLES:
      // This can only be Hal. Dave doubles are not reported back.

      Draw doubling cube inside the board on Dave side of board.
      Open a dialog box informing Dave he has been doubled, and ask if he
      takes or drops.
      IF Dave accepts
        Notify Hal (call opTakes)
        Draw doubling cube on board margins, on Dave side of the board
      ELSE
        Notify Hal (call opDrops)

    TAKES:
      // This can only be Hal. Dave takes are not reported back.
      Draw doubling cube on board margins, on Hal side of the board

    DROPS:
      // This can only be Hal. Dave drops are not reported back.
      Notify Dave that he won this game
      
    RESIGNS:
      // This can only be Hal. Dave drops are not reported back.
      Inform Dave that Hal is resigning and how many points he will get. Call
      opAccepts(true) if Dave agrees, opAnswers(false) otherwise.

    WINS:
      Notify Dave who won and how many points.
      Set up for a new game - update display of scores, doubling cube, board
      and so on.

    CRAWFORD:
      Don't let Dave double this game, as this is the Crawford game.
  }
}


1. this is the custom in backgammon