I've created my solution in JavaScript. Initially I considered doing a Python and JavaScript hybrid with ajax calls to a Django backend but this seemed like overkill to me. The final solution is implemented as a jQuery plugin (code/jquery.tictac.js).
To view the solution, open code/game.html in your browser.
Using the tictac plugin is easy. It's a basic jQuery plugin that doesn't allow for any customizations in its current form. Create an HTML page with a table marked up like so:
<table id="board" class="board">
<tr>
<td id="one" class="even"></td>
<td id="two"></td>
<td id="three" class="even"></td>
</tr>
<tr>
<td id="four"></td>
<td id="five" class="even"></td>
<td id="six"></td>
</tr>
<tr>
<td id="seven" class="even"></td>
<td id="eight"></td>
<td id="nine" class="even"></td>
</tr>
</table>
Then add the following JavaScript to your HTML page before the </body> tag:
<script src="http://code.jquery.com/jquery-1.5.1.js" type="text/javascript" charset="utf-8"></script>
<script src="path/to/jquery.tictac.js" type="text/javascript" charset="utf-8"></script>
<script type="text/javascript" charset="utf-8">
$(function() {
$("#board").tictac();
});
</script>
The HTML page in code/game.html has a full working example with three boards on it.
Tests were built using QUnit. To run them, simply open code/tests/qunit.html in your browser.