168 lines
2.9 KiB
C
168 lines
2.9 KiB
C
#ifndef lint
|
|
static char sccsid[] = "@(#)moo.c 1.1 94/10/31 SMI"; /* from S5R2 1.2 */
|
|
#endif
|
|
|
|
/* Game: MOO */
|
|
|
|
#include <stdio.h>
|
|
#define SIZE 4
|
|
#define TEN 10
|
|
|
|
int nbulls, ncows, nattempts;
|
|
char number[SIZE], guess[TEN];
|
|
|
|
main(argc,argv)
|
|
char *argv[];
|
|
|
|
{
|
|
extern char *optarg;
|
|
extern int optind;
|
|
int c,i,a;
|
|
|
|
while ((c = getopt(argc,argv,"i"))!= EOF)
|
|
switch(c) {
|
|
case 'i':
|
|
instruct();
|
|
break;
|
|
|
|
case '?':
|
|
printf("usage: moo [-i]\n");
|
|
exit(2);
|
|
}
|
|
|
|
printf("MOO\n");
|
|
for (;;) {
|
|
printf("new game\n");
|
|
nbulls = ncows = nattempts = 0;
|
|
|
|
numgen();
|
|
while (nbulls < 4) {
|
|
nbulls = ncows = 0;
|
|
for (i=0; i<SIZE; ++i) guess[i] = '\b';
|
|
if (a = takeguess() == 1)
|
|
exit(1);
|
|
++nattempts;
|
|
cmatch();
|
|
printout();
|
|
}
|
|
|
|
printf("Attempts = %d\n", nattempts);
|
|
continue;
|
|
}
|
|
}
|
|
|
|
numgen() /* generate number consisting of four random digits */
|
|
{
|
|
int i,j,mark;
|
|
|
|
i = 0;
|
|
while (i < SIZE) {
|
|
mark = 0;
|
|
number[i] = rand()%10 + '0';
|
|
for ( j = i-1; j >= 0; --j) {
|
|
if (number[i] == number[j]) {
|
|
mark = 1;
|
|
break;
|
|
}
|
|
}
|
|
if (mark == 0)
|
|
++i;
|
|
}
|
|
}
|
|
|
|
printout()
|
|
{
|
|
printf("bulls = %d cows = %d\n", nbulls,ncows);
|
|
}
|
|
|
|
takeguess() /* take input guess */
|
|
{
|
|
int i,flag;
|
|
char *s;
|
|
|
|
s = guess;
|
|
flag = 1;
|
|
while (flag) {
|
|
flag = 0;
|
|
printf("your guess?\n");
|
|
if (gets(s) != NULL) {
|
|
if (guess[0] == 'q' && guess[1] == '\0')
|
|
return(1);
|
|
for (i=0; i<SIZE; ++i) {
|
|
if (guess[i] == '\b' || guess[i]<'0' || guess[i]>'9') {
|
|
flag = 1;
|
|
printf("bad guess\n");
|
|
break;
|
|
}
|
|
}
|
|
if (guess[SIZE] != '\0') {
|
|
printf("bad guess\n");
|
|
flag = 1;
|
|
}
|
|
}
|
|
else
|
|
return(1);
|
|
}
|
|
|
|
}
|
|
|
|
cmatch() /* matching of player's guess and actual number */
|
|
{
|
|
int i,j;
|
|
|
|
i=j=0;
|
|
|
|
while(i < SIZE) {
|
|
while(j < SIZE) {
|
|
if (guess[i] != number[j])
|
|
++j;
|
|
else {
|
|
if (i == j)
|
|
++nbulls;
|
|
else
|
|
++ncows;
|
|
if (i <= SIZE - 1) {
|
|
if (i == SIZE - 1) {
|
|
++i;
|
|
break;
|
|
}
|
|
++i;
|
|
j = 0;
|
|
}
|
|
}
|
|
}
|
|
if (i < SIZE) {
|
|
++i;
|
|
j = 0;
|
|
}
|
|
}
|
|
}
|
|
|
|
/* set of instructions for the game */
|
|
char *inst[] = {
|
|
"How to play MOO:",
|
|
"The computer selects a random number which consists of four",
|
|
"different digits. The objective of the game is for the player",
|
|
"to guess the correct digits and their correct positions. A",
|
|
"correctly guessed digit and its position is called a bull.",
|
|
"A cow is when a number is correctly guessed but not its position.",
|
|
"A player correctly guesses the number when the number of bulls is",
|
|
"equal to four. The number of attempts that the player took to",
|
|
"guess is given at the end of each game. When a game is finished",
|
|
"(bulls=4), another one begins immediately. If the player does not",
|
|
"wish to continue playing, he or she should type control-C or",
|
|
"type the character q.",
|
|
"Have fun!",
|
|
"",
|
|
};
|
|
|
|
instruct()
|
|
{
|
|
register char **cpp;
|
|
|
|
printf("\n");
|
|
|
|
for ( cpp = inst; **cpp != '\0'; ++cpp )
|
|
printf("%s\n", *cpp);
|
|
}
|