public int evalMove(Move m, State s, int depth, int alpha, int beta) {
		int a = alpha;
		int b = beta;
		count++;
		

	if (depth == 0) { // cutting off search -> evaluate resulting state
	    return evalState(s.tryMove(m));
	} else { // minimax-search
	    // update the state
	    State newstate = s.tryMove(m);

	    // get a list of possible moves from newstate
	    MyList moves = newstate.findMoves();

	    // shuffle so we don't always find the same maximum
	    Collections.shuffle(moves);

	    // return utility of state if there are no new moves
	    if (moves.size() == 0)
		return evalState(newstate);

	    // Iterate over all moves
	    Iterator it = moves.iterator();

	    // We already know there is at least one move, so use it to
	    // initialize minimaxvalue
	    int minimaxvalue = evalMove((Move) it.next(), newstate, depth - 1, a, b);
	    // now the rest of the moves
	    while (it.hasNext()) {
		Move newmove = (Move) it.next();
		int eval = evalMove(newmove, newstate, depth - 1, a, b);

		// if this is our turn, save the maximumvalue, otherwise
		// the mimimumvalue
		if (newstate.whoseTurn().equals(me)){ // our turn
		    minimaxvalue = Math.max(minimaxvalue, eval);
			if(minimaxvalue > a) a= minimaxvalue;
			if(alpha >= b) break;
		}
		else{ // opponent's turn
		    minimaxvalue = Math.min(minimaxvalue, eval);
			if(minimaxvalue < b) b= minimaxvalue;
			if(alpha >= b) break;
		}
	    }
		
	    return minimaxvalue;
	}

    }