/* * Play a single game * Reset the word lists from last game * Keep track of the running stats */ void playgame(void) { int i, *p, *q; time_t t; char buf[MAXWORDLEN + 1]; ngames++; npwords = 0; pwordsp = pwords; nmwords = 0; mwordsp = mwords; time(&start_t); q = &wordpath[MAXWORDLEN + 1]; p = wordpath; while (p < q) *p++ = -1; showboard(board); startwords(); if (setjmp(env)) { badword(); goto timesup; } while (1) { if (get_line(buf) == NULL) { if (feof(stdin)) clearerr(stdin); break; } time(&t); if (t - start_t >= tlimit) { badword(); break; } if (buf[0] == '\0') { int remaining; remaining = tlimit - (int) (t - start_t); (void)snprintf(buf, sizeof(buf), "%d:%02d", remaining / 60, remaining % 60); showstr(buf, 1); continue; } if (strlen(buf) < (size_t)minlength) { badword(); continue; } p = wordpath; while (p < q && *p != -1) *p++ = -1; usedbits = 0; if (checkword(buf, -1, wordpath) < 0) badword(); else { if (debug) { (void) printf("["); for (i = 0; wordpath[i] != -1; i++) (void) printf(" %d", wordpath[i]); (void) printf(" ]\n"); } for (i = 0; i < npwords; i++) { if (strcmp(pword[i], buf) == 0) break; } if (i != npwords) { /* already used the word */ badword(); showword(i); } else if (!validword(buf)) badword(); else { int len; if (npwords == maxpwords - 1) { maxpwords += MAXPWORDS; pword = realloc(pword, maxpwords * sizeof(char *)); if (pword == NULL) { cleanup(); errx(1, strerror(ENOMEM)); } } len = strlen(buf) + 1; if (pwordsp + len >= &pwords[maxpspace]) { maxpspace += MAXPSPACE; pwords = realloc(pwords, maxpspace); if (pwords == NULL) { cleanup(); errx(1, strerror(ENOMEM)); } } pword[npwords++] = pwordsp; memcpy(pwordsp, buf, len); pwordsp += len; addword(buf); } } } timesup: ; /* * Sort the player's words and terminate the list with a null * entry to help out checkdict() */ qsort(pword, npwords, sizeof(pword[0]), compar); pword[npwords] = NULL; /* * These words don't need to be sorted since the dictionary is sorted */ checkdict(); tnmwords += nmwords; tnpwords += npwords; results(); }
// Main input routine // - doesn't accept words longer than MAXWORDLEN or containing caps char *boggle_getline(char *q) { int ch, done; char *p; int row, col; p = q; done = 0; while (!done) { ch = timerch(); switch (ch) { case '\n': case '\r': case ' ': done = 1; break; case '\033': findword(); break; case '\177': // <del> case '\010': // <bs> if (p == q) break; p--; getyx(stdscr, row, col); move(row, col - 1); clrtoeol(); refresh(); break; case '\025': // <^u> case '\027': // <^w> if (p == q) break; getyx(stdscr, row, col); move(row, col - (int) (p - q)); p = q; clrtoeol(); refresh(); break; #ifdef SIGTSTP case '\032': // <^z> stop_catcher(0); break; #endif case '\023': // <^s> stoptime(); printw("<PAUSE>"); refresh(); while ((ch = inputch()) != '\021' && ch != '\023'); move(crow, ccol); clrtoeol(); refresh(); starttime(); break; case '\003': // <^c> cleanup(); exit(0); /*NOTREACHED*/ case '\004': // <^d> done = 1; ch = EOF; break; case '\014': // <^l> case '\022': // <^r> redraw(); break; case '?': stoptime(); if (help() < 0) showstr("Can't open help file", 1); starttime(); break; default: if (!islower(ch)) break; if ((int) (p - q) == MAXWORDLEN) { p = q; badword(); break; } *p++ = ch; addch(ch); refresh(); break; } } *p = '\0'; if (ch == EOF) return (char *) NULL; return q; }