пятница, 30 ноября 2012 г.

JavaScript Крестики-Нолики с AI с Таймером

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<style type="text/css">
table {border-collapse: collapse;}
table tr td {padding: 0; border: 1px solid black; text-align: center; vertical-align: middle; cursor: default;}
table#scores tr td {width: 65px; height: 30px;}
table#play_field tr td {width: 50px; height: 50px;}
</style>
<script type="text/javascript" src="http://code.jquery.com/jquery-1.8.3.min.js"></script>
<script type="text/javascript">

function newArray () {
     return  [
                    [
                        [0, 0], [0, 1], [0, 2]
                    ],
                    [
                        [1, 0], [1, 1], [1, 2]
                    ],
                    [
                        [2, 0], [2, 1], [2, 2]
                    ]
                 ];
}

var empty_cells = newArray ();                                           

// Random number from range function
function randomNumber (low_limit, high_limit) {
    return Math.round(Math.random()*(high_limit - low_limit)) + low_limit;
}

$(document).ready(function(){

    var current_player = "PlayerX";   
   
    var current_game_turn = 1;
    var max_game_turns_number = 9;
   
    var current_game_round = 1;
    var max_game_rounds_number = 5;
   
    var scores_table = '<table id="scores">' +
                                            '<tr><td>Round</td><td>Player X</td><td>Player O</td></tr>';
                                           
    for (var i = 0; i < max_game_rounds_number; i++) {
                  scores_table += '<tr><td>' + ( i + 1) + '</td><td></td><td></td></tr>';
    }

             scores_table += '</table>';

    var play_field_table = '<table id="play_field">' +
                                            '<tr><td></td><td></td><td></td></tr>' +
                                            '<tr><td></td><td></td><td></td></tr>' +
                                            '<tr><td></td><td></td><td></td></tr>' +
                                      '</table>';
                                     
    var round_field = '<p id="round">Round: <span>1</span></p>';

    $("body").append(round_field).append(scores_table).append('<br />').append(play_field_table);
   
    function refreshScoresTable () {
        for (var i = 0; i < 5; i++) {
            $("table#scores tr:eq(" + (i + 1) + ") td:eq(1)").text("");
            $("table#scores tr:eq(" + (i + 1) + ") td:eq(2)").text("");
        }
    }
   
    function refreshPlayFieldTable () {
        $("table#play_field tr td").text("").removeClass("checked");
    }
   
    var classPlayer = function () {};
           classPlayer.prototype = {
                   scores: 0
           };
   
    var PlayerX =  new classPlayer();
    var PlayerO =  new classPlayer();

    function winCheck() {
   
        // Diagonal Win
        // X
        //   X
        //     X
        if (
                ($("table#play_field tr:eq(0) td:eq(0)").text() == "X") &&
                ($("table#play_field tr:eq(1) td:eq(1)").text() == "X") &&
                ($("table#play_field tr:eq(2) td:eq(2)").text() == "X")
        ) {
            return "Player X Win";
        }
       
        // Vertical Win
        // O
        //   O
        //     O
        if (
                ($("table#play_field tr:eq(0) td:eq(0)").text() == "O") &&
                ($("table#play_field tr:eq(1) td:eq(1)").text() == "O") &&
                ($("table#play_field tr:eq(2) td:eq(2)").text() == "O")
        ) {
            return "Player O Win";
        }
       
        // Diagonal Win
        //     X
        //   X
        // X
        if (
                ($("table#play_field tr:eq(0) td:eq(2)").text() == "X") &&
                ($("table#play_field tr:eq(1) td:eq(1)").text() == "X") &&
                ($("table#play_field tr:eq(2) td:eq(0)").text() == "X")
        ) {
            return "Player X Win";
        }
       
        // Vertical Win
        //     O
        //   O
        // O
        if (
                ($("table#play_field tr:eq(0) td:eq(2)").text() == "O") &&
                ($("table#play_field tr:eq(1) td:eq(1)").text() == "O") &&
                ($("table#play_field tr:eq(2) td:eq(0)").text() == "O")
        ) {
            return "Player O Win";
        }

        for (var i=0; i < 3; i++) {
       
            // Horizontal Win X X X
            if (
                    ($("table#play_field tr:eq(" + i + ") td:eq(0)").text() == "X") &&
                    ($("table#play_field tr:eq(" + i + ") td:eq(1)").text() == "X") &&
                    ($("table#play_field tr:eq(" + i + ") td:eq(2)").text() == "X")
            ) {
                return "Player X Win";
            }
           
            // Horizontal Win O O O
            if (
                    ($("table#play_field tr:eq(" + i + ") td:eq(0)").text() == "O") &&
                    ($("table#play_field tr:eq(" + i + ") td:eq(1)").text() == "O") &&
                    ($("table#play_field tr:eq(" + i + ") td:eq(2)").text() == "O")
            ) {
                return "Player O Win";
            }
           
            // Vertical Win
            // X
            // X
            // X
            if (
                    ($("table#play_field tr:eq(0) td:eq(" + i + ")").text() == "X") &&
                    ($("table#play_field tr:eq(1) td:eq(" + i + ")").text() == "X") &&
                    ($("table#play_field tr:eq(2) td:eq(" + i + ")").text() == "X")
            ) {
                return "Player X Win";
            }
           
            // Vertical Win
            // O
            // O
            // O
            if (
                    ($("table#play_field tr:eq(0) td:eq(" + i + ")").text() == "O") &&
                    ($("table#play_field tr:eq(1) td:eq(" + i + ")").text() == "O") &&
                    ($("table#play_field tr:eq(2) td:eq(" + i + ")").text() == "O")
            ) {
                return "Player O Win";
            }

        }
       
        return "Nobody Win";

    };
   
    function AIplayer () {

        var random_row, random_cell, row, cell;
       
        function checkCell () {
            random_row = randomNumber (0, 2);
            random_cell = randomNumber (0, 2); console.log("[" + random_row + "," + random_cell + "]");
            if (empty_cells[random_row][random_cell] == undefined) {           
                for (var i=0; i < 3; i++) {
                    for (var j=0; j < 3; j++) {console.log("i: " + i + ", j: " + j);
                        if (empty_cells[i][j] != undefined) {
                            row = i;
                            cell = j;   
                            break;
                        }
                    }                   
                }
            } else {
                row = random_row;
                cell = random_cell;
            }
        }
       
        checkCell ();
       
        $("table#play_field tr:eq(" + empty_cells[row][cell][0]  + ") td:eq(" + empty_cells[row][cell][1] + ")").text("O").addClass("checked");
        delete empty_cells[row][cell];
        current_player = "PlayerX";
       
    }
   
    $("table#play_field tr td").click(function(){

        if (!$(this).hasClass("checked")) {
       
            if (current_player == "PlayerX") {
           
                $(this).text("X").addClass("checked");
                delete empty_cells[$(this).parent().index()][$(this).index()];
                current_player = "PlayerO";
               
                checkWinConditions ();
               
                setTimeout (function() {
               
                    AIplayer ();
                   
                    checkWinConditions ();
                   
                }, 1000);
               
            }
           
        }

           
                function checkWinConditions () {
           
                    console.log(empty_cells);
                    current_game_turn++;
               
                    if(winCheck() == "Nobody Win") {
                   
                        if (current_game_turn != (max_game_turns_number + 1)) {
                            // Game round continue.
                        } else {
                            $("table#scores tr:eq(" + current_game_round + ") td:eq(1)").text("Draw");
                            $("table#scores tr:eq(" + current_game_round + ") td:eq(2)").text("Draw");
                            refreshPlayFieldTable ();
                            empty_cells = newArray ();
                            current_game_turn = 1;
                            current_game_round++;
                            if (current_game_round > 5) {
                                $("p#round span").text(max_game_rounds_number);
                            } else {
                                $("p#round span").text(current_game_round);
                            }
                        }
                       
                    } else if (winCheck() == "Player X Win") {
                   
                        PlayerX.scores = PlayerX.scores + 1;
                        $("table#scores tr:eq(" + current_game_round + ") td:eq(1)").text("Win");
                        $("table#scores tr:eq(" + current_game_round + ") td:eq(2)").text("Lose");
                        refreshPlayFieldTable ();
                        empty_cells = newArray ();
                        current_game_turn = 1;
                        current_game_round++;
                        if (current_game_round > 5) {
                            $("p#round span").text(max_game_rounds_number);
                        } else {
                            $("p#round span").text(current_game_round);
                        }
                       
                    } else if (winCheck() == "Player O Win") {
                   
                        PlayerO.scores = PlayerO.scores + 1;       
                        $("table#scores tr:eq(" + current_game_round + ") td:eq(1)").text("Lose");
                        $("table#scores tr:eq(" + current_game_round + ") td:eq(2)").text("Win");
                        refreshPlayFieldTable ();
                        empty_cells = newArray ();
                        current_game_turn = 1;
                        current_game_round++;
                        if (current_game_round > 5) {
                            $("p#round span").text(max_game_rounds_number);
                        } else {
                            $("p#round span").text(current_game_round);
                        }
                       
                    }
                   
                    if (current_game_round == (max_game_rounds_number + 1)) {
                        refreshPlayFieldTable ();
                        empty_cells = newArray ();
                        if (PlayerX.scores > PlayerO.scores) {
                            alert("Game End. Player X Win.");
                        } else if (PlayerX.scores < PlayerO.scores) {
                            alert("Game End. Player O Win.");
                        } else if (PlayerX.scores == PlayerO.scores) {
                            alert("Game End. Draw.");
                        }
                        refreshScoresTable ();
                        current_game_turn = 1;
                        current_game_round = 1;
                        $("p#round span").text(current_game_round);
                    }
                   
                }
           

       
    });
   

});
</script>
<title>XO Game</title>
</head>
<body>
</body>
</html>

Комментариев нет:

Отправить комментарий