examples/declarative/toys/tic-tac-toe/content/tic-tac-toe.js
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 06 Jul 2010 15:10:48 +0300
changeset 30 5dc02b23752f
child 33 3e2da88830cd
permissions -rw-r--r--
Revision: 201025 Kit: 2010127

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 restart()
{
    // No moves left - start again
    for (var i=0; i<9; ++i)
        board.children[i].state = ""
}

function makeMove(pos,player)
{
    board.children[pos].state = player
    if (winner(board)) {
        win(player + " wins")
        return true
    } else {
        return false
    }
}

function computerTurn()
{
    var r = Math.random();
    if(r < game.difficulty){
        smartAI();
    }else{
        randAI();
    }
}

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 (board.children[i].state == "") {
            simpleBoard.children[i].state = "O";
            if(winner(simpleBoard)){
                makeMove(i,"O")
                return
            }
        }
    }
    for(var i=0; i<9; i++){
        var simpleBoard = boardCopy(board);
        if (board.children[i].state == "") {
            simpleBoard.children[i].state = "X";
            if(winner(simpleBoard)){
                makeMove(i,"O")
                return
            }
        }
    }
    function thwart(a,b,c){//If they are at a, try b or c
        if (board.children[a].state == "X") {
            if (board.children[b].state == "") {
                makeMove(b,"O")
                return true
            }else if (board.children[c].state == "") {
                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++){//Backup
        if (board.children[i].state == "") {
            makeMove(i,"O")
            return
        }
    }
    restart();
}

function randAI()
{
    var open = 0;
    for (var i=0; i<9; ++i)
        if (board.children[i].state == "") {
            open += 1;
        }
    if(open == 0){
        restart();
        return;
    }
    var openA = new Array(open);//JS doesn't have lists I can append to (i think)
    var acc = 0;
    for (var i=0; i<9; ++i)
        if (board.children[i].state == "") {
            openA[acc] = i;
            acc += 1;
        }
    var choice = openA[Math.floor(Math.random() * open)];
    makeMove(choice, "O");
}

function win(s)
{
    msg.text = s
    msg.opacity = 1
    endtimer.running = true
}