summaryrefslogtreecommitdiffstats
path: root/fish
diff options
context:
space:
mode:
authorcgd <cgd@NetBSD.org>1993-03-21 09:45:37 +0000
committercgd <cgd@NetBSD.org>1993-03-21 09:45:37 +0000
commit77e3814f0c0e3dea4d0032e25666f77e6f83bfff (patch)
tree7eddfcbf3dd12089e71dc3fafb0a106c5c5766c7 /fish
parente81d63576b2e46ab90da7d75fa155ea57ee4d32e (diff)
downloadbsdgames-darwin-77e3814f0c0e3dea4d0032e25666f77e6f83bfff.tar.gz
bsdgames-darwin-77e3814f0c0e3dea4d0032e25666f77e6f83bfff.tar.zst
bsdgames-darwin-77e3814f0c0e3dea4d0032e25666f77e6f83bfff.zip
initial import of 386bsd-0.1 sources
Diffstat (limited to 'fish')
-rw-r--r--fish/Makefile10
-rw-r--r--fish/fish.684
-rw-r--r--fish/fish.c429
-rw-r--r--fish/fish.instr29
-rw-r--r--fish/pathnames.h37
5 files changed, 589 insertions, 0 deletions
diff --git a/fish/Makefile b/fish/Makefile
new file mode 100644
index 00000000..b1847b71
--- /dev/null
+++ b/fish/Makefile
@@ -0,0 +1,10 @@
+# @(#)Makefile 5.5 (Berkeley) 1/18/91
+
+PROG= fish
+MAN6= fish.0
+HIDEGAME=hidegame
+
+beforeinstall:
+ install -c -o bin -g bin -m 444 ${.CURDIR}/fish.instr /usr/share/games
+
+.include <bsd.prog.mk>
diff --git a/fish/fish.6 b/fish/fish.6
new file mode 100644
index 00000000..f565574a
--- /dev/null
+++ b/fish/fish.6
@@ -0,0 +1,84 @@
+.\" Copyright (c) 1990 The Regents of the University of California.
+.\" All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\" notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\" notice, this list of conditions and the following disclaimer in the
+.\" documentation and/or other materials provided with the distribution.
+.\" 3. All advertising materials mentioning features or use of this software
+.\" must display the following acknowledgement:
+.\" This product includes software developed by the University of
+.\" California, Berkeley and its contributors.
+.\" 4. Neither the name of the University nor the names of its contributors
+.\" may be used to endorse or promote products derived from this software
+.\" without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\" @(#)fish.6 6.2 (Berkeley) 1/18/91
+.\"
+.TH FISH 6 "January 18, 1991"
+.UC 4
+.SH NAME
+fish \- play ``Go Fish''
+.SH SYNOPSIS
+.ft B
+fish [\-p]
+.ft R
+.SH DESCRIPTION
+.I Fish
+is the game
+.IR "Go Fish" ,
+a traditional children's card game.
+.PP
+The computer deals the player and itself seven cards, and places
+the rest of the deck face-down (figuratively).
+The object of the game is to collect ``books'', or all of the members
+of a single rank.
+For example, collecting four 2's would give the player a ``book of
+2's''.
+.PP
+The options are as follows:
+.TP
+\-p
+Professional mode.
+.PP
+The computer makes a random decision as to who gets to start the
+game, and then the computer and player take turns asking each other
+for cards of a specified rank.
+If the asked player has any cards of the requested rank, they give
+them up to the asking player.
+A player must have at least one of the cards of the rank they request
+in their hand.
+When a player asks for a rank of which the other player has no
+cards, the asker is told to ``Go Fish!''.
+Then, the asker draws a card from the non-dealt cards.
+If they draw the card they asked for, they continue their turn, asking
+for more ranks from the other player.
+Otherwise, the other player gets a turn.
+.PP
+When a player completes a book, either by getting cards from the
+other player or drawing from the deck, they set those cards aside and
+the rank is no longer in play.
+.PP
+The game ends when either player no longer has any cards in their hand.
+The player with the most books wins.
+.PP
+.I Fish
+provides instructions as to what input it accepts.
+.SH BUGS
+The computer cheats only rarely.
diff --git a/fish/fish.c b/fish/fish.c
new file mode 100644
index 00000000..0147ff22
--- /dev/null
+++ b/fish/fish.c
@@ -0,0 +1,429 @@
+/*-
+ * Copyright (c) 1990 The Regents of the University of California.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Muffy Barkocy.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the University of
+ * California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef lint
+char copyright[] =
+"@(#) Copyright (c) 1990 The Regents of the University of California.\n\
+ All rights reserved.\n";
+#endif /* not lint */
+
+#ifndef lint
+static char sccsid[] = "@(#)fish.c 5.4 (Berkeley) 1/18/91";
+#endif /* not lint */
+
+#include <sys/types.h>
+#include <sys/errno.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "pathnames.h"
+
+#define RANKS 13
+#define HANDSIZE 7
+#define CARDS 4
+
+#define USER 1
+#define COMPUTER 0
+#define OTHER(a) (1 - (a))
+
+char *cards[] = {
+ "A", "2", "3", "4", "5", "6", "7",
+ "8", "9", "10", "J", "Q", "K", NULL,
+};
+#define PRC(card) (void)printf(" %s", cards[card])
+
+int promode;
+int asked[RANKS], comphand[RANKS], deck[RANKS];
+int userasked[RANKS], userhand[RANKS];
+
+main(argc, argv)
+ int argc;
+ char **argv;
+{
+ int ch, move;
+
+ while ((ch = getopt(argc, argv, "p")) != EOF)
+ switch(ch) {
+ case 'p':
+ promode = 1;
+ break;
+ case '?':
+ default:
+ (void)fprintf(stderr, "usage: fish [-p]\n");
+ exit(1);
+ }
+
+ srandom(time((time_t *)NULL));
+ instructions();
+ init();
+
+ if (nrandom(2) == 1) {
+ printplayer(COMPUTER);
+ (void)printf("get to start.\n");
+ goto istart;
+ }
+ printplayer(USER);
+ (void)printf("get to start.\n");
+
+ for (;;) {
+ move = usermove();
+ if (!comphand[move]) {
+ if (gofish(move, USER, userhand))
+ continue;
+ } else {
+ goodmove(USER, move, userhand, comphand);
+ continue;
+ }
+
+istart: for (;;) {
+ move = compmove();
+ if (!userhand[move]) {
+ if (!gofish(move, COMPUTER, comphand))
+ break;
+ } else
+ goodmove(COMPUTER, move, comphand, userhand);
+ }
+ }
+ /* NOTREACHED */
+}
+
+usermove()
+{
+ register int n;
+ register char **p;
+ char buf[256];
+
+ (void)printf("\nYour hand is:");
+ printhand(userhand);
+
+ for (;;) {
+ (void)printf("You ask me for: ");
+ (void)fflush(stdout);
+ if (fgets(buf, BUFSIZ, stdin) == NULL)
+ exit(0);
+ if (buf[0] == '\0')
+ continue;
+ if (buf[0] == '\n') {
+ (void)printf("%d cards in my hand, %d in the pool.\n",
+ countcards(comphand), countcards(deck));
+ (void)printf("My books:");
+ (void)countbooks(comphand);
+ continue;
+ }
+ buf[strlen(buf) - 1] = '\0';
+ if (!strcasecmp(buf, "p") && !promode) {
+ promode = 1;
+ (void)printf("Entering pro mode.\n");
+ continue;
+ }
+ if (!strcasecmp(buf, "quit"))
+ exit(0);
+ for (p = cards; *p; ++p)
+ if (!strcasecmp(*p, buf))
+ break;
+ if (!*p) {
+ (void)printf("I don't understand!\n");
+ continue;
+ }
+ n = p - cards;
+ if (userhand[n]) {
+ userasked[n] = 1;
+ return(n);
+ }
+ if (nrandom(3) == 1)
+ (void)printf("You don't have any of those!\n");
+ else
+ (void)printf("You don't have any %s's!\n", cards[n]);
+ if (nrandom(4) == 1)
+ (void)printf("No cheating!\n");
+ (void)printf("Guess again.\n");
+ }
+ /* NOTREACHED */
+}
+
+compmove()
+{
+ static int lmove;
+
+ if (promode)
+ lmove = promove();
+ else {
+ do {
+ lmove = (lmove + 1) % RANKS;
+ } while (!comphand[lmove] || comphand[lmove] == CARDS);
+ }
+ asked[lmove] = 1;
+
+ (void)printf("I ask you for: %s.\n", cards[lmove]);
+ return(lmove);
+}
+
+promove()
+{
+ register int i, max;
+
+ for (i = 0; i < RANKS; ++i)
+ if (userasked[i] &&
+ comphand[i] > 0 && comphand[i] < CARDS) {
+ userasked[i] = 0;
+ return(i);
+ }
+ if (nrandom(3) == 1) {
+ for (i = 0;; ++i)
+ if (comphand[i] && comphand[i] != CARDS) {
+ max = i;
+ break;
+ }
+ while (++i < RANKS)
+ if (comphand[i] != CARDS &&
+ comphand[i] > comphand[max])
+ max = i;
+ return(max);
+ }
+ if (nrandom(1024) == 0723) {
+ for (i = 0; i < RANKS; ++i)
+ if (userhand[i] && comphand[i])
+ return(i);
+ }
+ for (;;) {
+ for (i = 0; i < RANKS; ++i)
+ if (comphand[i] && comphand[i] != CARDS &&
+ !asked[i])
+ return(i);
+ for (i = 0; i < RANKS; ++i)
+ asked[i] = 0;
+ }
+ /* NOTREACHED */
+}
+
+drawcard(player, hand)
+ int player;
+ int *hand;
+{
+ int card;
+
+ while (deck[card = nrandom(RANKS)] == 0);
+ ++hand[card];
+ --deck[card];
+ if (player == USER || hand[card] == CARDS) {
+ printplayer(player);
+ (void)printf("drew %s", cards[card]);
+ if (hand[card] == CARDS) {
+ (void)printf(" and made a book of %s's!\n",
+ cards[card]);
+ chkwinner(player, hand);
+ } else
+ (void)printf(".\n");
+ }
+ return(card);
+}
+
+gofish(askedfor, player, hand)
+ int askedfor, player;
+ int *hand;
+{
+ printplayer(OTHER(player));
+ (void)printf("say \"GO FISH!\"\n");
+ if (askedfor == drawcard(player, hand)) {
+ printplayer(player);
+ (void)printf("drew the guess!\n");
+ printplayer(player);
+ (void)printf("get to ask again!\n");
+ return(1);
+ }
+ return(0);
+}
+
+goodmove(player, move, hand, opphand)
+ int player, move;
+ int *hand, *opphand;
+{
+ printplayer(OTHER(player));
+ (void)printf("have %d %s%s.\n",
+ opphand[move], cards[move], opphand[move] == 1 ? "": "'s");
+
+ hand[move] += opphand[move];
+ opphand[move] = 0;
+
+ if (hand[move] == CARDS) {
+ printplayer(player);
+ (void)printf("made a book of %s's!\n", cards[move]);
+ chkwinner(player, hand);
+ }
+
+ chkwinner(OTHER(player), opphand);
+
+ printplayer(player);
+ (void)printf("get another guess!\n");
+}
+
+chkwinner(player, hand)
+ int player;
+ register int *hand;
+{
+ register int cb, i, ub;
+
+ for (i = 0; i < RANKS; ++i)
+ if (hand[i] > 0 && hand[i] < CARDS)
+ return;
+ printplayer(player);
+ (void)printf("don't have any more cards!\n");
+ (void)printf("My books:");
+ cb = countbooks(comphand);
+ (void)printf("Your books:");
+ ub = countbooks(userhand);
+ (void)printf("\nI have %d, you have %d.\n", cb, ub);
+ if (ub > cb) {
+ (void)printf("\nYou win!!!\n");
+ if (nrandom(1024) == 0723)
+ (void)printf("Cheater, cheater, pumpkin eater!\n");
+ } else if (cb > ub) {
+ (void)printf("\nI win!!!\n");
+ if (nrandom(1024) == 0723)
+ (void)printf("Hah! Stupid peasant!\n");
+ } else
+ (void)printf("\nTie!\n");
+ exit(0);
+}
+
+printplayer(player)
+ int player;
+{
+ switch (player) {
+ case COMPUTER:
+ (void)printf("I ");
+ break;
+ case USER:
+ (void)printf("You ");
+ break;
+ }
+}
+
+printhand(hand)
+ int *hand;
+{
+ register int book, i, j;
+
+ for (book = i = 0; i < RANKS; i++)
+ if (hand[i] < CARDS)
+ for (j = hand[i]; --j >= 0;)
+ PRC(i);
+ else
+ ++book;
+ if (book) {
+ (void)printf(" + Book%s of", book > 1 ? "s" : "");
+ for (i = 0; i < RANKS; i++)
+ if (hand[i] == CARDS)
+ PRC(i);
+ }
+ (void)putchar('\n');
+}
+
+countcards(hand)
+ register int *hand;
+{
+ register int i, count;
+
+ for (count = i = 0; i < RANKS; i++)
+ count += *hand++;
+ return(count);
+}
+
+countbooks(hand)
+ int *hand;
+{
+ int i, count;
+
+ for (count = i = 0; i < RANKS; i++)
+ if (hand[i] == CARDS) {
+ ++count;
+ PRC(i);
+ }
+ if (!count)
+ (void)printf(" none");
+ (void)putchar('\n');
+ return(count);
+}
+
+init()
+{
+ register int i, rank;
+
+ for (i = 0; i < RANKS; ++i)
+ deck[i] = CARDS;
+ for (i = 0; i < HANDSIZE; ++i) {
+ while (!deck[rank = nrandom(RANKS)]);
+ ++userhand[rank];
+ --deck[rank];
+ }
+ for (i = 0; i < HANDSIZE; ++i) {
+ while (!deck[rank = nrandom(RANKS)]);
+ ++comphand[rank];
+ --deck[rank];
+ }
+}
+
+nrandom(n)
+ int n;
+{
+ long random();
+
+ return((int)random() % n);
+}
+
+instructions()
+{
+ int input;
+ char buf[1024];
+
+ (void)printf("Would you like instructions (y or n)? ");
+ input = getchar();
+ while (getchar() != '\n');
+ if (input != 'y')
+ return;
+
+ (void)sprintf(buf, "%s %s", _PATH_MORE, _PATH_INSTR);
+ (void)system(buf);
+ (void)printf("Hit return to continue...\n");
+ while ((input = getchar()) != EOF && input != '\n');
+}
+
+usage()
+{
+ (void)fprintf(stderr, "usage: fish [-p]\n");
+ exit(1);
+}
diff --git a/fish/fish.instr b/fish/fish.instr
new file mode 100644
index 00000000..b7e87a0a
--- /dev/null
+++ b/fish/fish.instr
@@ -0,0 +1,29 @@
+This is the traditional children's card game "Go Fish". We each get seven
+cards, and the rest of the deck is kept to be drawn from later. The
+object of the game is to collect "books", or all of the cards of a single
+value. For example, getting four 2's would give you a "book of 2's".
+
+We take turns asking each other for cards, but you can't ask me for a card
+value if you don't have one of them in your hand! If I have any cards of
+the value you ask for, I have to give them to you. As long as I have one
+of the cards you ask for, you get to keep asking. If you ask me for a
+card of which I don't have any, then I'll tell you to "Go Fish!" This
+means that you draw a card from the deck. If you draw the card you asked
+me for, you get to keep asking me for cards. If not, it's my turn and I ask
+you for a card.
+
+Sometimes you get to ask first, sometimes I do. I'll tell you when it's
+your turn to move, I'll draw cards from the deck for you, and I'll tell
+you what you have in your hand. (Don't worry, I don't look at your hand
+when I'm trying to decide what card to ask for, honest!)
+
+Your input can be a card name ("A", "2", "3", "4", "5", "6", "7", "8",
+"9", "10", "J", "Q" or "K") or the letter "p", or "quit". The letter "p"
+makes my game much smarter, and the line "quit" stops the game. Just
+hitting the carriage return key displays how many cards I have in my hand,
+how many are left in the deck, and which books I've gotten.
+
+Normally, the game stops when one of us runs out of cards, and the winner
+is whoever has the most books!
+
+Good luck!
diff --git a/fish/pathnames.h b/fish/pathnames.h
new file mode 100644
index 00000000..bb4af192
--- /dev/null
+++ b/fish/pathnames.h
@@ -0,0 +1,37 @@
+/*-
+ * Copyright (c) 1990 The Regents of the University of California.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the University of
+ * California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * @(#)pathnames.h 5.1 (Berkeley) 1/18/91
+ */
+
+#define _PATH_INSTR "/usr/share/games/fish.instr"
+#define _PATH_MORE "/usr/bin/more"