date and time created 87/12/22 13:08:07 by bostic
authorKeith Bostic <bostic@ucbvax.Berkeley.EDU>
Wed, 23 Dec 1987 05:08:07 +0000 (21:08 -0800)
committerKeith Bostic <bostic@ucbvax.Berkeley.EDU>
Wed, 23 Dec 1987 05:08:07 +0000 (21:08 -0800)
SCCS-vsn: games/hangman/getguess.c 5.1
SCCS-vsn: games/hangman/getword.c 5.1

usr/src/games/hangman/getguess.c [new file with mode: 0644]
usr/src/games/hangman/getword.c [new file with mode: 0644]

diff --git a/usr/src/games/hangman/getguess.c b/usr/src/games/hangman/getguess.c
new file mode 100644 (file)
index 0000000..6517821
--- /dev/null
@@ -0,0 +1,86 @@
+/*
+ * Copyright (c) 1987 Regents of the University of California.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that this notice is preserved and that due credit is given
+ * to the University of California at Berkeley. The name of the University
+ * may not be used to endorse or promote products derived from this
+ * software without specific prior written permission. This software
+ * is provided ``as is'' without express or implied warranty.
+ */
+
+#ifndef lint
+static char sccsid[] = "@(#)getguess.c 5.1 (Berkeley) %G%";
+#endif /* not lint */
+
+# include      "hangman.h"
+
+/*
+ * getguess:
+ *     Get another guess
+ */
+getguess()
+{
+       register int    i;
+       register int    ch;
+       register bool   correct;
+
+       leaveok(stdscr, FALSE);
+       for (;;) {
+               move(PROMPTY, PROMPTX + sizeof "Guess: ");
+               refresh();
+               ch = readch();
+               if (isalpha(ch)) {
+                       if (isupper(ch))
+                               ch = tolower(ch);
+                       if (Guessed[ch - 'a'])
+                               mvprintw(MESGY, MESGX, "Already guessed '%c'", ch);
+                       else
+                               break;
+               }
+               else if (ch == CTRL(D))
+                       die();
+               else
+                       mvprintw(MESGY, MESGX, "Not a valid guess: '%s'",
+                               unctrl(ch));
+       }
+       leaveok(stdscr, TRUE);
+       move(MESGY, MESGX);
+       clrtoeol();
+
+       Guessed[ch - 'a'] = TRUE;
+       correct = FALSE;
+       for (i = 0; Word[i] != '\0'; i++)
+               if (Word[i] == ch) {
+                       Known[i] = ch;
+                       correct = TRUE;
+               }
+       if (!correct)
+               Errors++;
+}
+
+/*
+ * readch;
+ *     Read a character from the input
+ */
+readch()
+{
+       register int    cnt, r;
+       auto char       ch;
+
+       cnt = 0;
+       for (;;) {
+               if (read(0, &ch, sizeof ch) <= 0)
+               {
+                       if (++cnt > 100)
+                               die();
+               }
+               else if (ch == CTRL(L)) {
+                       wrefresh(curscr);
+                       mvcur(0, 0, curscr->_cury, curscr->_curx);
+               }
+               else
+                       return ch;
+       }
+}
diff --git a/usr/src/games/hangman/getword.c b/usr/src/games/hangman/getword.c
new file mode 100644 (file)
index 0000000..55cae1a
--- /dev/null
@@ -0,0 +1,71 @@
+/*
+ * Copyright (c) 1987 Regents of the University of California.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that this notice is preserved and that due credit is given
+ * to the University of California at Berkeley. The name of the University
+ * may not be used to endorse or promote products derived from this
+ * software without specific prior written permission. This software
+ * is provided ``as is'' without express or implied warranty.
+ */
+
+#ifndef lint
+static char sccsid[] = "@(#)getword.c  5.1 (Berkeley) %G%";
+#endif /* not lint */
+
+# include      "hangman.h"
+
+# if pdp11
+#      define  RN      (((off_t) rand() << 16) | (off_t) rand())
+# else
+#      define  RN      rand()
+# endif
+
+/*
+ * getword:
+ *     Get a valid word out of the dictionary file
+ */
+getword()
+{
+       register FILE           *inf;
+       register char           *wp, *gp;
+
+       inf = Dict;
+       for (;;) {
+               fseek(inf, abs(RN % Dict_size), 0);
+               if (fgets(Word, BUFSIZ, inf) == NULL)
+                       continue;
+               if (fgets(Word, BUFSIZ, inf) == NULL)
+                       continue;
+               Word[strlen(Word) - 1] = '\0';
+               if (strlen(Word) < MINLEN)
+                       continue;
+               for (wp = Word; *wp; wp++)
+                       if (!islower(*wp))
+                               goto cont;
+               break;
+cont:          ;
+       }
+       gp = Known;
+       wp = Word;
+       while (*wp) {
+               *gp++ = '-';
+               wp++;
+       }
+       *gp = '\0';
+}
+
+/*
+ * abs:
+ *     Return the absolute value of an integer
+ */
+off_t
+abs(i)
+off_t  i;
+{
+       if (i < 0)
+               return -(off_t) i;
+       else
+               return (off_t) i;
+}