#ifndef __TICTACTOE_H__
#define __TICTACTOE_H__

#include "patterns.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();

    void SetOValues(unsigned long _oWin, unsigned long _oBlock,
                    unsigned long _oAlmostWin);
    void SetXValues(unsigned long _xWin, unsigned long _xBlock,
                    unsigned long _xAlmostWin);

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

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

    unsigned long oWin;
    unsigned long oBlock;
    unsigned long oAlmostWin;
    unsigned long xWin;
    unsigned long xBlock;
    unsigned long xAlmostWin;
};










#endif
