This is Player.m in view mode; [Download] [Up]
// Player.m // Project: Cribbage // Stephan Wacker // 93-09-16 #import "Player.h" #import "ScoreBoard.h" #import "Table.h" #import "Deck.h" #import "Cribbage.h" #import "LocalizableStrings.h" #import "cribbage.h" @implementation Player - changePegColor { [scoreBoard changePegColor]; return self; } - (char *) pronoun { [self subclassResponsibility: _cmd]; return NULL; } - (char *) possessivePronoun { [self subclassResponsibility: _cmd]; return NULL; } - (char *) reflexivePronoun { [self subclassResponsibility: _cmd]; return NULL; } - cardInCrib { return cardInCrib; } - (int) score { return [scoreBoard score]; } - startGame { [scoreBoard clear]; [self emptyHand]; return self; } - emptyHand { [super emptyHand]; [table hideCards: cardsInHand]; [table hideCard: cardInCrib]; return self; } - sortHand { [super sortHand]; [self displayHand]; return self; } - (CARD) firstCut { CARD result = [deck getCard]; [table upCard: cardInCrib card: result]; return result; } - (BOOL) faceUp // // Return YES iff cards are displayed face up. // The computer player should override this method. // { return YES; } - displayCardAt: (int) i { switch( face[i] ) { case FACE_NONE : [table hideCard: [cardsInHand findCellWithTag: i]]; break; case FACE_UP : [table upCard: [cardsInHand findCellWithTag: i] card: hand[i]]; break; break; case FACE_DOWN : [table downCard: [cardsInHand findCellWithTag: i]]; break; } return self; } - displayHand { int i; for( i = 0; i < FULLHAND; i++ ) { [self displayCardAt: i]; } return self; } - dealCard: (CARD) aCard // // Add aCard to the hand. // { [self addCard: aCard faceUp: [self faceUp]]; [self displayCardAt: nHand-1]; return self; } - discard { return [self subclassResponsibility: _cmd]; } - prepareForPegging // // Count the cards in the hand that have not been played, yet. // { didGo = NO; return self; } - playOneCard { return [self subclassResponsibility: _cmd]; } - go { didGo = YES; [cribbage didGo: self]; return self; } - (BOOL) validCardAt: (int) i // // Return YES iff card number i can be played. // { return ( face[i] != FACE_NONE && [table sumPlayed] + VAL( hand[i].rank ) <= 31); } - (BOOL) canPlay // // Return YES iff there is a card in the hand that can be played // without exceeding 31. // { int i; for( i = 0; i < FULLHAND; i++ ) { if( [self validCardAt: i] ) return YES; } return NO; } - (BOOL) anyCards // // Return YES iff there are any cards in the hand. // { int i; for( i = 0; i < FULLHAND; i++ ) { if( face[i] != FACE_NONE ) return YES; } return NO; } - (BOOL) didGo { return didGo; } - playCardAt: (int) i // // Play and score the card in position i of the hand. // { int points; face[i] = FACE_NONE; [table hideCard: [cardsInHand findCellWithTag: i]]; points = [table playCard: hand[i]]; if( points > 0 ) { strcpy( local_buf, [self pronoun] ); strcat( local_buf, quiet ? " get %d playing " : " get %d points playing " ); addmsg( LOCAL_BUF, points ); msgcard( hand[i], FALSE ); addmsg( PLAY_POINTS_POSTFIX ); endmsg(); } else if( !quiet ) { strcpy( local_buf, [self pronoun] ); strcat( local_buf, " play the " ); addmsg( LOCAL_BUF ); msgcard( hand[i], FALSE ); endmsg(); } [self peg: points]; [cribbage didPlay: self card: hand[i]]; return self; } - showHand: (CARD *) cards { int i; for( i = 0; i < CINHAND; i++ ) { [table upCard: [cardsInHand findCellWithTag: i] card: cards[i]]; } return self; } - scoreHand { int points; [self showHand: hand]; points = scorehand( hand, [deck turnover], CINHAND, NO, YES ); [self doScoring: "hand" points: points]; return self; } - scoreCrib: (CARD *) crib { int points; sorthand( crib, CINHAND ); [self showHand: crib]; points = scorehand( crib, [deck turnover], CINHAND, YES, YES ); [self doScoring: "crib" points: points]; return self; } - doScoring: (char *) what points: (int) points { sprintf( local_buf, "%s %s scores %%d", [self possessivePronoun], what ); msg( LOCAL_BUF, (points == 0 ? 19 : points) ); strcpy( prev_expl, expl ); *expl = '\0'; [self peg: points]; [cribbage continueScoring]; return self; } - peg: (int) points // // Add points to score. // { if( [scoreBoard peg: points] ) { [cribbage winner: self]; } return self; } - win: (int) gameValue { [scoreBoard win: gameValue]; return self; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.