This is Deck.m in view mode; [Download] [Up]
// Deck.m // Project: Cribbage // Stephan Wacker // 93-09-16 #import "deck.h" #import "cribbage.h" #import "Deck.h" #import "Player.h" #import "ComputerPlayer.h" #import "Table.h" #import "LocalizableStrings.h" @implementation Deck - makedeck // // initialize a deck of cards to contain one of each type // { // Collect cards. [human emptyHand]; [comp emptyHand]; [table empty]; [table hideCard: starter]; makedeck( deck ); nCards = CARDS; nCrib = 0; [table downCard: starter]; // folded deck return self; } - shuffle // // given a deck of cards, shuffle it -- i.e. randomize it // see Knuth, vol. 2, page 125 // { register int j, k; CARD c; for( j = nCards; j > 0; --j ) { k = ( rand() >> 4 ) % j; /* random 0 <= k < j */ c = deck[j - 1]; /* exchange (j - 1) and k */ deck[j - 1] = deck[k]; deck[k] = c; } return self; } - (CARD) getCard // // select a random card from the deck and remove it // { int i; CARD result; i = (rand() >> 4) % nCards; /* random cut */ result = deck[i]; remove_card( result, deck, nCards ); -- nCards; return result; } - cut { turnover = [self getCard]; [table upCard: starter card: turnover]; strcpy( local_buf, [nondealer pronoun] ); strcat( local_buf, quiet ? " cut " : " cut the " ); addmsg( LOCAL_BUF ); msgcard(turnover, FALSE); addmsg( CUT_POSTFIX ); endmsg(); if (turnover.rank == JACK) { strcpy( local_buf, [dealer pronoun] ); strcat( local_buf, " get two for his heels" ); addmsg( LOCAL_BUF ); endmsg(); [dealer peg: 2]; } [comp makeknown: &turnover num: 1]; return self; } - (CARD) nextCard // // get the first card from the deck and remove it // { int i; CARD result; i = 0; result = deck[i]; remove_card( result, deck, nCards ); -- nCards; return result; } - setDealer: aPlayer { if( aPlayer ) { dealer = aPlayer; } else { dealer = nondealer; } nondealer = (dealer == human ? comp : human); return self; } - dealer { return dealer; } - nondealer { return nondealer; } - (BOOL) isCompCrib { return (dealer == comp); } - deal // // Deal cards to both players from deck. // { int i; for( i = 0; i < FULLHAND; i++ ) { [nondealer dealCard: [self nextCard]]; [dealer dealCard: [self nextCard]]; } [human sortHand]; [comp sortHand]; return self; } - putIntoCrib: (CARD) aCard { if( nCrib == 0 ) { [table downCard: [dealer cardInCrib]]; } crib[ nCrib++ ] = aCard; return self; } - (CARD *) getCrib { [table hideCard: [dealer cardInCrib]]; return crib; } - (CARD) turnover { return turnover; } @end // Deck
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.