JavaScript新手练习——井字棋

井字棋是一个很简单的游戏,通过穷举,我们轻易的记录井字棋所有可能的走法。因此我们的AI可以实现的能力是
【JavaScript新手练习——井字棋】先手:尽可能的赢棋
后手:保证不输棋,且在玩家出现失误的情况下赢棋
游戏基本功能
1.有一个下棋(落子)的函数
2.有一个判断胜负的函数
AI部分
穷举后,可知
作为先手,只要占下一个拐角,玩家在剩下的8个位置中,有7个是必输的。剩下的一种方式,也最多只是平手。
作为后手则更加简单,无论玩家怎么开局,只要AI走对了前两步棋,后面就只要专门拦住玩家的棋即可。
所以需要
1.根据玩家下子的情况,让AI下特定的位置(只需两步)。
2.有一个进攻函数来连成三子取得胜利,用于抓住玩家的失误或者防止玩家放水。有一个防守函数来拦住玩家的棋子,使之不能连成三子。
3.有一个随机下子函数来在要平局的情况下填满棋盘。
优先级:进攻>防守>随机
** 戳这里试用 **
部分JS代码:
棋盘数组,用于判断胜负和进攻防守函数。
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]]
判断胜负函数(棋子设置了自定义属性,只要任意一条线上拼接起来为"111"则代表连成一线,由于玩家不会赢,不需要判断玩家是否胜利)

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

进攻函数,防守函数
//"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下棋函数
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(); } } }

    推荐阅读