#ifndef __TICTACTOE_H__
#define __TICTACTOE_H__


#define getrandom( min, max ) ((rand() % (int)(((max) + 1) - (min))) + (min))


#define TIE 0
#define X   1
#define Y   2

#define VALID 0
#define SCORE 1

#define WINNER     10
#define BLOCK      8
#define ALMOST_WIN 6


#define ALMOST_WIN_PATTERNS 24
#define FULL_CARD 511

#define TOTAL_WIN_PATTERNS 8


static unsigned long WINPATTERNS[] = 
{
  7,
  56,
  448,
  73,
  146,
  292,
  273,
  84
};

enum
{
  me = 0,
  opp,
};


class TicTacToeGame
{
  public:
    TicTacToeGame();
    virtual ~TicTacToeGame();
    int PlayTicTacToeGame();
    void SetXWinPatterns(unsigned long * _winPatterns, 
                        unsigned long * _almostWinPatterns);
    void SetOWinPatterns(unsigned long * _winPatterns, 
                        unsigned long * _almostWinPatterns);
    bool DidIGoFirst();

  private:
    void PlaceToken(unsigned long * _playerPos, unsigned long _oppPos);
    void PlaceRandomToken(unsigned long * _playerPos, unsigned long _oppPos);
    int CheckMove (int _newPos, unsigned long _myPos, unsigned long _oppPos);
    int CheckOppMove (int _newPos, unsigned long _myPos, unsigned long _oppPos);
    int CheckForWinner (unsigned long _xLoc, unsigned long yLoc);

    int winner;
    unsigned long xLoc;
    unsigned long yLoc;
    unsigned long * xWinPatterns;
    unsigned long * xAlmostWinPatterns;
    unsigned long * oWinPatterns;
    unsigned long * oAlmostWinPatterns;
    bool turn;
    bool bIGoFirst;
};










#endif
