xref: /dragonfly/games/hangman/getguess.c (revision ef2b2b9d)
1 /*	$OpenBSD: getguess.c,v 1.13 2015/02/07 03:30:08 tedu Exp $	*/
2 /*	$NetBSD: getguess.c,v 1.5 1995/03/23 08:32:43 cgd Exp $	*/
3 
4 /*
5  * Copyright (c) 1983, 1993
6  *	The Regents of the University of California.  All rights reserved.
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
11  * 1. Redistributions of source code must retain the above copyright
12  *    notice, this list of conditions and the following disclaimer.
13  * 2. Redistributions in binary form must reproduce the above copyright
14  *    notice, this list of conditions and the following disclaimer in the
15  *    documentation and/or other materials provided with the distribution.
16  * 3. Neither the name of the University nor the names of its contributors
17  *    may be used to endorse or promote products derived from this software
18  *    without specific prior written permission.
19  *
20  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
21  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
24  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30  * SUCH DAMAGE.
31  */
32 
33 #include <sys/ttydefaults.h>
34 #include "hangman.h"
35 
36 /*
37  * getguess:
38  *	Get another guess
39  */
40 void
41 getguess(void)
42 {
43 	int i;
44 	unsigned char ch, uch;
45 	bool correct;
46 
47 	leaveok(stdscr, FALSE);
48 	for (;;) {
49 		move(PROMPTY, PROMPTX + sizeof("Guess: "));
50 		refresh();
51 		ch = readch();
52 		if (isalpha(ch)) {
53 			if (isupper(ch))
54 				ch = tolower(ch);
55 			if (Guessed[ch - 'a']) {
56 				move(MESGY, MESGX);
57 				clrtoeol();
58 				mvprintw(MESGY, MESGX, "Already guessed '%c'",
59 				    ch);
60 			} else
61 				break;
62 		} else if (isdigit(ch)) {
63 			if (Guessed[ch - '0' + 26]) {
64 				move(MESGY, MESGX);
65 				clrtoeol();
66 				mvprintw(MESGY, MESGX, "Already guessed '%c'",
67 				    ch);
68 			} else
69 				break;
70 		} else
71 			if (ch == CTRL('D'))
72 				die(0);
73 			else {
74 				move(MESGY, MESGX);
75 				clrtoeol();
76 				mvprintw(MESGY, MESGX,
77 				    "Not a valid guess: '%s'", unctrl(ch));
78 			}
79 	}
80 	leaveok(stdscr, TRUE);
81 	move(MESGY, MESGX);
82 	clrtoeol();
83 
84 	if (isalpha(ch))
85 		Guessed[ch - 'a'] = TRUE;
86 	else
87 		Guessed[ch - '0' + 26] = TRUE;
88 	correct = FALSE;
89 	uch = toupper(ch);
90 	for (i = 0; Word[i] != '\0'; i++) {
91 		if (Word[i] == ch) {
92 			Known[i] = ch;
93 			correct = TRUE;
94 		} else if (Word[i] == uch) {
95 			Known[i] = uch;
96 			correct = TRUE;
97 		}
98 	}
99 	if (!correct)
100 		Errors++;
101 }
102 
103 /*
104  * readch;
105  *	Read a character from the input
106  */
107 unsigned char
108 readch(void)
109 {
110 	int cnt;
111 	char ch;
112 
113 	cnt = 0;
114 	for (;;) {
115 		if (read(STDIN_FILENO, &ch, sizeof(ch)) <= 0) {
116 			if (++cnt > 100)
117 				die(0);
118 		} else
119 			if (ch == CTRL('L')) {
120 				wrefresh(curscr);
121 				mvcur(0, 0, curscr->_cury, curscr->_curx);
122 			} else
123 				return ch;
124 	}
125 }
126