home *** CD-ROM | disk | FTP | other *** search
/ Crawly Crypt Collection 1 / crawlyvol1.bin / apps / educatin / morse / quiz.c < prev    next >
C/C++ Source or Header  |  1985-11-19  |  3KB  |  131 lines

  1. #include <stdio.h>
  2. #include <gemlib.h>
  3. #include <morse.c>
  4. #include <sendgem.c>
  5.  
  6. short ytext[4], yprompt[4];
  7.  
  8. main()
  9. {
  10.     short i, done, speed, score;
  11.     char text[132];
  12.  
  13.     gem_init();
  14.     clear_window( ywork );
  15.  
  16.     /* Define box for explanatory text */
  17.     i = (wwork - 40*gl_wchar)/2;
  18.     if( i < 0 )
  19.         terminate( "[3][Insufficient screen resolution!][Abort]" );
  20.     ytext[0] = xwork+i;
  21.     ytext[2] = xwork+wwork-i;
  22.     ytext[1] = ywork+gl_hchar;
  23.     ytext[3] = ytext[1] + (gl_hchar<<3) + gl_hchar;
  24.  
  25.     /* Define box for prompts and messages */
  26.     yprompt[0] = ytext[0];
  27.     yprompt[2] = ytext[2];
  28.     yprompt[1] = ytext[3] + (gl_hchar<<2);
  29.     yprompt[3] = yprompt[1] + (gl_hchar<<2);
  30.  
  31.     i = form_alert( 1, "[1][What level are you practicing for?][Novice|General|Extra]" );
  32.     if( i == 1 ) speed = 7;
  33.     else if( i == 2 ) speed = 15;
  34.     else if( i == 3 ) speed = 25;
  35.  
  36.     done = FALSE;
  37.     while( !done )
  38.     {
  39.         score = code_quiz( speed );
  40.         graf_mouse( M_ON, 0x0L );
  41.         graf_mouse( ARROW, 0x0L );
  42.         sprintf( text, "[3][Quiz completed!|Your score: %d%%][Repeat|Quit]", score );
  43.         if( form_alert( 2, text ) == 2 )
  44.             done = TRUE;
  45.     }
  46.  
  47.     terminate( NULL );
  48. }    /* main */
  49.  
  50. code_quiz( speed )    /* Perform code quiz */
  51. short speed;
  52. {
  53.     char qstr[44], codech[2], ans, get_answer();
  54.     short lastch, guessflag, nw, nr;
  55.     long i;
  56.  
  57.     clear_window( ywork );
  58.     graf_mouse( M_OFF, 0x0L );
  59.  
  60.     /* Set timing values */
  61.     l_dot = l_el = 1200/speed;
  62.     l_dash = l_char = l_dot*3;
  63.     l_word = l_dot*7;
  64.  
  65.     /* Initialize test string */
  66.     strcpy( qstr, "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ.,?+*=/" );
  67.     lastch = 42;
  68.     codech[1] = '\0';
  69.  
  70.     /* Write messages */
  71.     textbox( ytext );
  72.     wputs( "Type the character that you hear." );
  73.     wputs( "Special codes:" );
  74.     wputs( "   + is AR (end of message)" );
  75.     wputs( "   * is SK (end of work)" );
  76.     wputs( "   = is BT" );
  77.     wputs( "The test covers 0-9, A-Z, AR, SK, BT," );
  78.     wputs( "?, /, period, and comma." );
  79.     wputs( "Press UNDO to interrupt the quiz." );
  80.     m_wait( 2000 );
  81.  
  82.     nw = nr = 0;
  83.     while( lastch >= 0 )
  84.     {
  85.         guessflag = 0;
  86.         textbox( yprompt );
  87.         wputs( "Identify this one." );
  88.         i = Random() % (lastch+1);
  89.         codech[0] = qstr[i];
  90.         while( guessflag >= 0 )
  91.         {
  92.             ev_mkreturn = 0;
  93.             send_morse( codech );
  94.             ans = toupper( get_answer() );
  95.             if( ans == 0 )    /* assume UNDO, quit */
  96.                 return( nr ? (nr*100)/(nr+nw) : 0 );
  97.             textbox( yprompt );
  98.             if( ans != codech[0] )
  99.             {
  100.                 nw++;
  101.                 wputs( "No, that isn't right." );
  102.                 if( ++guessflag > 2 )
  103.                 {
  104.                     wputs( "The character was:" );
  105.                     wputs( codech );
  106.                     guessflag = -1;
  107.                     m_wait( 1000 );
  108.                 }
  109.                 else wputs( "Try that one again." );
  110.             }
  111.             else
  112.             {
  113.                 nr++;
  114.                 wputs( "That is correct." );
  115.                 if( guessflag == 0 )
  116.                     qstr[i] = qstr[lastch--];
  117.                 guessflag = -1;
  118.             }
  119.             m_wait( 2000 );
  120.         }
  121.     }
  122.     return( (nr*100)/(nr+nw) );
  123. }    /* code_quiz */
  124.  
  125. char get_answer()
  126. {
  127.     if( ev_mkreturn == 0 ) ev_mkreturn = evnt_keybd();
  128.     return( (char) (ev_mkreturn & 0x0ff) );
  129. }    /* get_answer */
  130.  
  131.