games@tekred.TEK.COM (05/21/88)
Submitted by: ihnp4!odyssey!gls (g.l.sicherman) Comp.sources.games: Volume 4, Issue 13 Archive-name: nobs2 [This is an update of a previously posted nobs game (v04i002). -br] #! /bin/sh # This is a shell archive. Remove anything before this line, then unpack # it by saving it into a file and typing "sh file". To overwrite existing # files, type "sh file -c". You can also feed this as standard input via # unshar, or by typing "sh <file", e.g.. If this archive is complete, you # will see the following message at the end: # "End of archive 1 (of 1)." # Contents: README MANIFEST Makefile deal.c defs.h gamescore.c globs.c # globs.h human.c logaux.c logglobs.c logglobs.h nobs.6 nobs.c # pegs.c play.c playscore.c progaux.c program.c show.c shuf.c # version.c wglobs.c window.c window.h # Wrapped by billr@saab on Fri May 20 14:55:12 1988 PATH=/bin:/usr/bin:/usr/ucb ; export PATH if test -f README -a "${1}" != "-c" ; then echo shar: Will not over-write existing file \"README\" else echo shar: Extracting \"README\" \(1088 characters\) sed "s/^X//" >README <<'END_OF_README' X This is C version 1.1 of the Colonel's Cribbage XProgram. (It originally ran in FORTRAN IV on a CDC, Xback in the 70's.) Cribbage is a card game invented Xby Sir John Suckling (1609-1642), and if you don't know Xthe rules, this program will either delight you or Xgive you a headache, depending on your temperament. X X Changes from version 1.0: X X1. Add -h option. X2. Refine discard algorithm to agree with the original. X3. Fix and tweak screen interface bugs. X4. Fix bug in scoring pairs of aces. X5. Add O.S. and related configuration options to Makefile. X X All configurables are in the Makefile. Besides the XOS dependencies, there are two installation options: X X1. Suppress the -h (hint) command-line option. X2. Use 'g' instead of carriage-return when discarding. X XIf you run under Xenix, you will probably need option 2. XThis release works under Ultrix; the previous release did Xnot. X X As before, feed back to ihnp4!odyssey!gls. Bug reports Xare welcome. Suggestions for enhancements may be welcome, Xbut bells and whistles would be out of place. X XRed Hill Road XApril 9, 1988 END_OF_README if test 1088 -ne `wc -c <README`; then echo shar: \"README\" unpacked with wrong size! fi # end of overwriting check fi if test -f MANIFEST -a "${1}" != "-c" ; then echo shar: Will not over-write existing file \"MANIFEST\" else echo shar: Extracting \"MANIFEST\" \(864 characters\) sed "s/^X//" >MANIFEST <<'END_OF_MANIFEST' X File Name Archive # Description X----------------------------------------------------------- X MANIFEST 1 This shipping list X Makefile 1 X README 1 X deal.c 1 X defs.h 1 X gamescore.c 1 X globs.c 1 X globs.h 1 X human.c 1 X logaux.c 1 X logglobs.c 1 X logglobs.h 1 X nobs.6 1 X nobs.c 1 X pegs.c 1 X play.c 1 X playscore.c 1 X progaux.c 1 X program.c 1 X show.c 1 X shuf.c 1 X version.c 1 X wglobs.c 1 X window.c 1 X window.h 1 END_OF_MANIFEST if test 864 -ne `wc -c <MANIFEST`; then echo shar: \"MANIFEST\" unpacked with wrong size! fi # end of overwriting check fi if test -f Makefile -a "${1}" != "-c" ; then echo shar: Will not over-write existing file \"Makefile\" else echo shar: Extracting \"Makefile\" \(1757 characters\) sed "s/^X//" >Makefile <<'END_OF_Makefile' X# Makefile for nobs. X# G. L. Sicherman (ihnp4!odyssey!gls). March 1988. April 1988. X# BSD fixes by saab!billr. X# Xenix fixes by 1solaria!gordon. X#------- X# CONFIGURABLE PARAMETERS: X X# Define destinations for executable and manpage: XBINDEST=$$HOME/bin/nobs XMANDEST=$$HOME/man/nobs.6 X X# Define BSD for Berkeley, Sun, Xenix, etc. X# BSDFLAG= -DBSD XBSDFLAG= X X# Define FLOAT for systems that need a floating-point X# interpreter linked in. (3b5, Unix(TM) PC (?), etc.) X# FLOAT= -f XFLOAT= X X# If BSD or Xenix, you need -ltermcap. X# If Xenix, you need -lx. X# LIB= -lcurses -ltermcap -lx XLIB= -lcurses X X# If Xenix, you need -Mm and -F 2000. X# XFLGS= -Mm -F 2000 XXFLGS= X X# Define NOHINT to disable the -h option. X# NOHINTFLAG= -DNOHINT XNOHINTFLAG= X X# Define GDISC to discard with 'g' instead of CR. X# GDISCFLAG= -DGDISC XGDISCFLAG= X X# End of configurable parameters. Good luck! X XCFLAGS= -O $(BSDFLAG) $(FLOAT) $(XFLGS) $(GDISCFLAG) $(NOHINTFLAG) X XOBJS = nobs.o logglobs.o window.o gamescore.o deal.o shuf.o play.o human.o \ X pegs.o program.o playscore.o show.o progaux.o logaux.o wglobs.o globs.o \ X version.o X XSHARS = nobs.c logglobs.c window.c gamescore.c deal.c shuf.c play.c human.c \ X pegs.c program.c playscore.c show.c progaux.c logaux.c wglobs.c \ X globs.c version.c defs.h globs.h logglobs.h window.h nobs.6 Makefile README X Xall: nobs Xnobs: $(OBJS) X cc $(CFLAGS) -o nobs $(OBJS) $(LIB) X$(OBJS): defs.h globs.h Xlog.o progaux.o program.o: logglobs.h Xplay.o program.o human.o gamescore.o pegs.o window.o show.o: window.h X Xinstall: nobs nobs.6 X rm -f $(BINDEST) $(MANDEST) X cp nobs $(BINDEST) X echo ".ds nh $(NOHINTFLAG)" > $(MANDEST) X cat nobs.6 >> $(MANDEST) X Xshar: nobs.shar Xnobs.shar: $(SHARS) X shar $(SHARS) > $@ X Xclean: X rm -f nobs *.o nobs.shar END_OF_Makefile if test 1757 -ne `wc -c <Makefile`; then echo shar: \"Makefile\" unpacked with wrong size! fi # end of overwriting check fi if test -f deal.c -a "${1}" != "-c" ; then echo shar: Will not over-write existing file \"deal.c\" else echo shar: Extracting \"deal.c\" \(218 characters\) sed "s/^X//" >deal.c <<'END_OF_deal.c' X#include "defs.h" X#include "globs.h" X Xdeal() X{ X int i; X CARD *packp; X shuf(); X packp = pack+39; /* Only the last 13 cards */ X for (i=0; i<6; i++) { X hand[0][i] = *packp++; X hand[1][i] = *packp++; X } X cut = *packp; X} END_OF_deal.c if test 218 -ne `wc -c <deal.c`; then echo shar: \"deal.c\" unpacked with wrong size! fi # end of overwriting check fi if test -f defs.h -a "${1}" != "-c" ; then echo shar: Will not over-write existing file \"defs.h\" else echo shar: Extracting \"defs.h\" \(726 characters\) sed "s/^X//" >defs.h <<'END_OF_defs.h' X/* X * defs.h - definitions. X */ X X/* Suit has 3 bits, so we can use the green suit for estimating the cut. X */ X#define RANK(x) ((x)&0017) X#define SUIT(x) (((x)&0160)>>4) X#define SAMERANK(x,y) (!((x^y)&0017)) X#define SAMESUIT(x,y) (!((x^y)&0160)) X#define MAKECARD(r,s) ((r)|((s)<<4)) X Xtypedef char PLAYER; X X#define PROGRAM 0 X#define HUMAN 1 X X#define SCOREUP(a,b) {if (scoreup((a),(b))) {gameover++; return;}} X#define CABBAGE 4 X#define SPADE 3 X#define HEART 2 X#define DIAMOND 1 X#define CLUB 0 X X#define KING 13 X#define QUEEN 12 X#define KNAVE 11 X#define TEN 10 X#define NINE 9 X#define EIGHT 8 X#define SEVEN 7 X#define SIX 6 X#define FIVE 5 X#define FOUR 4 X#define TREY 3 X#define DEUCE 2 X#define ACE 1 X Xtypedef char CARD; X Xvoid shuf(); END_OF_defs.h if test 726 -ne `wc -c <defs.h`; then echo shar: \"defs.h\" unpacked with wrong size! fi # end of overwriting check fi if test -f gamescore.c -a "${1}" != "-c" ; then echo shar: Will not over-write existing file \"gamescore.c\" else echo shar: Extracting \"gamescore.c\" \(3455 characters\) sed "s/^X//" >gamescore.c <<'END_OF_gamescore.c' X#include "defs.h" X#include "globs.h" X#include "window.h" X Xgamescore() X{ X sleep(2); X handscore(!dealer); X if (!gameover) { X sleep(2); X handscore(dealer); X } X if (!gameover) { X sleep(1); X werase(Pscore); X werase(Hscore); X exposecrib(); X sleep(2); X cribscore(); X } X} X Xhandscore(who) Xint who; X{ X int i; X CARD dummy[5]; X for (i=0; i<4; i++) dummy[i]=hand[who][i]; X dummy[4]=cut; X evalhand(dummy, 0, who); X} X Xcribscore() X{ X int i; X CARD dummy[5]; X for (i=0; i<4; i++) dummy[i]=crib[i]; X dummy[4]=cut; X evalhand(dummy, 1, dealer); X} X Xint Xevalhand(ehand, iscrib, whoscore) XCARD ehand[]; Xint iscrib; Xint whoscore; /* -1 means silent */ X{ X/* X * If iscrib is on, don't allow four-flushes. X */ X int i, j, mask, bit, hmask, sum, hcount; X char *runname; X int runval; X short rep[15]; /* Extra zeroes make it easier */ X WINDOW *Win; X if (whoscore==1) Win=Hscore; X else if (whoscore==0) Win=Pscore; X if (iscrib && whoscore>=0) { X wprintw(Win, "%s Crib:\n", whoscore? "Your": "My"); X wrefresh(Win); X sleep(1); X } X hcount=0; X for (mask=1; mask<32; mask++) { X hmask=mask; X sum=0; X for (bit=0; bit<5; bit++) { X if (1&hmask) X sum+=rankvalue[RANK(ehand[bit])]; X hmask >>= 1; X } X if (sum==15) { X hcount += 2; X if (whoscore>=0) { X wprintw(Win, "Fifteen-%d\n", hcount); X wrefresh(Win); X sleep(1); X } X } X/* X * Need we add any cards? X */ X if (sum >= 15) mask |= mask-1; X } X/* X * Count the ranks. X */ X for (i=0; i<15; i++) rep[i]=0; X for (i=0; i<5; i++) rep[RANK(ehand[i])]+=1; X/* X * Look for isolated pairs, etc. X */ X for (i=1; i<14; i++) if (rep[i]>1) { X if (!(rep[i-1] && (rep[i-2] || rep[i+1]) || X rep[i+1] && rep[i+2])) { X hcount += pairvalue[rep[i]]; X if (whoscore>=0) { X wprintw(Win, "and a %s is %d\n", X pairname[rep[i]], hcount); X wrefresh(Win); X sleep(1); X } X } X } X/* X * Look for runs, including multiples. X */ X for (i=1; i<12; i++) if (rep[i]) { X if (!rep[i+2]) { X i+=2; X continue; X } X if (!rep[i+1]) { X i+=1; X continue; X } X/* X * We have a run! X */ X if (rep[i+3]) { X if (rep[i+4]) { X runname="Sequence of Five\n"; X runval=5; X } X else { X runname="Sequence of Four\n"; X runval=4; X for (j=i; j<i+4; j++) if (rep[j]>1) { X runname="Double Sequence\n of Four"; X runval=10; X break; X } X } X } X else { X for (sum=0, j=i; j<i+3; j++) { X if (rep[j]==3) { X runname="Triple Sequence"; X runval=15; X goto scorerun; X } X sum += rep[j]-1; X } X runname=drunname[sum]; X runval=drunval[sum]; X } Xscorerun: X hcount += runval; X if (whoscore>=0) { X wprintw(Win, "and a %s is %d\n", runname, hcount); X wrefresh(Win); X sleep(1); X } X break; /* You can't have two runs */ X } X/* X * Check for flushes. X */ X for (i=1; i<4; i++) if (!SAMESUIT(ehand[i],ehand[0])) goto endflush; X if (SAMESUIT(ehand[4], ehand[0])) { X hcount += 5; X if (whoscore>=0) { X wprintw(Win, "and a Flush of Five is %d\n", hcount); X wrefresh(Win); X sleep(1); X } X } X else if (!iscrib) { X hcount += 4; X if (whoscore>=0) { X wprintw(Win, "and a Flush is %d\n", hcount); X wrefresh(Win); X sleep(1); X } X } Xendflush: X for (i=0; i<4; i++) X if (RANK(ehand[i])==KNAVE && SAMESUIT(ehand[i], ehand[4])) { X hcount += 1; X if (whoscore>=0) { X wprintw(Win, "and One for His Nobs is %d\n",hcount); X wrefresh(Win); X sleep(1); X } X break; X } X/* X * Final reckoning, if wanted. X */ X if (whoscore>=0) { X sleep(1); X if (hcount) SCOREUP(whoscore, hcount); X } X return hcount; X} END_OF_gamescore.c if test 3455 -ne `wc -c <gamescore.c`; then echo shar: \"gamescore.c\" unpacked with wrong size! fi # end of overwriting check fi if test -f globs.c -a "${1}" != "-c" ; then echo shar: Will not over-write existing file \"globs.c\" else echo shar: Extracting \"globs.c\" \(1014 characters\) sed "s/^X//" >globs.c <<'END_OF_globs.c' X/* X * globs - global variables. X */ X X#include "defs.h" X Xshort count; XCARD crib[6]; XCARD cut; Xint dealer; Xint (*dscfunc[2])(); Xchar gameover; XCARD go[8]; Xshort gocount; XCARD hand[2][6]; Xchar handover; Xshort hflag = 0; Xshort ncrib; Xshort nleft[2]; XCARD pack[52]; Xint packmade = 0; Xshort peg[2][2]; Xchar played[2][4]; XPLAYER playertype[2]; Xchar quitflag; Xshort score[2]; Xshort whosego; Xchar whoseturn; X Xchar *drunname[3] = {"Sequence","Double Sequence", X "Quadruple Sequence"}; Xshort drunval[3] = {3, 8, 16}; Xchar *pairname[5] = {"0","0","Pair","Pair Royal","Double Pair Royal"}; Xshort pairvalue[5] = {0,0,2,6,12}; Xchar *rankname[14] = {"0", "Ace","Deuce","Trey","Four", X "Five","Six","Seven","Eight","Nine","Ten", X "Knave","Queen","King"}; Xchar *rankrdr[14] = {"0", "A", X "2","3","4","5","6","7","8","9","10","J","Q","K"}; Xshort rankvalue[14] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10, 10}; Xchar *suitname[5] = {"Clubs", "Diamonds", "Hearts", "Spades", "Cabbages"}; Xchar *suitrdr[5] = {"c","d","h","s","x"}; END_OF_globs.c if test 1014 -ne `wc -c <globs.c`; then echo shar: \"globs.c\" unpacked with wrong size! fi # end of overwriting check fi if test -f globs.h -a "${1}" != "-c" ; then echo shar: Will not over-write existing file \"globs.h\" else echo shar: Extracting \"globs.h\" \(782 characters\) sed "s/^X//" >globs.h <<'END_OF_globs.h' X/* X * globs.h - global variables. X */ X Xextern short count; Xextern CARD crib[6]; Xextern CARD cut; Xextern int dealer; Xextern char *drunname[]; Xextern short drunval[]; Xextern int (*dscfunc[])(); Xextern char gameover; Xextern CARD go[8]; Xextern short gocount; Xextern CARD hand[2][6]; Xextern char handover; Xextern short hflag; Xextern short ncrib; Xextern short nleft[2]; Xextern CARD pack[52]; Xextern int packmade; Xextern char *pairname[]; Xextern short pairvalue[]; Xextern short peg[2][2]; Xextern char played[2][4]; Xextern PLAYER playertype[2]; Xextern char quitflag; Xextern char *rankname[14]; Xextern char *rankrdr[14]; Xextern short rankvalue[14]; Xextern short score[2]; Xextern char *suitname[5]; Xextern char *suitrdr[5]; Xextern char version[]; Xextern short whosego; Xextern char whoseturn; END_OF_globs.h if test 782 -ne `wc -c <globs.h`; then echo shar: \"globs.h\" unpacked with wrong size! fi # end of overwriting check fi if test -f human.c -a "${1}" != "-c" ; then echo shar: Will not over-write existing file \"human.c\" else echo shar: Extracting \"human.c\" \(3095 characters\) sed "s/^X//" >human.c <<'END_OF_human.c' X#include "defs.h" X#include "globs.h" X#include "window.h" X X#ifdef BSD X#include <ctype.h> X#endif X Xstatic char selected[6]; Xstatic int nselected; X Xhumandiscard(hand, mydeal) XCARD hand[]; Xint mydeal; X{ X int j, j1, j2; X char k; X for (j=0; j<6; j++) mvwaddch(Select, 0, 5*j+2, 'a'+j); X wrefresh(Select); X mvwprintw( X Prompt, 0, 0, mydeal? "It is your crib.\n": "It is my crib.\n"); X#ifdef GDISC X mvwprintw(Prompt, 1, 0, "Select 2 cards. Type \"g\" to discard.\n"); X#else X mvwprintw(Prompt, 1, 0, "Select 2 cards. Type RETURN to discard.\n"); X#endif X if (hflag) { X mvwprintw(Hscore, 0, 0, "Type \"h\" for hint\n"); X wrefresh(Hscore); X } X for (j=0; j<6; j++) selected[j]=0; X nselected = 0; X for (;;) { X mvwaddch(Prompt, 1, 41, '\n'); X wmove(Prompt, 1, 41); X wrefresh(Prompt); X k = wgetch(Prompt); X k = tolower(k); X#ifdef GDISC X if ('g'==k) { X#else X if ('\n'==k || '\r'==k) { X#endif X if (nselected == 2) break; X beep(); X continue; X } X if (hflag && k == 'h') { X hint(hand, mydeal); X continue; X } X if (k > 'f' || k < 'a') { X beep(); X continue; X } X nselected -= selected[k-'a']; X nselected += (selected[k-'a'] ^= 1); X mvwaddch(Humanhand, 2, 5*(k-'a')+3, X selected[k-'a']? '*': ' '); X wrefresh(Humanhand); X } X if (hflag) { X werase(Hscore); X wrefresh(Hscore); X } X werase(Select); X werase(Prompt); X wrefresh(Select); X wrefresh(Prompt); X for (j=0; j<6; j++) if (selected[j]) { X j1 = j2; /* and you know Lint won't like this! */ X j2 = j; X } X makediscard(hand, j1, j2); X} X Xhint(ihand, mydeal) X{ X int a, b, k; X bestdis(ihand, mydeal, &a, &b); X for (k=0; k<6; k++) { X selected[k] = k==a || k==b; X mvwaddch(Humanhand, 2, 5*k+3, selected[k]? '*': ' '); X } X nselected = 2; X werase(Hscore); X wrefresh(Humanhand); X wrefresh(Hscore); X} X Xhumanplay() X{ X char k; X int sco; X if (whosego == whoseturn) { X/* X * It is my go. Can I play? X */ X if (goodgo(whoseturn)) { X SCOREUP(whoseturn, 1); X resetgo(); X handover = !nleft[0] && !nleft[1]; X return; X } X else mvwprintw(Prompt, 1, 0, "Select a card.\n"); X } X else if (!nleft[whoseturn]) { X handover = !nleft[0] && !nleft[1]; X if (handover) SCOREUP(whoseturn, 1); X return; X } X else if (whosego == !whoseturn) return; X else mvwprintw(Prompt, 1, 0, "Select a card, or type \"g\" for go."); X for (;;) { X mvwaddch(Prompt, 1, 41, '\n'); X wrefresh(Prompt); X k = wgetch(Prompt); X k = tolower(k); X if (k == 'g') { X if (goodgo(whoseturn)) { X whosego = !whoseturn; X return; X } X else beep(); X } X else if (k < 'a' || k > 'd') beep(); X else if (goodplay(whoseturn, k-'a')) break; X else beep(); X } X werase(Prompt); X played[whoseturn][k-'a'] = 1; X count += rankvalue[RANK(hand[whoseturn][k-'a'])]; X go[gocount++] = hand[whoseturn][k-'a']; X nleft[whoseturn] -= 1; X sco = playscore(); X showhplay(k-'a', sco); X if (sco) SCOREUP(whoseturn, sco); X handover = !nleft[0] && !nleft[1]; X if (count==31) resetgo(); X else if (handover) { X mvwprintw(Prompt, 0, 0, "That's a Go\n"); X SCOREUP(whoseturn, 1); X } X sleep(1); X} X X/* X * This is pre-defined in Vr2 curses, but I'll just define it anyway. X */ Xbeep() X{ X putchar('\007'); X} END_OF_human.c if test 3095 -ne `wc -c <human.c`; then echo shar: \"human.c\" unpacked with wrong size! fi # end of overwriting check fi if test -f logaux.c -a "${1}" != "-c" ; then echo shar: Will not over-write existing file \"logaux.c\" else echo shar: Extracting \"logaux.c\" \(173 characters\) sed "s/^X//" >logaux.c <<'END_OF_logaux.c' X#include "defs.h" X Xint Xcindex(a, b) XCARD a, b; X{ X register t, u; X t = RANK(a); X u = RANK(b); X if (t < u) { X t = RANK(b); X u = RANK(a); X } X return u - 1 + (t * (t-1))/2; X} END_OF_logaux.c if test 173 -ne `wc -c <logaux.c`; then echo shar: \"logaux.c\" unpacked with wrong size! fi # end of overwriting check fi if test -f logglobs.c -a "${1}" != "-c" ; then echo shar: Will not over-write existing file \"logglobs.c\" else echo shar: Extracting \"logglobs.c\" \(1136 characters\) sed "s/^X//" >logglobs.c <<'END_OF_logglobs.c' Xfloat distable[2][91] = { X6.290,5.028,6.490,5.092,7.256,6.744,5.776,5.297,5.917,6.699,6.083,6.181, X6.734,7.222,9.463,4.993,5.068,4.909,5.277,7.528,7.152,5.177,5.145,5.070, X4.969,7.061,6.503,7.451,4.954,4.970,4.963,4.922,6.283,5.951,8.103,6.808, X4.725,4.810,4.826,4.745,6.170,6.434,5.402,5.959,6.536,4.504,4.610,4.586, X4.485,7.476,4.332,4.465,5.043,5.568,6.114,4.786,4.893,4.869,4.767,7.758, X4.615,4.826,4.678,5.140,5.478,6.666,4.360,4.467,4.443,4.341,7.332,4.189, X4.400,4.310,4.089,4.564,5.359,5.824,4.211,4.318,4.294,4.192,7.184,4.040, X4.251,4.162,4.019,3.763,4.650,4.290,5.526,5.580,4.339,5.966,4.585,7.183, X6.102,5.596,4.545,4.892,5.808,5.562,5.583,6.039,6.501,8.909,3.868,3.876, X3.839,3.818,6.538,5.846,3.784,3.856,3.678,3.797,5.986,4.795,5.945,3.730, X3.644,3.879,3.830,5.490,4.448,6.535,5.380,3.453,3.780,3.828,3.780,5.477, X5.234,3.940,4.531,5.259,3.462,3.602,3.650,3.601,6.725,3.089,3.069,3.742, X4.130,4.878,3.746,3.886,3.934,3.885,7.009,3.372,3.406,3.348,3.933,4.530, X5.435,3.534,3.673,3.722,3.672,6.797,3.160,3.194,3.194,3.086,3.336,4.858, X5.005,3.531,3.671,3.719,3.670,6.794,3.158,3.192,3.191,3.126,2.889,4.031, X3.469,5.003 X}; END_OF_logglobs.c if test 1136 -ne `wc -c <logglobs.c`; then echo shar: \"logglobs.c\" unpacked with wrong size! fi # end of overwriting check fi if test -f logglobs.h -a "${1}" != "-c" ; then echo shar: Will not over-write existing file \"logglobs.h\" else echo shar: Extracting \"logglobs.h\" \(30 characters\) sed "s/^X//" >logglobs.h <<'END_OF_logglobs.h' Xextern float distable[2][91]; END_OF_logglobs.h if test 30 -ne `wc -c <logglobs.h`; then echo shar: \"logglobs.h\" unpacked with wrong size! fi # end of overwriting check fi if test -f nobs.6 -a "${1}" != "-c" ; then echo shar: Will not over-write existing file \"nobs.6\" else echo shar: Extracting \"nobs.6\" \(742 characters\) sed "s/^X//" >nobs.6 <<'END_OF_nobs.6' X.de QU X.ie t ``\\$1''\\$2 X.el "\\$1"\\$2 X.. X.TH NOBS 6 "23 March 1988" "" "Local UNIX Programmer's Manual" X.SH NAME Xnobs \- cribbage game X.SH SYNOPSIS X.B nobs X[ X.if '\*(nh'' \{\ X.B \-h X] [\} X.B \-v X] X.SH DESCRIPTION XWith no arguments, X.I nobs Xplays screen-oriented games of cribbage with you. XYou select cards by typing a letter from X.QU a Xto X.QU f . XThe program keeps score. XGame is 121 points. X.PP X.if '\*(nh'' \{\ XIf you specify X.BR \-h , X.I nobs Xwill offer you hints on discarding.\} XIf you specify X.BR \-v , X.I nobs Xprints the version number and exits. X.SH WARNING XThis program has been around a long time, having started out Xin FORTRAN on a CDC 6400. XIt is a dangerous opponent. X.SH AUTHOR XG. L. Sicherman (ihnp4\^!\^odyssey\^!\^gls) END_OF_nobs.6 if test 742 -ne `wc -c <nobs.6`; then echo shar: \"nobs.6\" unpacked with wrong size! fi # end of overwriting check fi if test -f nobs.c -a "${1}" != "-c" ; then echo shar: Will not over-write existing file \"nobs.c\" else echo shar: Extracting \"nobs.c\" \(801 characters\) sed "s/^X//" >nobs.c <<'END_OF_nobs.c' X/* X * nobs - play cribbage. X */ X X#include <stdio.h> X#include "defs.h" X#include "globs.h" X Xextern int programdiscard(); Xextern int humandiscard(); X Xusage() X{ X#ifdef NOHINT X fprintf(stderr,"usage: nobs [-v]\n"); X#else X fprintf(stderr,"usage: nobs [-h] [-v]\n"); X#endif X exit(-1); X} X Xmain(argc,argv) Xint argc; Xchar **argv; X{ X while (--argc) { X if ('-'==**++argv) switch(*++*argv) { X case 'v': X printf("Nobs Version %s\n", version); X exit(0); X#ifndef NOHINT X case 'h': X hflag = 1; X break; X#endif X default: X usage(); X } X else break; X } X if (argc) usage(); X initrand(); X initwins(); X dealer = randint(2); X playertype[0] = PROGRAM; X playertype[1] = HUMAN; X dscfunc[PROGRAM] = programdiscard; X dscfunc[HUMAN] = humandiscard; X for (quitflag=0; !quitflag; ) playgame(); X termwins(); X exit(0); X} END_OF_nobs.c if test 801 -ne `wc -c <nobs.c`; then echo shar: \"nobs.c\" unpacked with wrong size! fi # end of overwriting check fi if test -f pegs.c -a "${1}" != "-c" ; then echo shar: Will not over-write existing file \"pegs.c\" else echo shar: Extracting \"pegs.c\" \(1181 characters\) sed "s/^X//" >pegs.c <<'END_OF_pegs.c' X#include "defs.h" X#include "globs.h" X#include "window.h" X Xint Xpegcol(n) Xint n; X{ X if (n==0) return 0; X else if (n<31) return n+(n+4)/5; X else return 74-n-(n+4)/5; X} X Xresetpegs() X{ X int i, j; X for (i=0; i<2; i++) for (j=0; j<2; j++) { X if (peg[i][j] != 0) { X mvwaddch(Board, 2*i, pegcol(peg[i][j]), ':'); X peg[i][j] = 0; X } X } X for (i=0; i<2; i++) mvwaddch(Board, 2*i, 0, '|'); X wrefresh(Board); X} X Xsetpegs(who) XPLAYER who; X{ X/* X * The first peg in the array is the forward peg. X */ X X/* Pick up the hindward peg. */ X if (peg[who][0] == 0) mvwaddch(Board, 2*who, 0, who? '!': ';'); X else if (peg[who][1] + peg[who][0] == 61) X mvwaddch(Board, 2*who, pegcol(peg[who][1]), X (peg[who][1]>30)==who? ';': '!'); X else mvwaddch(Board, 2*who, pegcol(peg[who][1]), ':'); X/* X * Put it down again. X */ X peg[who][1] = peg[who][0]; X if (score[who] > 120) peg[who][0] = 0; X else peg[who][0] = 1+(score[who]-1)%60; X if (peg[who][0]==0) mvwaddch(Board, 2*who, 0, who? '!': ';'); X else if (peg[who][0] + peg[who][1] == 61) X mvwaddch(Board, 2*who, pegcol(peg[who][0]), '|'); X else mvwaddch(Board, 2*who, pegcol(peg[who][0]), X (peg[who][0]>30)==who? '!': ';'); X wrefresh(Board); X sleep(1); X} END_OF_pegs.c if test 1181 -ne `wc -c <pegs.c`; then echo shar: \"pegs.c\" unpacked with wrong size! fi # end of overwriting check fi if test -f play.c -a "${1}" != "-c" ; then echo shar: Will not over-write existing file \"play.c\" else echo shar: Extracting \"play.c\" \(1823 characters\) sed "s/^X//" >play.c <<'END_OF_play.c' X#include "defs.h" X#include "globs.h" X#include "window.h" X Xstatic taketurn(); X Xplaygame() X{ X char k; X score[0]=score[1]=0; X resetpegs(); X for (gameover=0; !gameover; ) playhand(); X mvwprintw(Prompt, 0, 0, score[0]>120? "I win.\n": "You win.\n"); X wrefresh(Prompt); X sleep(2); X mvwprintw(Prompt, 1, 0, "Another game?\n"); X wmove(Prompt, 1, 41); X wrefresh(Prompt); X k = wgetch(Prompt); X if (k != 'y' && k != 'Y') quitflag = 1; X} X Xplayhand() X{ X int i, j; X dealer = !dealer; X deal(); X werase(Pscore); X werase(Hscore); X showhand(); X ncrib=0; X for (i=0; i<2; i++) { X (*dscfunc[playertype[i]])(hand[i], i==dealer); X } X showfour(); X showcut(); X if (RANK(cut)==KNAVE) { X mvwprintw(Prompt, 1, 0, "Two for His Heels\n"); X wrefresh(Prompt); X sleep(2); X SCOREUP(dealer, 2); X sleep(1); X } X whoseturn = dealer; /* to be reversed */ X handover = 0; X nleft[0]=nleft[1]=4; X resetgo(); X for (i=0; i<2; i++) for (j=0; j<4; j++) played[i][j]=0; X while (!gameover && !handover) taketurn(); X if (gameover) return; X gamescore(); X} X Xstatic Xtaketurn() X{ X whoseturn = !whoseturn; X switch (playertype[whoseturn]) { X case HUMAN: X humanplay(); X break; X case PROGRAM: X programplay(); X break; X } X} X Xint Xgoodgo(who) Xint who; X{ X int i; X for (i=0; i<4; i++) if (goodplay(who, i)) return 0; X return 1; X} X Xint Xgoodplay(who, which) Xint who, which; X{ X return !played[who][which] && X rankvalue[RANK(hand[who][which])] + count <= 31; X} X Xresetgo() { X count=gocount=0; X whosego = -1; X mvwprintw(Prompt, 0, 0, "0.\n"); X wrefresh(Prompt); X} X X/* X * Returns nonzero if wins. X */ Xscoreup(who, n) Xint who, n; X{ X score[who] += n; X setpegs(who); X return (score[who] > 120); X} X X/* X * assumes a<b. X */ X Xmakediscard(hand, a, b) Xint a, b; XCARD hand[]; X{ X crib[ncrib++] = hand[a]; X crib[ncrib++] = hand[b]; X hand[b]=hand[5]; X hand[a]=hand[4]; /* In this order only. */ X} END_OF_play.c if test 1823 -ne `wc -c <play.c`; then echo shar: \"play.c\" unpacked with wrong size! fi # end of overwriting check fi if test -f playscore.c -a "${1}" != "-c" ; then echo shar: Will not over-write existing file \"playscore.c\" else echo shar: Extracting \"playscore.c\" \(968 characters\) sed "s/^X//" >playscore.c <<'END_OF_playscore.c' X#include "defs.h" X#include "globs.h" X Xint Xplayscore() X{ X int hold, low; X hold = 0; X if (count == 15 || count == 31) hold=2; X if (gocount > 1 && RANK(go[gocount-2])==RANK(go[gocount-1])) { X hold += 2; X if (gocount > 2 && RANK(go[gocount-3])==RANK(go[gocount-2])) { X hold += 4; X if (gocount > 3 && RANK(go[gocount-4])== X RANK(go[gocount-3])) hold += 6; X } X return hold; /* No need to check for runs */ X } X if (gocount < 3) return hold; X for (low=0; low<gocount-2; low++) X if (isplrun(low, gocount-low)) return hold+gocount-low; X return hold; X} X Xint Xisplrun(start, num) Xint start, num; X{ X int highest, lowest, i; X register mask; X lowest = KING; X highest = ACE; X for (i=start; i<start+num; i++) { X if (RANK(go[i])>highest) highest=RANK(go[i]); X if (RANK(go[i])<lowest) lowest=RANK(go[i]); X } X if (highest != lowest+num-1) return 0; X/* X * Use a mask. X */ X mask = (1<<num)-1; X for (i=start; i<start+num; i++) mask &= ~(1<<(RANK(go[i])-lowest)); X return !mask; X} END_OF_playscore.c if test 968 -ne `wc -c <playscore.c`; then echo shar: \"playscore.c\" unpacked with wrong size! fi # end of overwriting check fi if test -f progaux.c -a "${1}" != "-c" ; then echo shar: Will not over-write existing file \"progaux.c\" else echo shar: Extracting \"progaux.c\" \(1873 characters\) sed "s/^X//" >progaux.c <<'END_OF_progaux.c' X/* X * nobs - auxiliary program strategy functions. X * G. L. Sicherman. X */ X X#include "defs.h" X#include "globs.h" X#include "logglobs.h" X Xfloat evaldiscard(); X Xbestdis(hand, mydeal, aw, bw) XCARD hand[]; Xint mydeal; Xint *aw, *bw; X{ X float best, new; X int a, b; X best = -999.0; X for (a=0; a<5; a++) for (b=a+1; b<6; b++) { X new = evaldiscard(hand, mydeal, a, b); X if (new>best) { X best=new; X *aw=a; X *bw=b; X } X } X} X Xfloat Xevaldiscard(hand, mydeal, j1, j2) XCARD hand[6]; Xint mydeal, j1, j2; X{ X float retval, disval; X CARD holdhand[5], *hp; X int k, m, v; X int cutrank; X/* X * Evaluate the remaining hand. X */ X retval = 0.0; X hp=holdhand; X for (k=0; k<6; k++) if (k!=j1 && k!=j2) *hp++ = hand[k]; X for (cutrank=ACE; cutrank<=KING; cutrank++) { X holdhand[4] = MAKECARD(cutrank, CABBAGE); X v = evalhand(holdhand, 1, -1); X retval += 4 * v; X for (m=0; m<6; m++) X if (SAMERANK(hand[m], holdhand[4])) retval -= v; X } X retval /= 46; X disval = distable[mydeal][cindex(hand[j1],hand[j2])]; X if (!mydeal) disval= -disval; X retval += disval; X return retval; X} X X/* X * This isn't supposed to be a world-class strategy. X */ Xint Xevalplay(c) XCARD c; X{ X int v; X v = rankvalue[RANK(c)]; X/* X * Are we setting human up for a 15? X */ X if (count+v == 5) return -11; X/* X * Are we setting human up for a 31? X */ X if (count+v == 21) return -9; X if (count+v == 15 || count+v == 31) return 20; X if (gocount && RANK(go[gocount-1])==RANK(c)) { X if (gocount>1 && RANK(go[gocount-2])==RANK(c)) return 30; X if (gocount>3 || randint(5)) return 15; X } X if (gocount > 1 && X isrun(RANK(go[gocount-1]),RANK(go[gocount-2]), RANK(c))) return 25; X/* X * Are we setting human up for a run? X */ X if (gocount && 2==abs(RANK(c)-RANK(go[gocount-1]))) return -10; X if (count+v <= 4) return 10+count+v; X if (count>20) return v; X return 0; X} X Xint Xisrun(a,b,c) Xint a,b,c; X{ X return 4==abs(a-b)+abs(a-c)+abs(b-c); X} END_OF_progaux.c if test 1873 -ne `wc -c <progaux.c`; then echo shar: \"progaux.c\" unpacked with wrong size! fi # end of overwriting check fi if test -f program.c -a "${1}" != "-c" ; then echo shar: Will not over-write existing file \"program.c\" else echo shar: Extracting \"program.c\" \(2213 characters\) sed "s/^X//" >program.c <<'END_OF_program.c' X/* X * The program's strategy. X */ X X#include "defs.h" X#include "globs.h" X#include "logglobs.h" X#include "window.h" X Xfloat evaldiscard(); X Xprogramdiscard(ehand, mydeal) XCARD ehand[]; Xint mydeal; X{ X int aw, bw; X bestdis(ehand, mydeal, &aw, &bw); X makediscard(ehand, aw, bw); X mvwaddch(Programhand, 0, 5*4, '\n'); X mvwprintw(Crib, 0, 0, "XXX XXX\n"); X wrefresh(Programhand); X wrefresh(Crib); X} X Xprogramplay() X{ X int t, u, v; X int bestplay, bestval; X/* X * Case I: It's the human's go. Sit tight. X */ X if (whosego == !whoseturn) return; X/* X * Case II: It's my go, and I can't play. Just score the X * go and reset. X */ X if (whosego==whoseturn && goodgo(whoseturn)) { X/* X * If I have cards and human does not, explain to human. X */ X if (nleft[whoseturn] && !nleft[!whoseturn]) { X mvwprintw(Prompt, 1, 0, "That's a Go\n"); X wrefresh(Prompt); X sleep(1); X } X SCOREUP(whoseturn, 1); X handover = !nleft[0] && !nleft[1]; X if (!handover) resetgo(); X return; X } X/* X * Case III: It's nobody's go yet, and I can't play. X * Human still has cards, or we shouldn't be here. X * Say "go". X */ X if (goodgo(whoseturn)) { X whosego = !whoseturn; X/* X * If I have no cards, there's no need to say "go." X */ X if (nleft[whoseturn]) { X mvwprintw(Prompt, 0, 11, "Go.\n"); X wrefresh(Prompt); X sleep(1); X } X return; X } X/* X * I can play. Pick an appropriate play. X */ X bestval = -999; X for (t=0; t<4; t++) if (goodplay(whoseturn, t)) { X if ((v=evalplay(hand[whoseturn][t])) > bestval) { X bestval=v; X bestplay=t; X } X } X makeprogplay(bestplay); X} X Xmakeprogplay(t) Xint t; X{ X int sco; X nleft[whoseturn] -= 1; X played[whoseturn][t]=1; X count += rankvalue[RANK(hand[whoseturn][t])]; X go[gocount++] = hand[whoseturn][t]; X sco = playscore(); X showpplay(whoseturn, t, sco); X if (sco) SCOREUP(whoseturn, sco); X/* X * Say Go to myself? X */ X if (!nleft[whoseturn]) { /* That was my last card. */ X handover = !nleft[!whoseturn]; X if (handover && count != 31) SCOREUP(whoseturn, 1); X if (!handover && (whosego==whoseturn || count==31)) resetgo(); X return; X } X if (!nleft[!whoseturn]) whosego=whoseturn; /* Human out of cards */ X if (whosego != whoseturn) { X if (count==31) resetgo(); X return; /* Give human a chance */ X } X} END_OF_program.c if test 2213 -ne `wc -c <program.c`; then echo shar: \"program.c\" unpacked with wrong size! fi # end of overwriting check fi if test -f show.c -a "${1}" != "-c" ; then echo shar: Will not over-write existing file \"show.c\" else echo shar: Extracting \"show.c\" \(2076 characters\) sed "s/^X//" >show.c <<'END_OF_show.c' X#include "defs.h" X#include "globs.h" X#include "window.h" X Xchar * Xcardname(c) XCARD c; X{ X static char hold[4]; X sprintf(hold, "%2s%s", rankrdr[RANK(c)], suitrdr[SUIT(c)]); X return hold; X} X Xshowhand() X/* X * If a player is human, it's always player 1. X */ X{ X int i; X for (i=0; i<6; i++) mvwprintw(Programhand, 0, 5*i, "XXX"); X for (i=0; i<6; i++) mvwprintw(Humanhand, 2, 5*i, cardname(hand[1][i])); X mvwprintw(Programhand, 2, 0, "\n"); X mvwprintw(Humanhand, 0, 0, "\n"); X werase(Cut); X werase(Crib); X werase(Pscore); X werase(Hscore); X werase(Select); X wrefresh(Cut); X wrefresh(Crib); X wrefresh(Pscore); X wrefresh(Hscore); X wrefresh(Select); X wrefresh(Programhand); X wrefresh(Humanhand); X} X Xshowfour() X{ X int i; X werase(Humanhand); X for (i=0; i<4; i++) mvwprintw(Humanhand, 2, 5*i, cardname(hand[1][i])); X waddch(Humanhand,'\n'); X for (i=2; i<4; i++) mvwprintw(Crib, 0, 5*i, "XXX "); X for (i=0; i<4; i++) mvwaddch(Select, 0, 5*i+2, 'a'+i); X X wrefresh(Humanhand); X wrefresh(Crib); X wrefresh(Select); X} X Xshowpplay(who, i, scored) Xint who, i, scored; X{ X mvwprintw(Programhand, 0, 5*i, " "); X mvwprintw(Programhand, 2, 5*(3-nleft[who]), cardname(hand[who][i])); X if (scored) mvwprintw(Prompt, 0, 0, "%d for %d.\n", count, scored); X else mvwprintw(Prompt, 0, 0, "%d.\n", count); X wrefresh(Programhand); X wrefresh(Prompt); X sleep(2); X} X Xshowhplay(i, scored) Xint i, scored; X{ X mvwprintw(Humanhand, 2, 5*i, " "); X mvwprintw(Humanhand, 0, 5*(3-nleft[1]), cardname(hand[1][i])); X if (scored) mvwprintw(Prompt, 0, 0, "%d for %d.\n", count, scored); X else mvwprintw(Prompt, 0, 0, "%d.\n", count); X wrefresh(Humanhand); X wrefresh(Prompt); X} X Xshowcut() X{ X mvwprintw(Prompt, 0, 0, playertype[dealer]==HUMAN? "I cut:\n": X "You cut:\n"); X mvwaddch(Prompt, 1, 0, '\n'); X wrefresh(Prompt); X sleep(1); X mvwprintw(Prompt, 1, 0, "the %s of %s\n", X rankname[RANK(cut)], suitname[SUIT(cut)]); X mvwprintw(Cut, 0, 0, cardname(cut)); X wrefresh(Prompt); X wrefresh(Cut); X sleep(1); X} X Xexposecrib() X{ X int i; X for (i=0; i<6; i++) mvwprintw(Crib, 0, 5*i, cardname(crib[i])); X wrefresh(Crib); X sleep(1); X} END_OF_show.c if test 2076 -ne `wc -c <show.c`; then echo shar: \"show.c\" unpacked with wrong size! fi # end of overwriting check fi if test -f shuf.c -a "${1}" != "-c" ; then echo shar: Will not over-write existing file \"shuf.c\" else echo shar: Extracting \"shuf.c\" \(811 characters\) sed "s/^X//" >shuf.c <<'END_OF_shuf.c' X/* X * shuf - shuffle the pack. X */ X X#include "defs.h" X#include "globs.h" X X#ifdef BSD Xint srand(); Xint rand(); X#else Xvoid srand48(); Xdouble drand48(); X#endif X Xstatic makepack(); X Xvoid Xshuf() X{ X int j, k; X CARD dummy; X if (!packmade) makepack(); X for (j=51; j>=39; j--) { X k = randint(j+1); X dummy = pack[k]; X pack[k] = pack[j]; X pack[j] = dummy; X } X} X Xstatic Xmakepack() X{ X int suit, rank; X CARD *packp; X packp = pack; X for (suit=CLUB; suit<=SPADE; suit++) X for (rank=ACE; rank<=KING; rank++) X *packp++ = MAKECARD(rank,suit); X} X Xinitrand() X{ X long time(); X#ifdef BSD X srand(time((long *)0)); X rand(); X#else X srand48(time((long *)0)); X drand48(); X#endif X} X X/* X * Returns a random integer from 0 to n-1. X */ Xint Xrandint(n) Xint n; X{ X#ifdef BSD X return (rand()/3) % n; X#else X return (int)(drand48()*n); X#endif X} END_OF_shuf.c if test 811 -ne `wc -c <shuf.c`; then echo shar: \"shuf.c\" unpacked with wrong size! fi # end of overwriting check fi if test -f version.c -a "${1}" != "-c" ; then echo shar: Will not over-write existing file \"version.c\" else echo shar: Extracting \"version.c\" \(24 characters\) sed "s/^X//" >version.c <<'END_OF_version.c' Xchar version[] = "1.1"; END_OF_version.c if test 24 -ne `wc -c <version.c`; then echo shar: \"version.c\" unpacked with wrong size! fi # end of overwriting check fi if test -f wglobs.c -a "${1}" != "-c" ; then echo shar: Will not over-write existing file \"wglobs.c\" else echo shar: Extracting \"wglobs.c\" \(167 characters\) sed "s/^X//" >wglobs.c <<'END_OF_wglobs.c' X#include <curses.h> X XWINDOW *Crib; XWINDOW *Select; XWINDOW *Board; XWINDOW *Cut; XWINDOW *Hscore; XWINDOW *Humanhand; XWINDOW *Programhand; XWINDOW *Prompt; XWINDOW *Pscore; END_OF_wglobs.c if test 167 -ne `wc -c <wglobs.c`; then echo shar: \"wglobs.c\" unpacked with wrong size! fi # end of overwriting check fi if test -f window.c -a "${1}" != "-c" ; then echo shar: Will not over-write existing file \"window.c\" else echo shar: Extracting \"window.c\" \(690 characters\) sed "s/^X//" >window.c <<'END_OF_window.c' X#include "defs.h" X#include "globs.h" X#include "window.h" X Xinitwins() X{ X initscr(); X Humanhand = subwin(stdscr, 3, 29, 16, 30); X Programhand = subwin(stdscr, 3, 28, 5, 30); X Prompt = subwin(stdscr, 2, 72, 22, 5); X Select = subwin(stdscr, 1, 28, 19, 30); X Crib = subwin(stdscr, 1, 20, 12, 1); X Cut = subwin(stdscr, 1, 3, 12, 66); X Hscore = subwin(stdscr, 5, 27, 15, 0); X Pscore = subwin(stdscr, 5, 27, 2, 0); X scrollok(Hscore, TRUE); X scrollok(Pscore, TRUE); X Board = subwin(stdscr, 3, 37, 11, 28); X initboard(); X} X Xinitboard() X{ X int i; X for (i=0; i<37; i++) if (1 != (i%6)) { X mvwaddch(Board, 0, i, ':'); X mvwaddch(Board, 2, i, ':'); X } X} X Xtermwins() X{ X clear(); X refresh(); X endwin(); X} END_OF_window.c if test 690 -ne `wc -c <window.c`; then echo shar: \"window.c\" unpacked with wrong size! fi # end of overwriting check fi if test -f window.h -a "${1}" != "-c" ; then echo shar: Will not over-write existing file \"window.h\" else echo shar: Extracting \"window.h\" \(229 characters\) sed "s/^X//" >window.h <<'END_OF_window.h' X#include <curses.h> Xextern WINDOW *Crib; Xextern WINDOW *Board; Xextern WINDOW *Select; Xextern WINDOW *Cut; Xextern WINDOW *Hscore; Xextern WINDOW *Humanhand; Xextern WINDOW *Programhand; Xextern WINDOW *Prompt; Xextern WINDOW *Pscore; END_OF_window.h if test 229 -ne `wc -c <window.h`; then echo shar: \"window.h\" unpacked with wrong size! fi # end of overwriting check fi echo shar: End of archive 1 \(of 1\). cp /dev/null ark1isdone MISSING="" for I in 1 ; do if test ! -f ark${I}isdone ; then MISSING="${MISSING} ${I}" fi done if test "${MISSING}" = "" ; then echo You have unpacked all 1 archives. rm -f ark[1-9]isdone else echo You still need to unpack the following archives: echo " " ${MISSING} fi ## End of shell archive. exit 0