Relay-Version: version B 2.10 5/3/83; site utzoo.UUCP Posting-Version: version B 2.10.2 9/18/84; site ucsfcgl.UUCP Path: utzoo!watmath!clyde!burl!ulysses!allegra!mit-eddie!genrad!decvax!ucbvax!ucsfcgl!arnold From: arnold@ucsfcgl.UUCP (Ken Arnold%CGL) Newsgroups: net.sources.games Subject: Re: Looking for curses version of hangman Message-ID: <481@ucsfcgl.UUCP> Date: Thu, 11-Apr-85 15:10:07 EST Article-I.D.: ucsfcgl.481 Posted: Thu Apr 11 15:10:07 1985 Date-Received: Sat, 13-Apr-85 05:10:35 EST References: <477@petsd.UUCP> <601@rlgvax.UUCP> Reply-To: arnold@ucsfcgl.UUCP (PUT YOUR NAME HERE) Organization: UCSF Computer Graphics Lab Lines: 608 Summary: #!/bin/sh # # In article <601@rlgvax.UUCP> guy@rlgvax.UUCP (Guy Harris) writes: # >> Does anyone have a version of /usr/games/hangman that draws the hangman on # >> the screen? Could this be called hang-o-matic? If so, please post it to # >> net.sources.games. # >Yup, Berkeley does. 4.1BSD has the program, but no source; 4.2BSD has the # >source. I also did one once, which would be free of any Berkeley licensing # >requirements but, alas, it was based on the Bell "hangman" so it's not free # >of AT&T licensing requirements. # > Guy Harris # # The version distributed with Berkeley was not based on Bell's, so it # doesn't have any licensing requirements besides Berkeley's. I wrote it, # so I'm sure. # # (If I had the energy, I would get offended by the suggestion that I # would need to look at someone else's code to figure out how to write # a measly \hangman/ program.) # # In fact, here is the source, so that non-Berkeley sites # can have it. That is why there are comment chars at the beginning of # these lines, because... # # This is a shell archive, meaning: # 1. Remove everything above the #!/bin/sh line. # 2. Save the resulting text in a file. # 3. Execute the file with /bin/sh (not csh) to create the files: # Makefile # endgame.c # extern.c # getguess.c # getword.c # hangman.h # main.c # playgame.c # prdata.c # prman.c # prword.c # setup.c # hangman.6 # This archive created: Thu Apr 11 12:03:33 1985 export PATH; PATH=/bin:$PATH echo shar: extracting "'Makefile'" '(493 characters)' if test -f 'Makefile' then echo shar: over-writing existing file "'Makefile'" fi sed 's/^X//' << \SHAR_EOF > 'Makefile' XOBJS= endgame.o extern.o getguess.o getword.o main.o playgame.o \ X prdata.o prman.o prword.o setup.o XCFILES= endgame.c extern.c getguess.c getword.c main.c playgame.c \ X prdata.c prman.c prword.c setup.c XHDRS= hangman.h XCFLAGS= -O XLDFLAGS= -g X Xall: hangman X Xtags: $(HDRS) $(CFILES) X ctags $(HDRS) $(CFILES) X Xinstall: hangman X install -s hangman $(DESTDIR)/usr/games/hangman X Xhangman: $(OBJS) X $(CC) $(LDFLAGS) -o hangman $(OBJS) -lcurses -ltermlib X Xclean: X rm -f $(OBJS) hangman ? core SHAR_EOF if test 493 -ne "`wc -c 'Makefile'`" then echo shar: error transmitting "'Makefile'" '(should have been 493 characters)' fi echo shar: extracting "'endgame.c'" '(623 characters)' if test -f 'endgame.c' then echo shar: over-writing existing file "'endgame.c'" fi sed 's/^X//' << \SHAR_EOF > 'endgame.c' X# include "hangman.h" X X/* X * endgame: X * Do what's necessary at the end of the game X */ Xendgame() X{ X register char ch; X X prman(); X if (Errors >= MAXERRS) X Errors = MAXERRS + 2; X prword(); X prdata(); X move(MESGY, MESGX); X if (Errors > MAXERRS) X printw("Sorry, the word was \"%s\"\n", Word); X else X printw("You got it!\n"); X X for (;;) { X mvaddstr(MESGY + 1, MESGX, "Another word? "); X leaveok(stdscr, FALSE); X refresh(); X if ((ch = readch()) == 'n') X die(); X else if (ch == 'y') X break; X mvaddstr(MESGY + 2, MESGX, "Please type 'y' or 'n'"); X } X X leaveok(stdscr, TRUE); X move(MESGY, MESGX); X addstr("\n\n\n"); X} SHAR_EOF if test 623 -ne "`wc -c 'endgame.c'`" then echo shar: error transmitting "'endgame.c'" '(should have been 623 characters)' fi echo shar: extracting "'extern.c'" '(494 characters)' if test -f 'extern.c' then echo shar: over-writing existing file "'extern.c'" fi sed 's/^X//' << \SHAR_EOF > 'extern.c' X# include "hangman.h" X Xbool Guessed[26]; X Xchar Word[BUFSIZ], X Known[BUFSIZ], X *Noose_pict[] = { X " ______", X " | |", X " |", X " |", X " |", X " |", X " __|_____", X " | |___", X " |_________|", X NULL X }; X Xint Errors, X Wordnum = 0; X Xdouble Average = 0.0; X XERR_POS Err_pos[MAXERRS] = { X { 2, 10, 'O' }, X { 3, 10, '|' }, X { 4, 10, '|' }, X { 5, 9, '/' }, X { 3, 9, '/' }, X { 3, 11, '\\' }, X { 5, 11, '\\' } X}; X XFILE *Dict = NULL; X Xoff_t Dict_size; SHAR_EOF if test 494 -ne "`wc -c 'extern.c'`" then echo shar: error transmitting "'extern.c'" '(should have been 494 characters)' fi echo shar: extracting "'getguess.c'" '(1090 characters)' if test -f 'getguess.c' then echo shar: over-writing existing file "'getguess.c'" fi sed 's/^X//' << \SHAR_EOF > 'getguess.c' X# include "hangman.h" X X/* X * getguess: X * Get another guess X */ Xgetguess() X{ X register int i; X register int ch; X register bool correct; X X leaveok(stdscr, FALSE); X for (;;) { X move(PROMPTY, PROMPTX + sizeof "Guess: "); X refresh(); X ch = readch(); X if (isalpha(ch)) { X if (isupper(ch)) X ch = tolower(ch); X if (Guessed[ch - 'a']) X mvprintw(MESGY, MESGX, "Already guessed '%c'", ch); X else X break; X } X else if (ch == CTRL(D)) X die(); X else X mvprintw(MESGY, MESGX, "Not a valid guess: '%s'", X unctrl(ch)); X } X leaveok(stdscr, TRUE); X move(MESGY, MESGX); X clrtoeol(); X X Guessed[ch - 'a'] = TRUE; X correct = FALSE; X for (i = 0; Word[i] != '\0'; i++) X if (Word[i] == ch) { X Known[i] = ch; X correct = TRUE; X } X if (!correct) X Errors++; X} X X/* X * readch; X * Read a character from the input X */ Xreadch() X{ X register int cnt, r; X auto char ch; X X cnt = 0; X for (;;) { X if (read(0, &ch, sizeof ch) <= 0) X { X if (++cnt > 100) X die(); X } X else if (ch == CTRL(L)) { X wrefresh(curscr); X mvcur(0, 0, curscr->_cury, curscr->_curx); X } X else X return ch; X } X} SHAR_EOF if test 1090 -ne "`wc -c 'getguess.c'`" then echo shar: error transmitting "'getguess.c'" '(should have been 1090 characters)' fi echo shar: extracting "'getword.c'" '(806 characters)' if test -f 'getword.c' then echo shar: over-writing existing file "'getword.c'" fi sed 's/^X//' << \SHAR_EOF > 'getword.c' X# include "hangman.h" X X# if pdp11 X# define RN (((off_t) rand() << 16) | (off_t) rand()) X# else X# define RN rand() X# endif X X/* X * getword: X * Get a valid word out of the dictionary file X */ Xgetword() X{ X register FILE *inf; X register char *wp, *gp; X X inf = Dict; X for (;;) { X fseek(inf, abs(RN % Dict_size), 0); X if (fgets(Word, BUFSIZ, inf) == NULL) X continue; X if (fgets(Word, BUFSIZ, inf) == NULL) X continue; X Word[strlen(Word) - 1] = '\0'; X if (strlen(Word) < MINLEN) X continue; X for (wp = Word; *wp; wp++) X if (!islower(*wp)) X goto cont; X break; Xcont: ; X } X gp = Known; X wp = Word; X while (*wp) { X *gp++ = '-'; X wp++; X } X *gp = '\0'; X} X X/* X * abs: X * Return the absolute value of an integer X */ Xoff_t Xabs(i) Xoff_t i; X{ X if (i < 0) X return -(off_t) i; X else X return (off_t) i; X} SHAR_EOF if test 806 -ne "`wc -c 'getword.c'`" then echo shar: error transmitting "'getword.c'" '(should have been 806 characters)' fi echo shar: extracting "'hangman.h'" '(712 characters)' if test -f 'hangman.h' then echo shar: over-writing existing file "'hangman.h'" fi sed 's/^X//' << \SHAR_EOF > 'hangman.h' X# include X# include X# include X# include X# include X X# define MINLEN 6 X# define MAXERRS 7 X# define DICT "/usr/dict/words" X X# define MESGY 12 X# define MESGX 0 X# define PROMPTY 11 X# define PROMPTX 0 X# define KNOWNY 10 X# define KNOWNX 1 X# define NUMBERY 4 X# define NUMBERX (COLS - 1 - 26) X# define AVGY 5 X# define AVGX (COLS - 1 - 26) X# define GUESSY 2 X# define GUESSX (COLS - 1 - 26) X X Xtypedef struct { X short y, x; X char ch; X} ERR_POS; X Xextern bool Guessed[]; X Xextern char Word[], Known[], *Noose_pict[]; X Xextern int Errors, Wordnum; X Xextern double Average; X Xextern ERR_POS Err_pos[]; X Xextern FILE *Dict; X Xextern off_t Dict_size; X Xint die(); X Xoff_t abs(); SHAR_EOF if test 712 -ne "`wc -c 'hangman.h'`" then echo shar: error transmitting "'hangman.h'" '(should have been 712 characters)' fi echo shar: extracting "'main.c'" '(354 characters)' if test -f 'main.c' then echo shar: over-writing existing file "'main.c'" fi sed 's/^X//' << \SHAR_EOF > 'main.c' X# include "hangman.h" X X/* X * This game written by Ken Arnold. X */ Xmain() X{ X initscr(); X signal(SIGINT, die); X setup(); X for (;;) { X Wordnum++; X playgame(); X Average = (Average * (Wordnum - 1) + Errors) / Wordnum; X } X /* NOTREACHED */ X} X X/* X * die: X * Die properly. X */ Xdie() X{ X mvcur(0, COLS - 1, LINES - 1, 0); X endwin(); X putchar('\n'); X exit(0); X} SHAR_EOF if test 354 -ne "`wc -c 'main.c'`" then echo shar: error transmitting "'main.c'" '(should have been 354 characters)' fi echo shar: extracting "'playgame.c'" '(299 characters)' if test -f 'playgame.c' then echo shar: over-writing existing file "'playgame.c'" fi sed 's/^X//' << \SHAR_EOF > 'playgame.c' X# include "hangman.h" X X/* X * playgame: X * play a game X */ Xplaygame() X{ X register bool *bp; X X getword(); X Errors = 0; X bp = Guessed; X while (bp < &Guessed[26]) X *bp++ = FALSE; X while (Errors < MAXERRS && index(Known, '-') != NULL) { X prword(); X prdata(); X prman(); X getguess(); X } X endgame(); X} SHAR_EOF if test 299 -ne "`wc -c 'playgame.c'`" then echo shar: error transmitting "'playgame.c'" '(should have been 299 characters)' fi echo shar: extracting "'prdata.c'" '(520 characters)' if test -f 'prdata.c' then echo shar: over-writing existing file "'prdata.c'" fi sed 's/^X//' << \SHAR_EOF > 'prdata.c' X# include "hangman.h" X X/* X * prdata: X * Print out the current guesses X */ Xprdata() X{ X register bool *bp; X X move(GUESSY, GUESSX + sizeof "Guessed: "); X bp = Guessed; X while (bp < &Guessed[26]) X if (*bp++) X addch((bp - Guessed) + 'a' - 1); X clrtoeol(); X mvprintw(NUMBERY, NUMBERX + sizeof "Word #: ", "%d", Wordnum); X mvprintw(AVGY, AVGX + sizeof "Current Average: ", "%.3f", X (Average * (Wordnum - 1) + Errors) / Wordnum); X mvprintw(AVGY + 1, AVGX + sizeof "Overall Average: ", "%.3f", Average); X} SHAR_EOF if test 520 -ne "`wc -c 'prdata.c'`" then echo shar: error transmitting "'prdata.c'" '(should have been 520 characters)' fi echo shar: extracting "'prman.c'" '(311 characters)' if test -f 'prman.c' then echo shar: over-writing existing file "'prman.c'" fi sed 's/^X//' << \SHAR_EOF > 'prman.c' X# include "hangman.h" X X/* X * prman: X * Print out the man appropriately for the give number X * of incorrect guesses. X */ Xprman() X{ X register int i; X X for (i = 0; i < Errors; i++) X mvaddch(Err_pos[i].y, Err_pos[i].x, Err_pos[i].ch); X while (i < MAXERRS) { X mvaddch(Err_pos[i].y, Err_pos[i].x, ' '); X i++; X } X} SHAR_EOF if test 311 -ne "`wc -c 'prman.c'`" then echo shar: error transmitting "'prman.c'" '(should have been 311 characters)' fi echo shar: extracting "'prword.c'" '(167 characters)' if test -f 'prword.c' then echo shar: over-writing existing file "'prword.c'" fi sed 's/^X//' << \SHAR_EOF > 'prword.c' X# include "hangman.h" X X/* X * prword: X * Print out the current state of the word X */ Xprword() X{ X move(KNOWNY, KNOWNX + sizeof "Word: "); X addstr(Known); X clrtoeol(); X} SHAR_EOF if test 167 -ne "`wc -c 'prword.c'`" then echo shar: error transmitting "'prword.c'" '(should have been 167 characters)' fi echo shar: extracting "'setup.c'" '(669 characters)' if test -f 'setup.c' then echo shar: over-writing existing file "'setup.c'" fi sed 's/^X//' << \SHAR_EOF > 'setup.c' X# include "hangman.h" X X/* X * setup: X * Set up the strings on the screen. X */ Xsetup() X{ X register char **sp; X static struct stat sbuf; X X noecho(); X crmode(); X X mvaddstr(PROMPTY, PROMPTX, "Guess:"); X mvaddstr(GUESSY, GUESSX, "Guessed:"); X mvaddstr(NUMBERY, NUMBERX, "Word #:"); X mvaddstr(AVGY, AVGX, "Current Average:"); X mvaddstr(AVGY + 1, AVGX, "Overall Average:"); X mvaddstr(KNOWNY, KNOWNX, "Word: "); X X for (sp = Noose_pict; *sp != NULL; sp++) { X move(sp - Noose_pict, 0); X addstr(*sp); X } X X srand(time(NULL) + getpid()); X if ((Dict = fopen(DICT, "r")) == NULL) { X perror(DICT); X endwin(); X exit(1); X } X fstat(fileno(Dict), &sbuf); X Dict_size = sbuf.st_size; X} SHAR_EOF if test 669 -ne "`wc -c 'setup.c'`" then echo shar: error transmitting "'setup.c'" '(should have been 669 characters)' fi echo shar: extracting "'hangman.6'" '(451 characters)' if test -f 'hangman.6' then echo shar: over-writing existing file "'hangman.6'" fi sed 's/^X//' << \SHAR_EOF > 'hangman.6' X.TH HANGMAN 6 "1 February 1983" X.UC 4 X.SH NAME Xhangman \- Computer version of the game hangman X.SH SYNOPSIS X.B /usr/games/hangman X.SH DESCRIPTION XIn X.I hangman, Xthe computer picks a word from the on-line word list Xand you must try to guess it. XThe computer keeps track of which letters have been guessed Xand how many wrong guesses you have made on the screen in a graphic fashion. X.SH FILES X/usr/dict/words On-line word list X.SH AUTHOR XKen Arnold SHAR_EOF if test 451 -ne "`wc -c 'hangman.6'`" then echo shar: error transmitting "'hangman.6'" '(should have been 451 characters)' fi # End of shell archive exit 0