public static IntPair calculateMove(Board b, ArrayList<Tuple> movesToBlock, ArrayList<Tuple> movesToMake) {
        //first check for winning move
        for (Tuple item : movesToMake) {
            if (item.getWeight() == 2) {
                AIDebuggingOutput.println("I'm smart, so I'm winning at " + item.getLocation().getX() + "," + item.getLocation().getY());
                return item.getLocation();
            }
        }
        //check if opponent has winning move and block
        for (Tuple item : movesToBlock) {
            if (item.getWeight() == 2) {
                AIDebuggingOutput.println("I'm smart, so I'm blocking you at " + item.getLocation().getX() + "," + item.getLocation().getY());
                return item.getLocation();
            }
        }

        //else return random
        Random rand = new Random();
        int xIndex = rand.nextInt(7);
        int yIndex = 0;
        // make sure random column is not already full
        while (b.getGameGridCircle(xIndex, yIndex).getState() != 0) {
            xIndex = (xIndex + 1) % 7;
        }
        //find the lowest empty slot in the chosen column
        //Place a circle there
        while ((yIndex != Board.numRows - 1) && (b.getGameGridCircle(xIndex, yIndex + 1).getState() == 0)) {
            yIndex++;
            if (yIndex == Board.numRows - 1) {
                break;
            }
        }
        AIDebuggingOutput.println("Hmm, I'm not sure so I'm guessing " + xIndex + "," + yIndex);
        return new IntPair(xIndex, yIndex);
    }