178 lines
5 KiB
C
178 lines
5 KiB
C
|
/***************************************************************************/
|
||
|
/** Microsoft Windows **/
|
||
|
/** Copyright(c) Microsoft Corp., 1991, 1992 **/
|
||
|
/***************************************************************************/
|
||
|
|
||
|
|
||
|
/****************************************************************************
|
||
|
|
||
|
computer.h
|
||
|
|
||
|
This file contains the class declarations and manifest constants
|
||
|
necessary for implementing the 'computer' object.
|
||
|
|
||
|
FILE HISTORY:
|
||
|
|
||
|
KeithMo 01-Mar-1992 Created from JimH's PLAYER.H.
|
||
|
|
||
|
****************************************************************************/
|
||
|
|
||
|
#include "card.h"
|
||
|
#include "player.h"
|
||
|
|
||
|
#ifndef _COMPUTER_H_
|
||
|
#define _COMPUTER_H_
|
||
|
|
||
|
|
||
|
//
|
||
|
// These constants are used for indexing the _CardVectors array.
|
||
|
//
|
||
|
// Note that this ordering *must* match the ordering used for the
|
||
|
// card ID values!!
|
||
|
//
|
||
|
|
||
|
#define INDEX_CLUBS 0
|
||
|
#define INDEX_DIAMONDS 1
|
||
|
#define INDEX_HEARTS 2
|
||
|
#define INDEX_SPADES 3
|
||
|
|
||
|
//
|
||
|
// These constants represent the values returned from the
|
||
|
// CardToVector() function.
|
||
|
//
|
||
|
// Note that this ordering *must* match the ordering used for the
|
||
|
// card ID values!!
|
||
|
//
|
||
|
|
||
|
#define VECTOR_ACE 0x0001
|
||
|
#define VECTOR_2 0x0002
|
||
|
#define VECTOR_3 0x0004
|
||
|
#define VECTOR_4 0x0008
|
||
|
#define VECTOR_5 0x0010
|
||
|
#define VECTOR_6 0x0020
|
||
|
#define VECTOR_7 0x0040
|
||
|
#define VECTOR_8 0x0080
|
||
|
#define VECTOR_9 0x0100
|
||
|
#define VECTOR_10 0x0200
|
||
|
#define VECTOR_JACK 0x0400
|
||
|
#define VECTOR_QUEEN 0x0800
|
||
|
#define VECTOR_KING 0x1000
|
||
|
|
||
|
//
|
||
|
// These constants define various combinations of cards.
|
||
|
//
|
||
|
|
||
|
#define LOW_CARDS (VECTOR_2 | VECTOR_3 | VECTOR_4 | VECTOR_5 \
|
||
|
| VECTOR_6 | VECTOR_7)
|
||
|
|
||
|
#define HIGH_CARDS (VECTOR_8 | VECTOR_9 | VECTOR_10 \
|
||
|
| VECTOR_JACK | VECTOR_QUEEN | VECTOR_KING \
|
||
|
| VECTOR_ACE)
|
||
|
|
||
|
#define QKA_CARDS (VECTOR_QUEEN | VECTOR_KING | VECTOR_ACE)
|
||
|
|
||
|
#define JQKA_CARDS (VECTOR_JACK | VECTOR_QUEEN | VECTOR_KING \
|
||
|
| VECTOR_ACE)
|
||
|
|
||
|
|
||
|
/****************************************************************************
|
||
|
|
||
|
computer
|
||
|
|
||
|
****************************************************************************/
|
||
|
class computer : public player
|
||
|
{
|
||
|
private:
|
||
|
static int _VectorPriority[13];
|
||
|
static int _SuitPriority[4];
|
||
|
|
||
|
int _CardVectors[4];
|
||
|
|
||
|
int CardToSuit( int nCard ) const
|
||
|
{ return nCard % 4; }
|
||
|
|
||
|
int CardToValue( int nCard ) const
|
||
|
{ return nCard / 4; }
|
||
|
|
||
|
int CardToVector( int nCard ) const
|
||
|
{ return 1 << CardToValue( nCard ); }
|
||
|
|
||
|
int CountBits( int x ) const;
|
||
|
|
||
|
void AddCard( int nCard )
|
||
|
{ _CardVectors[CardToSuit(nCard)] |= CardToVector(nCard); }
|
||
|
|
||
|
void RemoveCard( int nCard )
|
||
|
{ _CardVectors[CardToSuit(nCard)] &= ~CardToVector(nCard); }
|
||
|
|
||
|
BOOL TestCard( int nCard ) const
|
||
|
{ return (_CardVectors[CardToSuit(nCard)] & CardToVector(nCard)) != 0; }
|
||
|
|
||
|
int QueryClubsVector( void ) const
|
||
|
{ return _CardVectors[INDEX_CLUBS]; }
|
||
|
|
||
|
int QueryDiamondsVector( void ) const
|
||
|
{ return _CardVectors[INDEX_DIAMONDS]; }
|
||
|
|
||
|
int QueryHeartsVector( void ) const
|
||
|
{ return _CardVectors[INDEX_HEARTS]; }
|
||
|
|
||
|
int QuerySpadesVector( void ) const
|
||
|
{ return _CardVectors[INDEX_SPADES]; }
|
||
|
|
||
|
void ComputeVectors( void );
|
||
|
|
||
|
void PassCardsInVector( int nVector, int nSuit, int * pcPassed );
|
||
|
|
||
|
// comp2.cpp helper functions and data
|
||
|
|
||
|
int BestSuitToDump(BOOL bIncludeHearts = TRUE);
|
||
|
int BestSuitToLose(BOOL bIncludeHearts = TRUE);
|
||
|
SLOT CardBelow(SLOT s);
|
||
|
int CardsAbove(SLOT s);
|
||
|
int CardsAboveLow(int suit);
|
||
|
int CardsBelowLow(int suit);
|
||
|
SLOT MidSlot(int suit);
|
||
|
SLOT SafeCard(handinfotype &h);
|
||
|
SLOT SelectLeadCard(handinfotype &h);
|
||
|
SLOT SelectNonLeadCard(handinfotype &h);
|
||
|
void Setup(handinfotype &h);
|
||
|
int SureLossSuit(BOOL bIncludeHearts);
|
||
|
|
||
|
BOOL bFirst; // am I leading?
|
||
|
BOOL bLast; // am I last?
|
||
|
card *cardled;
|
||
|
int nSuitLed;
|
||
|
int nValueLed;
|
||
|
int currentval; // current winning value
|
||
|
int nPoints; // points currently in hand
|
||
|
|
||
|
SLOT sBlackLady; // non-EMPTY if in hand
|
||
|
|
||
|
SLOT sHighCard[MAXSUIT]; // highest and lowest cards by suit
|
||
|
int nHighVal[MAXSUIT];
|
||
|
SLOT sLowCard[MAXSUIT];
|
||
|
int nLowVal[MAXSUIT];
|
||
|
|
||
|
SLOT sHighestCard; // highest and lowest regardless of suit
|
||
|
int nHighestVal;
|
||
|
SLOT sLowestCard;
|
||
|
int nLowestVal;
|
||
|
|
||
|
int nAvailable[MAXSUIT][KING+2]; // cards unaccounted for this hand
|
||
|
|
||
|
public:
|
||
|
computer(int n);
|
||
|
virtual void NotifyEndHand(handinfotype &h);
|
||
|
virtual void NotifyNewRound(void);
|
||
|
virtual void SelectCardsToPass(void);
|
||
|
virtual void SelectCardToPlay(handinfotype &h, BOOL bCheating);
|
||
|
virtual void UpdateStatus(void) { }
|
||
|
virtual void UpdateStatus(int stringid) { status = stringid; }
|
||
|
virtual void UpdateStatus(const TCHAR *string) { }
|
||
|
|
||
|
}; // class computer
|
||
|
|
||
|
|
||
|
#endif // _COMPUTER_H_
|