/**
 * Main routine
 */
int main(int argc, char** argv)
{
    problem_t problem;
    read_options(argc, argv, &problem);

    clock_t start = clock(), diff; //Clocking

    if (problem.verbose) {
        for (int i = 0; i < problem.g; ++i) {
            printf("\nGeneration %d\n", i);
            print_board(&problem);
            advance_board(&problem, 1);
        }
    } else {
#ifdef WITH_TIMING
        double t0 = omp_get_wtime();
        advance_board(&problem, problem.g);
        double t1 = omp_get_wtime();
        printf("Cells / sec: %e\n",
               problem.g * problem.nboard * problem.nboard / (t1-t0));
#else
        advance_board(&problem, problem.g);
<<<<<<< HEAD

    diff = clock() - start; //get the time and print the result
    int msec = diff*1000/CLOCKS_PER_SEC;
    printf("Time taken %d seconds %d milliseconds", msec/1000, msec%1000);

=======
#endif
    }
>>>>>>> upstream/master
void Board::do_best_move()
{
  int best_score = INT_MIN;
  Board* best_board = 0;

  for (int x = 0; x < SQUARE_DIMENSION; ++x)
  {
    for (int y = 0; y < SQUARE_DIMENSION; ++y)
    {
      if ((*board)[x][y]->get_occupant() == current_player)
      {
        std::vector<Board::Direction> available_directions = find_available_directions(*(*board)[x][y]);

        for (int i = 0; i < available_directions.size(); ++i)
        {
          Board* new_board = travel(*(*board)[x][y], available_directions[i]);

          int new_board_min_score = new_board->min_max_possible_score(current_player, true, MIN_MAX_TREE_DEPTH, best_score);

          if (best_score < new_board_min_score) {
            best_score = new_board_min_score;

            delete best_board;
            best_board = new_board;
          } else
          {
            delete new_board;
          }
        }
      }
    }
  }

  if (best_board)
  {
    advance_board(best_board->board);

    delete best_board;
  } else
  {
    // No moves possible
    printf("Player %s has won\n", current_player == Square::BLACK ? "WHITE" : "BLACK");
    game_over = true;
  }
}
void Board::do_random_move()
{
  Board* new_board = 0;

  for (int x = 0; x < SQUARE_DIMENSION; ++x)
  {
    for (int y = 0; y < SQUARE_DIMENSION; ++y)
    {
      if ((*board)[x][y]->get_occupant() == current_player)
      {
        std::vector<Board::Direction> available_directions = find_available_directions(*(*board)[x][y]);
        int count_directions = available_directions.size();

        if (count_directions == 0)
        {
          continue;
        }

        int direction_idx = rand() % count_directions;

        new_board = travel(*(*board)[x][y], available_directions[direction_idx]);
        break;
      }
    }

    if (new_board)
    {
      break;
    }
  }

  if (new_board)
  {
    advance_board(new_board->board);
    delete new_board;
  } else
  {
    // No moves possible
    printf("Player %s has won\n", current_player == Square::BLACK ? "WHITE" : "BLACK");
    game_over = true;
  }
}