//tttHint
//Indicates best option based on heuristic algorithm
//Andy Harris, June 2003
init();
function init(){
//set up X values
xVals = new Array(130, 230, 330, 130, 230, 330, 130, 230, 330);
yVals = new Array(120, 120, 120, 210, 210, 210, 300, 300, 300);
board = new Array("blank", "blank", "blank", "blank", "blank",
"blank", "blank", "blank", "blank");
turn = "x";
//winningCombo is an array of all winning combos
winningCombo = new Array(
new Array(0, 1, 2),
new Array(3, 4, 5),
new Array(6, 7, 8),
new Array(0, 3, 6),
new Array(1, 4, 7),
new Array(2, 5, 8),
new Array(0, 4, 8),
new Array(2, 4, 6)
);
//rank is initial rank of each cell in board. The heuristic will modify the
//modify the ranking during game play
rank = new Array(3, 2, 3, 2, 4, 2, 3, 2, 3);
//build classes from cell
for (i = 0; i < 9; i++){
_root.attachMovie("cell", "cell_" + i, 100 + i);
theCell = eval("cell_" + i);
theCell._x = xVals[i];
theCell._y = yVals[i];
theCell.state = "blank";
theCell.index = i;
theCell.gotoAndStop(theCell.state);
//add click event
theCell.onMouseUp = function(){
//respond only if mouse is over me (aaaargh!)
if (this.hitTest(_root._xmouse, _root._ymouse, false)){
currentSquare = this.index;
if(board[currentSquare] == "blank"){
board[currentSquare] = turn;
this.state = turn;
this.gotoAndStop(this.state);
checkForWinner();
showHint();
if (turn == "x"){
turn = "o";
} else {
turn = "x";
} // end 'whos turn' if
} // end 'board is blank' if
} // end "hit this instance" if
} // end mouseUp
} // end for
showHint();
} // end init
function checkForWinner(){
//looks to see if the board matches any winning combos
for (comboNum = 0; comboNum < 8; comboNum++){
firstVal = winningCombo[comboNum][0];
secondVal = winningCombo[comboNum][1];
thirdVal = winningCombo[comboNum][2];
if ((board[firstVal] == board[secondVal]) &&
(board[secondVal] == board[thirdVal]) &&
(board[firstVal] != "blank")){
winner = board[firstVal];
trace (winner + " wins!");
} // end if
} // end for
} // end checkForWinner
function showHint(){
//evaluates board, determines best move available
//start with clean rank each time
rank = new Array(3, 2, 3, 2, 4, 2, 3, 2, 3);
bestCell = 0;
highestRank = -999;
//raise ranking of any score that will win or lose game
for (comboNum = 0; comboNum < 8; comboNum++){
firstVal = winningCombo[comboNum][0];
secondVal = winningCombo[comboNum][1];
thirdVal = winningCombo[comboNum][2];
if ((board[firstVal] == board[secondVal]) &&
(board[firstVal] != "blank")){
rank[thirdVal] += 5;
} // end if
if ((board[firstVal] == board[thirdVal]) &&
(board[firstVal] != "blank")){
rank[secondVal] += 5;
} // end if
if ((board[secondVal] == board[thirdVal]) &&
(board[secondVal] != "blank")){
rank[firstVal] += 5;
} // end if
} // end for
//lower ranking of any cell currently containing anything but blank
for (cellNum = 0; cellNum < 9; cellNum++){
if (board[cellNum] != "blank"){
rank[cellNum] -= 99;
} // end if
//see if this is the highest ranking cell so far
if (rank[cellNum] > highestRank){
bestCell = cellNum;
highestRank = rank[cellNum];
} // end if
} // end for
traceRank();
trace ("try " + bestCell);
_root.outputBest = bestCell;
} // end showHint
function traceRank(){
//outputs the current rank structure for debugging purposes
trace (rank[0] + ", " + rank[1] + ", " + rank[2]);
trace (rank[3] + ", " + rank[4] + ", " + rank[5]);
trace (rank[6] + ", " + rank[7] + ", " + rank[8]);
trace("");
} // end traceRank