tic-tac-toe.js Example File
declarative/toys/tic-tac-toe/qml/tic-tac-toe/content/tic-tac-toe.js
function winner(board)
{
for (var i=0; i<3; ++i) {
if (board.children[i].state != ""
&& board.children[i].state == board.children[i+3].state
&& board.children[i].state == board.children[i+6].state)
return true
if (board.children[i*3].state != ""
&& board.children[i*3].state == board.children[i*3+1].state
&& board.children[i*3].state == board.children[i*3+2].state)
return true
}
if (board.children[0].state != ""
&& board.children[0].state == board.children[4].state != ""
&& board.children[0].state == board.children[8].state != "")
return true
if (board.children[2].state != ""
&& board.children[2].state == board.children[4].state != ""
&& board.children[2].state == board.children[6].state != "")
return true
return false
}
function restartGame()
{
game.running = true
for (var i=0; i<9; ++i)
board.children[i].state = ""
}
function makeMove(pos, player)
{
board.children[pos].state = player
if (winner(board)) {
gameFinished(player + " wins")
return true
} else {
return false
}
}
function canPlayAtPos(pos)
{
return board.children[pos].state == ""
}
function computerTurn()
{
var r = Math.random();
if (r < game.difficulty)
smartAI();
else
randomAI();
}
function smartAI()
{
function boardCopy(a) {
var ret = new Object;
ret.children = new Array(9);
for (var i = 0; i<9; i++) {
ret.children[i] = new Object;
ret.children[i].state = a.children[i].state;
}
return ret;
}
for (var i=0; i<9; i++) {
var simpleBoard = boardCopy(board);
if (canPlayAtPos(i)) {
simpleBoard.children[i].state = "O";
if (winner(simpleBoard)) {
makeMove(i, "O")
return
}
}
}
for (var i=0; i<9; i++) {
var simpleBoard = boardCopy(board);
if (canPlayAtPos(i)) {
simpleBoard.children[i].state = "X";
if (winner(simpleBoard)) {
makeMove(i, "O")
return
}
}
}
function thwart(a,b,c) {
if (board.children[a].state == "X") {
if (canPlayAtPos(b)) {
makeMove(b, "O")
return true
} else if (canPlayAtPos(c)) {
makeMove(c, "O")
return true
}
}
return false;
}
if (thwart(4,0,2)) return;
if (thwart(0,4,3)) return;
if (thwart(2,4,1)) return;
if (thwart(6,4,7)) return;
if (thwart(8,4,5)) return;
if (thwart(1,4,2)) return;
if (thwart(3,4,0)) return;
if (thwart(5,4,8)) return;
if (thwart(7,4,6)) return;
for (var i =0; i<9; i++) {
if (canPlayAtPos(i)) {
makeMove(i, "O")
return
}
}
restartGame();
}
function randomAI()
{
var unfilledPosns = new Array();
for (var i=0; i<9; ++i) {
if (canPlayAtPos(i))
unfilledPosns.push(i);
}
if (unfilledPosns.length == 0) {
restartGame();
} else {
var choice = unfilledPosns[Math.floor(Math.random() * unfilledPosns.length)];
makeMove(choice, "O");
}
}
function gameFinished(message)
{
messageDisplay.text = message
messageDisplay.visible = true
game.running = false
}