当前位置: 首页 > news >正文

HTML+CSS+JS井字棋(来自动下棋)

井字棋 自动下棋 玩家先下,计算机后下

源码在图片后面 点赞❤️收藏⭐️关注😍

效果图

f000b8afd29e4e218757a89d5857c675.jpg

 源代码

<!DOCTYPE html>

<html lang="en">

 

<head>

    <meta charset="UTF-8">

    <title>Tic Tac Toe Game</title>

    <style>

        body {

            font-family: Arial, sans-serif;

            display: flex;

            justify-content: center;

            align-items: center;

            height: 100vh;

            margin: 0;

            background-color: #f9f9f9;

        }

 

        #game-board {

            display: grid;

            grid-template-columns: repeat(3, 100px);

            grid-auto-rows: 100px;

            gap: 2px;

            margin-bottom: 20px;

            border: 4px solid #ff0000;

            border-radius: 10px;

        }

 

        .cell {

            display: flex;

            justify-content: center;

            align-items: center;

            background-color: #ffffff;

            color: #ff0000;

            font-size: 2em;

            cursor: pointer;

        }

 

        #reset-button {

            padding: 10px 20px;

            background-color: #ff0000;

            color: #ffffff;

            border: none;

            border-radius: 5px;

            cursor: pointer;

        }

    </style>

</head>

 

<body>

    <div id="game-board"></div>

    <button id="reset-button">重新开局</button>

 

    <script>

        const board = document.getElementById('game-board');

        const cells = [];

        let currentPlayer = 'X';

        let gameOver = false;

 

        // Initialize game board

        for (let i = 0; i < 9; i++) {

            const cell = document.createElement('div');

            cell.classList.add('cell');

            cell.dataset.index = i;

            cell.addEventListener('click', handleCellClick);

            board.appendChild(cell);

            cells.push(cell);

        }

 

        // Reset game

        document.getElementById('reset-button').addEventListener('click', resetGame);

 

        function handleCellClick() {

            if (!gameOver && this.innerText === '') {

                this.innerText = currentPlayer;

                checkWin();

                if (!gameOver) {

                    setTimeout(computerMove, 500);

                }

            }

        }

 

        function computerMove() {

            const emptyCells = cells.filter(cell => cell.innerText === '');

            const randomCell = emptyCells[Math.floor(Math.random() * emptyCells.length)];

            randomCell.innerText = 'O';

            checkWin();

        }

 

        function checkWin() {

            const winningCombos = [

                [0, 1, 2],

                [3, 4, 5],

                [6, 7, 8],

                [0, 3, 6],

                [1, 4, 7],

                [2, 5, 8],

                [0, 4, 8],

                [2, 4, 6]

            ];

 

            for (const combo of winningCombos) {

                const [a, b, c] = combo;

                if (cells[a].innerText && cells[a].innerText === cells[b].innerText && cells[a].innerText === cells[c].innerText) {

                    gameOver = true;

                    setTimeout(() => {

                        if (currentPlayer === 'X') {

                            alert('Player wins!');

                        } else {

                            alert('Computer wins!');

                        }

                    }, 200);

                    break;

                }

            }

 

            if (!cells.some(cell => cell.innerText === '')) {

                gameOver = true;

                setTimeout(() => {

                    alert('It\'s a draw!');

                }, 200);

            }

 

            currentPlayer = currentPlayer === 'X' ? 'O' : 'X';

        }

 

        function resetGame() {

            cells.forEach(cell => {

                cell.innerText = '';

            });

            currentPlayer = 'X';

            gameOver = false;

        }

    </script>

</body>

 

</html>

 

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 408数据结构-图的应用2-最短路径 自学知识点整理
  • RuntimeError: cuDNN error: CUDNN_STATUS_NOT_SUPPORTED.
  • 「Pytorch」roLabelImg 图像异常旋转 bug
  • 详解C#委托与事件
  • docker inspect 如何提取容器的ip和端口 网络信息?
  • 【JavaScript】聊一聊js中的浅拷贝与深拷贝与手写实现
  • 【vue教程】二. Vue特性原理详解
  • 漏洞挖掘 | EDU拿敏感信息的骚思路
  • 如何构建全生命周期的安全体系架构来确保容器的安全?
  • ARM功耗管理之功耗数据与功耗收益评估
  • FastAPI 学习之路(四十九)WebSockets(五)修复接口测试中的问题
  • ScrapySharp框架:小红书视频数据采集的API集成与应用
  • 使用Docker创建并运行一个create-react-app应用(超简单)
  • 新手-前端生态
  • Qt中https的使用,报错TLS initialization failed和不能打开ssl.lib问题解决
  • css选择器
  •  D - 粉碎叛乱F - 其他起义
  • echarts花样作死的坑
  • express.js的介绍及使用
  • Javascript弹出层-初探
  • leetcode388. Longest Absolute File Path
  • LintCode 31. partitionArray 数组划分
  • Material Design
  • React-redux的原理以及使用
  • Vue 重置组件到初始状态
  • 回顾 Swift 多平台移植进度 #2
  • 记录:CentOS7.2配置LNMP环境记录
  • const的用法,特别是用在函数前面与后面的区别
  • ​​​​​​​​​​​​​​汽车网络信息安全分析方法论
  • # 再次尝试 连接失败_无线WiFi无法连接到网络怎么办【解决方法】
  • #etcd#安装时出错
  • #pragma multi_compile #pragma shader_feature
  • #window11设置系统变量#
  • (02)Hive SQL编译成MapReduce任务的过程
  • (02)vite环境变量配置
  • (java)关于Thread的挂起和恢复
  • (k8s中)docker netty OOM问题记录
  • (附源码)springboot金融新闻信息服务系统 毕业设计651450
  • (剑指Offer)面试题34:丑数
  • (十)c52学习之旅-定时器实验
  • (十一)JAVA springboot ssm b2b2c多用户商城系统源码:服务网关Zuul高级篇
  • (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境
  • (学习日记)2024.03.25:UCOSIII第二十二节:系统启动流程详解
  • (原創) 如何刪除Windows Live Writer留在本機的文章? (Web) (Windows Live Writer)
  • (原創) 如何使用ISO C++讀寫BMP圖檔? (C/C++) (Image Processing)
  • (转)linux 命令大全
  • (转)VC++中ondraw在什么时候调用的
  • (转)项目管理杂谈-我所期望的新人
  • (转)总结使用Unity 3D优化游戏运行性能的经验
  • .Net Redis的秒杀Dome和异步执行
  • .NET 将多个程序集合并成单一程序集的 4+3 种方法
  • .NET/C# 使用反射调用含 ref 或 out 参数的方法
  • .net下的富文本编辑器FCKeditor的配置方法
  • .Net语言中的StringBuilder:入门到精通
  • /deep/和 >>>以及 ::v-deep 三者的区别