/*! 
*******************************************************************************
  \file    ttt-p2.c
  \author  Matthew Mead
  \par     email: mmead\@digipen.edu
  \date    08/27/2012
  \brief   Tic-Tac-Toe AI for player 2
  
  Implements: GetNextMove2()
  
  This file contains the logic for Player 2 in Tic-Tac-Toe. There are 4 
  different "intelligent" moves the player can make:
  
  1 - Random. No intelligence. (no #define)
  2 - If the the middle square is open, take it. (#define SMART_CENTER)
  3 - If the player has two-in-a-row and can make three, take the square
      for a win. (#define SMART_WIN)
  4 - If the opponent has two-in-a-row and can make three, take the square
      for a block. (#define SMART_BLOCK)
      
  You can control the combinations of the above strategies by using the 
  #defines in the code below.
  
  Currently, this program always generates the same set of random numbers each
  time it is run. To enable randomness between runs, uncomment the call to 
  srand() in the main() function at the bottom of this file.
********************************************************************************
*/
#include <stdlib.h> /* rand, srand, atoi       */

void DumpBoard(void);

/* The representation of the tic-tac-toe board */
extern char Board[9];

/* generate random numbers between low and high */
static int RandomInt(int low, int high)
{
  int number;
  number = rand() % (high - low + 1) + low;
  return number;
}

#define SMART
#define SMART_CENTER
#define SMART_WIN
#define SMART_BLOCK

/*******************************************************************************/
/*******************************************************************************/
/*******************************************************************************/
/*******************************************************************************/

/* Currently, this is just a brute-force method for figuring out winning and  */
/* blocking. TODO: Clean it up by using loops.                                */
int GetNextMove2(void)
{
  int position = -1;

#ifdef SMART

#ifdef SMART_CENTER
    if (Board[4] == 0)
      return 4;
#endif /* SMART_CENTER */

#ifdef SMART_WIN
    /* Horizontal rows */
    /* row 1 */
  if (Board[0] == 'O' && Board[1] == 'O' && Board[2] == 0)
    position = 2;
  else if (Board[0] == 'O' && Board[2] == 'O' && Board[1] == 0)
    position = 1;
  else if (Board[1] == 'O' && Board[2] == 'O' && Board[0] == 0)
    position = 0;

    /* row 2 */
  else if (Board[3] == 'O' && Board[4] == 'O' && Board[5] == 0)
    position = 5;
  else if (Board[3] == 'O' && Board[5] == 'O' && Board[4] == 0)
    position = 4;
  else if (Board[4] == 'O' && Board[5] == 'O' && Board[3] == 0)
    position = 3;

    /* row 3 */
  else if (Board[6] == 'O' && Board[7] == 'O' && Board[8] == 0)
    position = 8;
  else if (Board[6] == 'O' && Board[8] == 'O' && Board[7] == 0)
    position = 7;
  else if (Board[7] == 'O' && Board[8] == 'O' && Board[6] == 0)
    position = 6;

    /* Vertical columns */
    /* column 1 */
  else if (Board[0] == 'O' && Board[3] == 'O' && Board[6] == 0)
    position = 6;
  else if (Board[0] == 'O' && Board[6] == 'O' && Board[3] == 0)
    position = 3;
  else if (Board[3] == 'O' && Board[6] == 'O' && Board[0] == 0)
    position = 0;

    /* column 2 */
  else if (Board[1] == 'O' && Board[4] == 'O' && Board[7] == 0)
    position = 7;
  else if (Board[1] == 'O' && Board[7] == 'O' && Board[4] == 0)
    position = 4;
  else if (Board[4] == 'O' && Board[7] == 'O' && Board[1] == 0)
    position = 1;

    /* column 3 */
  else if (Board[2] == 'O' && Board[5] == 'O' && Board[8] == 0)
    position = 8;
  else if (Board[2] == 'O' && Board[8] == 'O' && Board[5] == 0)
    position = 5;
  else if (Board[5] == 'O' && Board[8] == 'O' && Board[2] == 0)
    position = 2;

    /* Diagonals */
    /* top left to bottom right */
  else if (Board[0] == 'O' && Board[4] == 'O' && Board[8] == 0)
    position = 8;
  else if (Board[0] == 'O' && Board[8] == 'O' && Board[4] == 0)
    position = 4;
  else if (Board[4] == 'O' && Board[8] == 'O' && Board[0] == 0)
    position = 0;

    /* top right to bottom left */
  else if (Board[2] == 'O' && Board[4] == 'O' && Board[6] == 0)
    position = 6;
  else if (Board[2] == 'O' && Board[6] == 'O' && Board[4] == 0)
    position = 4;
  else if (Board[4] == 'O' && Board[6] == 'O' && Board[2] == 0)
    position = 2;

  if (position != -1)
    return position;

#endif /* SMART_WIN */

#ifdef SMART_BLOCK
    /* Horizontal rows */
    /* row 1 */
  if (Board[0] == 'X' && Board[1] == 'X' && Board[2] == 0)
    position = 2;
  else if (Board[0] == 'X' && Board[2] == 'X' && Board[1] == 0)
    position = 1;
  else if (Board[1] == 'X' && Board[2] == 'X' && Board[0] == 0)
    position = 0;

    /* row 2 */
  else if (Board[3] == 'X' && Board[4] == 'X' && Board[5] == 0)
    position = 5;
  else if (Board[3] == 'X' && Board[5] == 'X' && Board[4] == 0)
    position = 4;
  else if (Board[4] == 'X' && Board[5] == 'X' && Board[3] == 0)
    position = 3;

    /* row 3 */
  else if (Board[6] == 'X' && Board[7] == 'X' && Board[8] == 0)
    position = 8;
  else if (Board[6] == 'X' && Board[8] == 'X' && Board[7] == 0)
    position = 7;
  else if (Board[7] == 'X' && Board[8] == 'X' && Board[6] == 0)
    position = 6;

    /* Vertical columns */
    /* column 1 */
  else if (Board[0] == 'X' && Board[3] == 'X' && Board[6] == 0)
    position = 6;
  else if (Board[0] == 'X' && Board[6] == 'X' && Board[3] == 0)
    position = 3;
  else if (Board[3] == 'X' && Board[6] == 'X' && Board[0] == 0)
    position = 0;

    /* column 2 */
  else if (Board[1] == 'X' && Board[4] == 'X' && Board[7] == 0)
    position = 7;
  else if (Board[1] == 'X' && Board[7] == 'X' && Board[4] == 0)
    position = 4;
  else if (Board[4] == 'X' && Board[7] == 'X' && Board[1] == 0)
    position = 1;

    /* column 3 */
  else if (Board[2] == 'X' && Board[5] == 'X' && Board[8] == 0)
    position = 8;
  else if (Board[2] == 'X' && Board[8] == 'X' && Board[5] == 0)
    position = 5;
  else if (Board[5] == 'X' && Board[8] == 'X' && Board[2] == 0)
    position = 2;

    /* Diagonals */
    /* top left to bottom right */
  else if (Board[0] == 'X' && Board[4] == 'X' && Board[8] == 0)
    position = 8;
  else if (Board[0] == 'X' && Board[8] == 'X' && Board[4] == 0)
    position = 4;
  else if (Board[4] == 'X' && Board[8] == 'X' && Board[0] == 0)
    position = 0;

    /* top right to bottom left */
  else if (Board[2] == 'X' && Board[4] == 'X' && Board[6] == 0)
    position = 6;
  else if (Board[2] == 'X' && Board[6] == 'X' && Board[4] == 0)
    position = 4;
  else if (Board[4] == 'X' && Board[6] == 'X' && Board[2] == 0)
    position = 2;

  if (position != -1)
    return position;
#endif /* SMART_BLOCK */

  /* No winnable positions yet, just choose at random */
  do 
  {
    position = RandomInt(0, 8);
  }while (Board[position] != 0);
  
  return position;

#else
  
  /* Keep choosing a random square until a valid (e.g. empty) square is found */
  do 
  {
    position = RandomInt(0, 8);
  }while (Board[position] != 0);
  
  return position;
#endif
}
/*******************************************************************************/
/*******************************************************************************/
/*******************************************************************************/
/*******************************************************************************/