home *** CD-ROM | disk | FTP | other *** search
- #include "stdio.h"
- #include "lrnref"
-
- int nsave = 0;
-
- selunit()
- {
- char fnam[20], s[50];
- static char dobuff[50];
- char posslev[20][20];
- int diff[20], i, k, m, n, best, alts;
- FILE *f;
- char zb[200];
- static char saved[20];
-
- while (ask) {
- printf("What lesson? ");
- fflush(stdout);
- gets(dobuff);
- if (strcmp(dobuff, "bye") == 0)
- wrapup(0);
- level = todo = dobuff;
- sprintf(s, "../../%s/L%s", sname, dobuff);
- if (access(s, 04) == 0)
- return;
- printf("no such lesson\n");
- }
- alts = 0;
- retry:
- f=scrin;
- if (f==NULL) {
- sprintf(fnam, "../../%s/L%s", sname, level);
- f = fopen(fnam, "r");
- if (f==NULL) {
- fprintf(stderr, "No script for lesson %s.\n", level);
- wrapup(1);
- }
- while (fgets(zb, 200, f)) {
- trim(zb);
- if (strcmp(zb, "#next")==0)
- break;
- }
- }
- if (feof(f)) {
- printf("Congratulations; you have finished this sequence.\n");
- fflush(stdout);
- todo = 0;
- return;
- }
- for(i=0; fgets(s, 50, f); i++) {
- sscanf(s, "%s %d", posslev[i], &diff[i]);
- }
- best = -1;
- /* cycle through lessons from random start */
- /* first try the current place, failing that back up to
- last place there are untried alternatives (but only one backup) */
- n = grand()%i;
- for(k=0; k<i; k++) {
- m = (n+k)%i;
- if (already(posslev[m],0)) continue;
- if (best<0) best=m;
- /* real alternatives */
- alts++;
- if (abs(diff[m]-speed) < abs(diff[best]-speed))
- best=m;
- }
- if (best < 0 && nsave) {
- nsave--;
- strcpy(level, saved);
- goto retry;
- }
- if (best <0) {
- /* lessons exhausted or missing */
- printf("Sorry, there are no alternative lessons at this stage.\n");
- printf("See someone for help.\n");
- fflush(stdout);
- todo = 0;
- return;
- }
- strcpy (dobuff, posslev[best]);
- if (alts>1) {
- nsave=1;
- strcpy (saved, level);
- }
- todo = dobuff;
- fclose(f);
- }
-
- abs(x)
- {
- return(x>=0? x: -x);
- }
-
- grand()
- {
- static int garbage;
- int a[2], b;
-
- time(a);
- b = a[1]+10*garbage++;
- return(b&077777);
- }
-