- Add support for heuristic evaluation of non-terminal states to your player. Implement your heuristic system in a way that makes it easy to add new heuristics and switch between heuristics. Briefly (one or two sentences is sufficient) describe how you did this.
- Implement a mobility heuristic for your player. (Given a game that you cannot search completely, your player should favor moves that leave it with the most options.) There are multiple ways this can be done, e.g. one step mobility, n-step mobility, number of reachable states, number of legal actions. You may pick whichever one(s) of these you like. Also implement a focus heuristic. (Opposite of mobility: your player should favor moves that leave it with the fewest options.) Try your player out on a repository game of your choosing. Report and discuss your results.
- Implement an opponent mobility heuristic, and implement an opponent focus heuristic. Try your player out on a repository game of your choosing. Report and discuss your results.
- Try something a little different: implement a Monte Carlo heuristic. When does the Monte Carlo heuristic work well? When does it fail? Discuss.
- Implement a combination heuristic which returns a weighted combination of other heuristics. Use this to combine the other heuristics you have created. Evaluate this heuristic on the repository game of your choosing for several different weights. Report and discuss your results.
- Extra Credit: Implement some additional heuristic(s). Demonstrate when and explain why they are effective.