home *** CD-ROM | disk | FTP | other *** search
/ The C Users' Group Library 1994 August / wc-cdrom-cusersgrouplibrary-1994-08.iso / vol_100 / 139_01 / karel.h < prev    next >
Text File  |  1985-08-21  |  7KB  |  294 lines

  1. /*
  2. TITLE:        Karel The Robot;
  3. VERSION:    1.0;
  4. DATE:        09/27/1984;
  5. DESCRIPTION:
  6.     "Header and source for Karel Simulator.";
  7. KEYWORDS:    Robot, Simulator;
  8. SYSTEM:        CP/M 2+;
  9. FILENAME:    KAREL.H;
  10. AUTHORS:    Linda Rising;
  11. COMPILERS:    BDS C;
  12. REFERENCES:
  13.     AUTHOR: Richard E. Pattis;
  14.     TITLE: "KAREL the Robot: A Gentle Introduction
  15.         to the Art of Programming";
  16.     CITATION: "";
  17. ENDREF
  18. */
  19.  
  20.  
  21. #include <bdscio.h>             /* standard header */
  22.  
  23. /* global constants */
  24.  
  25. #define CURPOS  "\033="        /* cursor control ESC = */
  26. #define X_POS     32        /* cursor control for x */
  27. #define Y_POS     32        /* cursor control for y */
  28. #define FILE  struct _buf    /* label for file header */
  29.  
  30. /* global variables */
  31.  
  32. char wworld[23][75];             /* array for Karel's world */
  33. int kst;                /* Karel's street */
  34. int kav;             /* Karel's avenue */
  35. char kdir;             /* Karel's direction */
  36. int nnorth;                  
  37. int ssouth;
  38. int eeast;
  39. int wwest;
  40. int ccorner;
  41. int bbag;
  42. int ffront;
  43. int rright;
  44. int lleft;
  45.  
  46. set_up(argv)   /* prepare for execution of KAREL's program */
  47. char **argv;
  48. {
  49.  
  50.       char ibuf1[BUFSIZ];
  51.  
  52.       fopen(argv[1],ibuf1);
  53.       readworld(ibuf1);
  54.       printworld();
  55.       setbooleans();
  56.       wwait();  wwait();
  57. }
  58.          
  59. readworld(buf)   /* read values stored in world file */
  60. FILE *buf;
  61. {
  62.       int i,j;
  63.  
  64.       fscanf(buf,"%d %d %d",&kst,&kav,&bbag);
  65.       kdir = getc(buf);
  66.       for (i = 0; i < 23; i++)
  67.         for (j = 0; j < 75; j++)
  68.           wworld[i][j] = getc(buf);
  69.       fclose(buf);
  70. }
  71.  
  72.  
  73. printworld()   /* output values stored in world array */
  74. {
  75.           int i,j;
  76.  
  77.           for (i = 0; i < 23; i++) {
  78.             for (j = 0; j < 75; j++)
  79.               printf("%c",wworld[i][j]);
  80.             printf("\n");
  81.      
  82.           } 
  83. }
  84.  
  85.  
  86. setbooleans()     /* evaluate tests for KAREL's program */
  87. {
  88.       char k;
  89.  
  90.       k = wworld[kst][kav];
  91.       if (k == '.' || k == '^' || k == 'V' ||
  92.               k == '>' || k == '<')
  93.          ccorner = 0;
  94.       else ccorner = 1;
  95.  
  96.       nnorth = (kdir == '^');
  97.       ssouth = (kdir == 'V');
  98.       eeast = (kdir == '>');
  99.       wwest = (kdir == '<');
  100.  
  101.       switch(kdir) {
  102.       case '^':
  103.          ffront = (wworld[kst - 1][kav] == ' ');
  104.          rright = (wworld[kst][kav + 2] == ' ');
  105.          lleft = (wworld[kst][kav - 2] == ' ');
  106.          break;
  107.       case 'V':
  108.          ffront = (wworld[kst + 1][kav] == ' ');
  109.          rright = (wworld[kst][kav - 2] == ' ');
  110.          lleft = (wworld[kst][kav + 2] == ' ');
  111.          break;
  112.       case '>':
  113.          ffront = (wworld[kst][kav + 2] == ' ');
  114.          rright = (wworld[kst + 1][kav] == ' ');
  115.          lleft = (wworld[kst - 1][kav] == ' ');
  116.          break;
  117.       case'<':
  118.          ffront = (wworld[kst][kav - 2] == ' ');
  119.          rright = (wworld[kst - 1][kav] == ' ');
  120.          lleft = (wworld[kst + 1][kav] == ' ');
  121.       }
  122. }
  123.  
  124.  
  125. move()        /* move KAREL one unit in direction faced */
  126. {
  127.  
  128.       if (ffront) {               /* if front is clear */
  129.          if (!ccorner) {   /* and no beepers on corner */
  130.             set_curs(kst,kav,1,".");     /* put a "." */
  131.         wwait();
  132.          }
  133.          switch(kdir) {     /* determine new location */
  134.          case '^':
  135.         kst -= 2;
  136.         break;
  137.          case 'V':
  138.         kst += 2;
  139.         break;
  140.          case '<':
  141.         kav -= 4;
  142.         break;
  143.          case '>':
  144.         kav  += 4;
  145.          }
  146.          setbooleans();         /* re-evaluate booleans */
  147.          if (!ccorner) {     /* if no beepers on corner */
  148.         wworld[kst][kav] = kdir;     /* print KAREL */
  149.             set_curs(kst,kav,1,"");
  150.             printf("%c",kdir);
  151.         wwait();
  152.          } else {
  153.           set_curs(kst,kav,1,"");
  154.           printf("%c",kdir);
  155.           wwait();
  156.           set_curs(kst,kav,1,"");
  157.           printf("%c",wworld[kst][kav]);
  158.           wwait();
  159.            }
  160.       } else turnoff(1);  /* error if front is blocked */
  161. }
  162.  
  163.  
  164. turnleft()     /* rotate KAREL 90 degrees counterclockwise */
  165. {
  166.       switch(kdir) {
  167.       case '^':
  168.          kdir = '<';
  169.          break;
  170.       case 'V':
  171.          kdir = '>';
  172.          break;
  173.       case '<':
  174.          kdir = 'V';
  175.          break;
  176.       case '>':
  177.          kdir = '^';
  178.       }
  179.       if (!ccorner) {    /* if no beepers on corner */
  180.           wworld[kst][kav] = kdir;   /* print KAREL */
  181.           set_curs(kst,kav,1,"");
  182.           printf("%c",kdir);
  183.           wwait();
  184.       } else {
  185.            set_curs(kst,kav,1,"");
  186.            printf("%c",kdir);
  187.            wwait();
  188.            set_curs(kst,kav,1,"");
  189.            printf("%c",wworld[kst][kav]);
  190.            wwait();
  191.         } 
  192.       setbooleans();
  193. }
  194.  
  195.  
  196. pickbeeper()    /* pick up a beeper from KAREL's corner */
  197. {
  198.       char k;
  199.       
  200.       k = wworld[kst][kav];
  201.       if (!ccorner)
  202.          turnoff(3);
  203.        else { if (k == '2')
  204.              k = '@';
  205.          else if (k != '@')
  206.              --k;
  207.          else {
  208.         k = kdir;
  209.         ccorner = 0;
  210.          }
  211.          wworld[kst][kav] = k; 
  212.          set_curs(kst,kav,1,"");
  213.          printf("%c",k);
  214.          wwait();
  215.          ++bbag;
  216.       }
  217. }
  218.  
  219. putbeeper()     /* place a beeper on KAREL's corner */
  220. {
  221.       char k;
  222.      
  223.       k = wworld[kst][kav];
  224.       if (!bbag)
  225.          turnoff(2);
  226.       else { 
  227.          if (!ccorner) { 
  228.             k = '@';
  229.             ccorner = 1;
  230.          } else if (k == '@')
  231.                k = '2';
  232.            else if (k == '9')
  233.                set_curs(23,0,75,"ONLY 9 BEEPERS ALLOWED.");
  234.            else ++k;
  235.          wworld[kst][kav] = k;
  236.          set_curs(kst,kav,1,"");
  237.          printf("%c",k);
  238.          wwait();
  239.          --bbag; 
  240.       }
  241. }
  242.  
  243.  
  244. turnoff(code)    /* stop execution of KAREL's program */
  245. int code;
  246. {
  247.       if (code == 0) 
  248.          set_curs(22,0,45,"  END OF EXECUTION.");
  249.       else { 
  250.            set_curs(22,0,45,"  ERROR SHUTOFF.");
  251.            switch (code) {
  252.            case 1:
  253.               set_curs(22,17,0,"FRONT IS BLOCKED.");
  254.               break;
  255.            case 2:
  256.               set_curs(22,17,0,"NO BEEPERS IN BAG.");
  257.               break;
  258.            case 3:
  259.               set_curs(22,17,0,"NO BEEPERS ON CORNER.");
  260.            case 4:
  261.           set_curs(22,17,0,"NO TURNOFF EXECUTED.");
  262.            }
  263.         }
  264.       set_curs(23,37,0,"");
  265.       kst = (21 - kst)/2;
  266.       kav = (kav - 4)/4;
  267.       printf("KAREL'S ST= %d  AVE= %d  DIR= %c BAG= %d",
  268.                         kst,kav,kdir,bbag);
  269.       set_curs(20,0,0,"");
  270.       exit();
  271. }
  272.  
  273.  
  274. set_curs(row,col,blanks,mess)    /* set cursor */
  275. int row,col,blanks;
  276. char *mess;
  277. {
  278.         int j;
  279.  
  280.       printf("%s%c%c", CURPOS, row + X_POS, col + Y_POS);
  281.       for (j = 1; j <= blanks; j++)
  282.         printf(" ");
  283.       printf("%s%c%c", CURPOS, row + X_POS, col + Y_POS);
  284.       printf("%s", mess);
  285. }
  286.  
  287.  
  288. wwait()      /* slow KAREL so execution can be seen */
  289. {
  290.       int j;
  291.  
  292.       for (j = 0; j < 5000; j++)
  293.         ;
  294. }