home *** CD-ROM | disk | FTP | other *** search
/ The C Users' Group Library 1994 August / wc-cdrom-cusersgrouplibrary-1994-08.iso / vol_200 / 202_01 / karel.h < prev    next >
Text File  |  1979-12-31  |  8KB  |  285 lines

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