我的编程空间,编程开发者的网络收藏夹
学习永远不晚

基于JS实现经典的井字棋游戏

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

基于JS实现经典的井字棋游戏

井字棋作为我们在上学时代必玩的一款连珠游戏,你知道如何做到先手必然不会输吗?今天我们就用HTML、css、js来实现一款井字棋游戏。

先看成品

游戏初始化界面:

玩家获胜

AI电脑获胜

思路

生成棋盘

  • 通过表格生成一个3*3的表格
  • 然后通过css属性隐藏部分边框实现井字棋盘

重新开始

  • 清空文本数列删除属性

玩家落子

  • 通过玩家点击获取id
  • 通过id将点击的表格块设置为O

电脑落子

  • 通过算法来实现电脑最适合的块id然后落子

代码

HTML

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8" />
        <meta http-equiv="X-UA-Compatible" content="IE=edge" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <title>井字棋</title>
        <link rel="stylesheet" href="css.css" rel="external nofollow"  />
    </head>
    <body>
        <table>
            <tr>
                <td class="cell" id="0"></td>
                <td class="cell" id="1"></td>
                <td class="cell" id="2"></td>
            </tr>
            <tr>
                <td class="cell" id="3"></td>
                <td class="cell" id="4"></td>
                <td class="cell" id="5"></td>
            </tr>
            <tr>
                <td class="cell" id="6"></td>
                <td class="cell" id="7"></td>
                <td class="cell" id="8"></td>
            </tr>
        </table>
        <div class="endgame">
            <div class="text"></div>
        </div>
        <button onclick="startGame()">重新开始</button>
        <script class="lazy" data-src="js.js"></script>
    </body>
</html>

CSS

* {
    margin: 0;
    padding: 0;
}
button {
    position: absolute;
    position: absolute;
    left: 50%;
    margin-left: -65px;
    top: 50px;
}
td {
    border: 2px solid #333;
    width: 100px;
    height: 100px;
    text-align: center;
    vertical-align: middle;
    font-family: '微软雅黑';
    font-style: italic;
    font-size: 70px;
    cursor: pointer;
}
table {
    
    position: absolute;
    left: 40%;
    top: 100px;
    border-collapse: collapse;
}

table tr:first-child td {
    border-top: 0;
}

table tr:last-child td {
    border-bottom: 0;
}

table tr td:first-child {
    border-left: 0;
}

table tr td:last-child {
    border-right: 0;
}

.endgame {
    display: none;
    width: 200px;
    height: 120px;
    background-color: rgba(205, 132, 65, 0.8);
    position: absolute;
    left: 40%;
    top: 180px;
    margin-left: 50px;
    text-align: center;
    border-radius: 5px;
    color: white;
    font-size: 2em;
}

js

var origBoard;
const huPlayer = 'O';
const aiPlayer = 'X';
const winCombos = [
    [0, 1, 2],
    [3, 4, 5],
    [6, 7, 8],
    [0, 3, 6],
    [1, 4, 7],
    [2, 5, 8],
    [0, 4, 8],
    [6, 4, 2]
]

const cells = document.querySelectorAll(".cell");
startGame();

function startGame () {
    document.querySelector(".endgame").style.display = "none";
    //设置阵列点  创建9个数组元素,元素的键0到8
    origBoard = Array.from(Array(9).keys());
    //	console.log(origBoard);
    for (var i = 0; i < cells.length; i++) {
        //把文本先设置为空
        cells[i].innerHTML = "";
        //删除属性知道已经有人赢了
        cells[i].style.removeProperty('background-color');
        //点击方块
        cells[i].addEventListener('click', turnClick, false);
    }
}

function turnClick (square) {
    //记住原来走过的方块
    if (typeof origBoard[square.target.id] == 'number') {
        //人类玩家点击
        turn(square.target.id, huPlayer);
        //由人类转向AI玩家
        if (!checkTie()) {
            //电脑玩家将棋子放到最合适的地方
            turn(bestStep(), aiPlayer);
        }
    }

}

function turn (squareId, player) {
    //这些id给玩家
    origBoard[squareId] = player;
    document.getElementById(squareId).innerHTML = player;
    //让游戏进行检查
    var gameWin = checkWin(origBoard, player);
    if (gameWin) {
        gameOver(gameWin);
    }
}
//判断胜利
function checkWin (board, player) {
    let plays = board.reduce((a, e, i) =>
        (e === player) ? a.concat(i) : a, [])
    let gameWin = null;
    //如果是属于之前winCombos胜利组合
    for (let [index, win] of winCombos.entries()) {
        if (win.every(Element => plays.indexOf(Element) > -1)) {
            //现在我们知道是哪一个组合胜利了
            gameWin = { index: index, player: player };
            break;
        }
    }
    return gameWin;
}

function gameOver (gameWin) {
    for (let index of winCombos[gameWin.index]) {
        //人类获胜则为蓝色
        document.getElementById(index).style.backgroundColor =
            gameWin.player == huPlayer ? "blue" : "red";
    }
    
    for (var i = 0; i < cells.length; i++) {
        cells[i].removeEventListener('click', turnClick, false);
    }
    declareWinner(gameWin.player == huPlayer ? "你赢了" : "你输了");
}

function emptySquares () {
    //过滤每一个元素,如果元素为number,返回所有方块
    return origBoard.filter(s => typeof s == 'number');
}


function bestStep () {
    //智能AI
    return minmax(origBoard, aiPlayer).index;
}
//检查是否是平局
function checkTie () {
    if (emptySquares().length == 0) {
        for (var i = 0; i < cells.length; i++) {
            cells[i].style.backgroundColor = "green";
            cells[i].removeEventListener('click', turnClick, false);
        }
        //谁获胜了
        // declareWinner("玩家获胜");
        return true;
    } else {
        //平局
        return false;
    }

}

function declareWinner (who) {
    document.querySelector(".endgame").style.display = 'block';
    document.querySelector(".endgame .text").innerHTML = who;
}

function minmax (newBoard, player) {
    //找到索引,空方块功能设置为a
    var availSpots = emptySquares(newBoard);

    if (checkWin(newBoard, player)) {
        return { score: -10 };
    } else if (checkWin(newBoard, aiPlayer)) {
        return { score: 20 };
    } else if (availSpots.length === 0) {
        return { score: 0 };
    }
    //之后进行评估
    var moves = [];
    //收集每个动作时的空白点
    for (var i = 0; i < availSpots.length; i++) {
        //然后设置空的索引号
        var move = {};
        move.index = newBoard[availSpots[i]];
        newBoard[availSpots[i]] = player;

        if (player == aiPlayer) {
            //存储对象,包括得分属性
            var result = minmax(newBoard, huPlayer);
            move.score = result.score;
        } else {
            //存储对象,包括得分属性
            var result = minmax(newBoard, aiPlayer);
            move.score = result.score;
        }

        newBoard[availSpots[i]] = move.index;

        moves.push(move);
    }
    var bestMove;
    //如果是AI玩家,以非常低的数字和循环通过
    if (player === aiPlayer) {
        var bestScore = -1000;
        for (var i = 0; i < moves.length; i++) {
            if (moves[i].score > bestScore) {
                bestScore = moves[i].score;
                bestMove = i;
            }
        }
    } else {
        var bestScore = 1000;
        for (var i = 0; i < moves.length; i++) {
            if (moves[i].score < bestScore) {
                bestScore = moves[i].score;
                bestMove = i;
            }
        }
    }

    return moves[bestMove];
}

以上就是基于JS实现经典的井字棋游戏的详细内容,更多关于JS井字棋的资料请关注编程网其它相关文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

基于JS实现经典的井字棋游戏

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

怎么用Python+Tkinter实现经典井字棋小游戏

这篇文章主要讲解了“怎么用Python+Tkinter实现经典井字棋小游戏”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么用Python+Tkinter实现经典井字棋小游戏”吧!演示介绍首
2023-06-29

C语言实现经典小游戏井字棋的示例代码

这个三子棋游戏是在学习C语言的过程中自己编写的一个小游戏,现在将自己的思路(主要以流程图形式和代码中的注释表达)和具体代码以及运行结果分享出来以供大家学习参考,希望对大家有所帮助
2022-11-13

python实现井字棋游戏

本文实例介绍了python实现井字棋游戏的方法,分享给大家,具体内容如下 windows7下python3.4.0编译运行通过。由于采用了cmd调用,所以与Linux不兼容,无法在Linux下运行。 游戏就是井字棋,小键盘上的数字位置对应棋
2022-06-04

基于Python制作简单的井字棋游戏

这篇文章主要为大家详细介绍了如何基于Python实现简单的井字棋游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
2023-05-18

基于WPF实现经典纸牌游戏

这篇文章主要为大家详细介绍了如何溧阳WPF实现经典纸牌游戏,文中的示例代码讲解详细,对我们学习WPF有一定的帮助,需要的可以参考一下
2023-02-27

纯CSS3实现井字棋游戏的示例

这篇文章给大家分享的是有关纯CSS3实现井字棋游戏的示例的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。运行效果:html
2023-06-08

React中井字棋游戏的实现示例

本文主要介绍了React中井字棋游戏的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2022-11-13

编程热搜

目录