Assigned: October 7, 2008
Paper Due: October 16, 2008
Programming Due: October 21, 2008
Consider the A*Search problem from a prior homework
with a slight alteration. Consider a sliding block puzzle with the
following initial configuration:
WWEBB
1 2 3 4 5
There are two white checkers belonging to player 1, two black checkers
belonging to player 2, and an empty cell. The game ends when a
player moves all of his checkers to the opposite side of the
board. Player 1 moves first. If player 1 wins, 1 point is awarded
to player 1 and -1 points are awarded to player 2 and vice
versa. The legal moves for a player are:
If a player cannot make a move, the turn is forfeited and the other player may make another move. Player 1 can only move to the right and player 2 can only move to the left.
(a) Draw the complete game tree with the following conventions:
(b) Now label each node with its backed-up minimax value for player 1.
(c) Give a solution path that rational players would play.
The purpose of this problem is to give you experience with minimax search with alpha beta pruning, and with developing heuristics.
Your task is to write a program to play tic-tac-toe which meets the specifications below. Standard tic-tac-toe, also called noughts and crosses, hugs and kisses, and many other names, is a pen-and-paper game for two players, X and O, who take turns to mark the spaces in a 3 by 3 grid. The player who succeeds in placing three of their own marks in a horizontal, vertical or diagonal row wins the game.
For this assignment, we will consider a generalized k/2-in-a-row on an k x k board variation of tic-tac-toe. (If k/2 yields a fraction, round down.)
Chenhai will run all of your programs so that each of you plays a tic-tac-toe player that picks an open square to place a mark in. See if you can win!
To make playing this player possible, your submission must satisfy the following (exactly!):
The file board.txt contains only a row-major representation of the board. For example, X___O____ represents a 3x3 board with 'X' in its (0,0) i.e., top right position, 'O' in its center position (1,1). An empty position is indicated by an underscore '_'. A move by your player must be in the form of a single integer between zero and (k*k)-1 (inclusive). The move has to be valid in the sense that it represents an empty board position.
Note that while ideally a player would search the complete game tree, you probably do not have the computational resources. To address this, your program should implement a limited-depth exploration of the game tree, where nodes at a depth limit are evaluated using a board evaluation heuristic. We gave an example tic-tac-toe heuristic in one of the classes. Note that the heuristic function is used to evaluate the leaves of the (depth-limited) tree only. You can choose the depth limit to optimize your player, BUT if your limit causes your program to take more than a minute per step, we will end the game and your player will be declared the loser.
In addition to your code, your submission should contain a description of your heuristic. You should also play at least 10 matches. To illustrate that your program works correctly, please show a trace for one of the matches. To illustrate the quality of your player, report the number of wins, draws, and losses for the 10 matches.
To evaluate your program, we will also run a script that repeatedly invokes your player and respond to its moves by (1) updating board.txt with player X's move, (2) determining if player X has won, (2) and if not, updating board.txt with player O's move. Your player will always go first.
Your assignment will be graded on:
Software to help you
The support code written for this assignment lets you play two different programs against each other. You can find the code here. Alternatively, you can get it on javalab at
There is a Readme file which describes all files. In particular, you will play a game using driver.pl, which iteratively takes two players, playerA and playerB. For your assignment, you will be writing code to replace "playerA".
Chenhai's C source code player.c shows how to read k from the standard input, and how to output the move to standard output. Right now driver.pl outputs the whole process to the standard error, feel free to modify this to redirect your output to a file.