JavaScript新手練習(xí)——井字棋

井字棋是一個很簡單的游戲部凑,通過窮舉露乏,我們輕易的記錄井字棋所有可能的走法。因此我們的AI可以實(shí)現(xiàn)的能力是

先手:盡可能的贏棋

后手:保證不輸棋砚尽,且在玩家出現(xiàn)失誤的情況下贏棋

游戲基本功能

1.有一個下棋(落子)的函數(shù)

2.有一個判斷勝負(fù)的函數(shù)

AI部分

窮舉后施无,可知

作為先手辉词,只要占下一個拐角必孤,玩家在剩下的8個位置中,有7個是必輸?shù)娜鹛伞JO碌囊环N方式敷搪,也最多只是平手。

作為后手則更加簡單幢哨,無論玩家怎么開局赡勘,只要AI走對了前兩步棋,后面就只要專門攔住玩家的棋即可捞镰。

所以需要

1.根據(jù)玩家下子的情況闸与,讓AI下特定的位置(只需兩步)毙替。

2.有一個進(jìn)攻函數(shù)來連成三子取得勝利,用于抓住玩家的失誤或者防止玩家放水践樱。有一個防守函數(shù)來攔住玩家的棋子厂画,使之不能連成三子。

3.有一個隨機(jī)下子函數(shù)來在要平局的情況下填滿棋盤拷邢。

優(yōu)先級:進(jìn)攻>防守>隨機(jī)

** 戳這里試用 **

部分JS代碼:

棋盤數(shù)組袱院,用于判斷勝負(fù)和進(jìn)攻防守函數(shù)。
arr = [[0, 1, 2],[0, 3, 6],[1, 4, 7],[2, 5, 8],[3, 4, 5],[6, 7, 8],[0, 4, 8],[2, 4, 6]]

判斷勝負(fù)函數(shù)(棋子設(shè)置了自定義屬性瞭稼,只要任意一條線上拼接起來為"111"則代表連成一線忽洛,由于玩家不會贏,不需要判斷玩家是否勝利)

   function checkSituation() {
        if (arr.some(function(item) {
                return concatBox(item) == "111";
            })) {
            result("你輸了 :-(");
        } else if ($("button[disabled]").length === 9) {
            result("平局");
        }
    }

進(jìn)攻函數(shù)环肘,防守函數(shù)

//  "0"為空子欲虚,"1"為AI棋子,"-1"為玩家棋子
    function attack(arr) {
        switch (concatBox(arr)) {
            case "011":
                aiClick(arr[0]);
                return true;
            case "101":
                aiClick(arr[1]);
                return true;
            case "110":
                aiClick(arr[2]);
                return true;
        }
    }
    function defense(arr) {
        switch (concatBox(arr)) {
            case "0-1-1":
                aiClick(arr[0]);
                return true;
            case "-10-1":
                aiClick(arr[1]);
                return true;
            case "-1-10":
                aiClick(arr[2]);
                return true;
        }
    }

AI下棋函數(shù)

    function aiRound() {
    //  連三子
        if (arr.some(function(item) {
                return attack(item);
            })) {
            return;
        }
    //  攔住玩家三子
        if (arr.some(function(item) {
                return defense(item);
            })) {
            return;
        }
    //  AI先手
        if (AI === "X") {
            if (aiSteps === 1) {
                switch (true) {
                    case box(1) == -1 || box(3) == -1:
                        Xcase = "1";
                        aiClick(4);
                        break;
                    case box(2) == -1 || box(6) == -1:
                        Xcase = "2";
                        aiClick(8);
                        break;
                    case box(5) == -1 || box(7) == -1:
                        Xcase = "3";
                        aiClick(4);
                        break;
                    case box(8) == -1:
                        Xcase = "4";
                        aiClick(2);
                        break;
                    default:
                        aiClick(8);
                        break;
                }
            }
            if (aiSteps === 2) {
                switch (Xcase) {
                    case "1":
                        if (box(3) == -1) { aiClick(2); } else { aiClick(6); }
                        break;
                    case "2":
                        if (box(2) == -1) { aiClick(6); } else { aiClick(2); }
                        break;
                    case "3":
                        if (box(5) == -1) { aiClick(2); } else { aiClick(6); }
                        break;
                    case "4":
                        aiClick(6);
                        break;
                }
            }
        }
    //  AI后手
        if (AI === "O") {
            if (aiSteps === 0) {
                if (box(4) == -1) {
                    aiClick(0);
                } else {
                    aiClick(4);
                }
            } else if (aiSteps === 1) {
                if (parseInt(box(0)) + parseInt(box(2)) + parseInt(box(6)) + parseInt(box(8)) == 2) { aiClick(1); } 
                else if (twoBox(2, 3) || twoBox(1, 6) || twoBox(1, 3)) { aiClick(0); } 
                else if (twoBox(0, 5) || twoBox(1, 8) || twoBox(1, 5)) { aiClick(2); } 
                else if (twoBox(0, 7) || twoBox(3, 8) || twoBox(3, 7)) { aiClick(6); } 
                else if (twoBox(5, 7) || twoBox(5, 6) || twoBox(2, 7)) { aiClick(8); } 
                else if (twoBox(0, 8) || twoBox(2, 6)) { aiClick(1); } 
                else { aiClick(2); }
            } else if (aiSteps === 2 || aiSteps === 3) { randomStep(); }
        }
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末悔雹,一起剝皮案震驚了整個濱河市苍在,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌荠商,老刑警劉巖寂恬,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異莱没,居然都是意外死亡初肉,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進(jìn)店門饰躲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來牙咏,“玉大人,你說我怎么就攤上這事嘹裂⊥” “怎么了?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵寄狼,是天一觀的道長丁寄。 經(jīng)常有香客問我,道長泊愧,這世上最難降的妖魔是什么伊磺? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮删咱,結(jié)果婚禮上屑埋,老公的妹妹穿的比我還像新娘。我一直安慰自己痰滋,他們只是感情好摘能,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布续崖。 她就那樣靜靜地躺著,像睡著了一般团搞。 火紅的嫁衣襯著肌膚如雪袜刷。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天莺丑,我揣著相機(jī)與錄音著蟹,去河邊找鬼。 笑死梢莽,一個胖子當(dāng)著我的面吹牛萧豆,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播昏名,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼涮雷,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了轻局?” 一聲冷哼從身側(cè)響起洪鸭,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎仑扑,沒想到半個月后览爵,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡镇饮,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年蜓竹,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片储藐。...
    茶點(diǎn)故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡俱济,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出钙勃,到底是詐尸還是另有隱情蛛碌,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布辖源,位于F島的核電站蔚携,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏同木。R本人自食惡果不足惜浮梢,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一跛十、第九天 我趴在偏房一處隱蔽的房頂上張望彤路。 院中可真熱鬧,春花似錦芥映、人聲如沸洲尊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽坞嘀。三九已至躯护,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間丽涩,已是汗流浹背棺滞。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留矢渊,地道東北人继准。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像矮男,于是被迫代替她去往敵國和親移必。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內(nèi)容