JavaScript 计算机人工智能

标签 javascript jquery artificial-intelligence

我有一个用 JavaScript 构建的井字游戏。我已经在函数中编写了计算机 AI 部分的逻辑。我想在我的代码的上半部分调用该函数,但它不起作用。有没有人对如何实现代码的 Ai 功能有任何建议?我想成功所以很难赢。对可能出错的任何帮助?

谢谢。

这是我的 JSFiddle 链接: http://jsfiddle.net/fnez/rvacaer4/

HTML:

<body>
<div id="container">
    <header>
        <h1>Tic Tac Toe</h1>
    </header>
    <ul id="board">
        <li id="spot1"></li>
        <li id="spot2"></li>
        <li id="spot3"></li>
        <li id="spot4"></li>
        <li id="spot5"></li>
        <li id="spot6"></li>
        <li id="spot7"></li>
        <li id="spot8"></li>
        <li id="spot9"></li>
    </ul>
    <div class="clearfix"></div>
    <footer id="reset">Reset</footer>
</div>
</body>

JavaScript:

$(document).ready(function() {
    var x = "x";
    var o = "o";
    var turns = 0;

// spots stored in variables 
    var spot1 = $("#spot1");
    var spot2 = $("#spot2");
    var spot3 = $("#spot3");
    var spot4 = $("#spot4");
    var spot5 = $("#spot5");
    var spot6 = $("#spot6");
    var spot7 = $("#spot7");
    var spot8 = $("#spot8");
    var spot9 = $("#spot9");

// function for resetting the board
    function remove() {
            $("#board li").text("");
            $("#board li").removeClass("disable");
            $("#board li").removeClass("o");
            $("#board li").removeClass("x");
            turns = 0;
    }

// Board click 
    $("#board li").on("click", function() {
        console.log(turns);

        if(turns % 2 === 0) {
            $(this).text(x);
            $(this).addClass('disable x');
        } 
        xWins();

        if(turns % 2 !== 0) {
            compCheck();
        } 
        oWins();
        turns ++;
        draw();
    });


    //Checking for Wins

    function xWins() {
        if(spot1.hasClass(x) && spot2.hasClass(x) && spot3.hasClass(x) || 
            spot1.hasClass(x) && spot4.hasClass(x) && spot7.hasClass(x) ||
            spot1.hasClass(x) && spot5.hasClass(x) && spot9.hasClass(x) ||
            spot2.hasClass(x) && spot5.hasClass(x) && spot8.hasClass(x) ||
            spot3.hasClass(x) && spot5.hasClass(x) && spot7.hasClass(x) ||
            spot3.hasClass(x) && spot6.hasClass(x) && spot9.hasClass(x) ||
            spot4.hasClass(x) && spot5.hasClass(x) && spot6.hasClass(x) ||
            spot7.hasClass(x) && spot8.hasClass(x) && spot9.hasClass(x)
            )   {
                alert("Winner is X");
                remove();           
                }
    }

        function oWins() {
        if(spot1.hasClass(o) && spot2.hasClass(o) && spot3.hasClass(o) || 
            spot1.hasClass(o) && spot4.hasClass(o) && spot7.hasClass(o) ||
            spot1.hasClass(o) && spot5.hasClass(o) && spot9.hasClass(o) ||
            spot2.hasClass(o) && spot5.hasClass(o) && spot8.hasClass(o) ||
            spot3.hasClass(o) && spot5.hasClass(o) && spot7.hasClass(o) ||
            spot3.hasClass(o) && spot6.hasClass(o) && spot9.hasClass(o) ||
            spot4.hasClass(o) && spot5.hasClass(o) && spot6.hasClass(o) ||
            spot7.hasClass(o) && spot8.hasClass(o) && spot9.hasClass(o)
            )   {
                alert("Winner is O");
                remove();           
                }
    }

    //Checks for tie 
    function draw() {
        while(turns == 9) {
            alert("It's a tie !");
            remove();
        }
    };

    //Reset button function
        $("#reset").on("click", function() {
            remove();
        });


// Computer AI MOVES 

function compCheck() {
    if (spot1.text == "" && ((spot3.text == "x" && spot2 == "x") || (spot9 == "x" && spot5 == "x") || (spot7 == "x" && spot4 == "x"))) {
        spot1.text(o);
        spot1.addClass('disable o');
        turns++;
    } else {
      if (spot1.text == "" && ((spot1.text == "x" && spot3.text == "x") || (spot8.text == "x" && spot5 == "x"))) {
        spot2.text(o);
        spot2.addClass('disable o');
        turns++; 
        }
        else{
        if (spot3.text == "" && ((spot1.text == "x" && spot2.text == "x") || (spot7.text == "x" && spot5.text == "x") || (spot9.text == "x" && spot6.text == "x"))) {
            spot3.text(o);
            spot3.addClass('disable o');
            turns++;
        }
            else{
            if (spot9.text == "" && ((spot7.text == "x" && spot8.text == "x") || (spot1.text == "x" && spot5.text == "x") || (spot3.text == "x" && spot6.text == "x"))) {
                spot9.text(o);
                spot9.addClass('disable o');
                turns++;
        }
                else{
                if (spot7.text == "" && ((spot9.text == "x" && spot8.text == "x") || (spot3.text == "x" && spot2.text == "x") || (spot1.text == "x" && spot4.text == "x"))) {
                    spot7.text(o);
                    spot7.addClass('disable o');
                    turns++;
        }
                    else{
                    if (spot8.text == "" && ((spot9.text == "x" && spot7 == "x") || (spot2.text == "x" && spot5.text == "x"))) {
                        spot8.text(o);
                        spot8.addClass('disable o');
                        turns++;
        }
                        else{
                        if (spot4.text == "" && ((spot6.text == "x" && spot5.text == "x") || (spot1.text == "x" && spot7.text == "x"))) {
                            spot4.text(o);
                            spot4.addClass('disable o');
                            turns++;
        }
                            else{
                            if (spot6.text == "" && ((spot3.text == "x" && spot9.text == "x") || (spot5.text == "x" && spot4.text == "x"))) {
                                spot4.text(o);
                                spot4.addClass('disable o');
                                turns++;
        }
                                else{
                                if (spot5.text == "" && ((spot3.text == "x" && spot7.text == "x") || (spot9.text == "x" && spot1.text == "x") || (spot6.text == "x" && spot4.text == "x") || (spot8.text == "x" && spot2.text == "x"))) {
                                    spot4.text(o);
                                    spot4.addClass('disable o');
                                    turns++;
        }
                                   else{ // if no spot to block then play these spots....
                                    if (spot5.text == "") {
                                        spot5.text(o);
                                        spot5.addClass('disable o');
                                        turns++;

                                    }
                                        else{
                                        if (spot1.text == "") {
                                            spot1.text(o);
                                            spot1.addClass('disable o');
                                            turns++;

                                    }
                                            else{
                                            if (spot9.text == "") {
                                                spot9.text(o);
                                                spot9.addClass('disable o');
                                                turns++;

                                    } 
                                                else {
                                                if (spot8.text == "") {
                                                    spot8.text(o);
                                                    spot8.addClass('disable o');
                                                    turns++;

                                    }
                                                    else{
                                                    if (spot4.text == "") {
                                                        spot4.text(o);
                                                        spot4.addClass('disable o');
                                                        turns++;

                                    }
                                                    }
                                                }
                                            }


                                        }
                                   }
                                }
                            }
                        }
                    }
                }
            }
        }
    }   
    }; 
    });

最佳答案

这是一个固定版本:

http://jsfiddle.net/rvacaer4/4/

我根据自己的评论修改了转弯,还修复了 *.text 调用。

AI 仍然有一些错误(有时不玩,不正确防守(玩 1、3、2 总是赢),不做获胜的 Action 等),但我相信你会解决的.


如果你真的想让玩家感到困难,我建议你放弃手动 AI 并编写一个递归检查,以找出每种情况下的最佳着法。正如我在第一条评论中所说,游戏很简单,所以如果编写得当,即使是当今最慢的机器也能以纳秒为单位进行计算。那样的话,人类将只能做平局。

关于JavaScript 计算机人工智能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33428258/

相关文章:

c# - 是否需要引用变量才能将它们包含在闭包中?

jquery - 如何根据 jquery 中的值获取文本框名称

Python神经网络不训练

java - 华为HIAI引擎 "General text recognition"未检测到图像中的任何文本

algorithm - 机器学习算法

javascript - 在 IE 8 下通过标签名获取脚本

javascript - 将多个值添加到文本区域

javascript - 在悬停 HTML 视频上使用自动播放在暂停时获取叠加层或占位符

jquery - 如何将 div 内容放在外部 div 的底部,而不管外部 div 的高度变化如何

jquery - 将 jQuery 与 Raphael 一起使用