新闻中心

解决井字棋游戏中的平局判断错误

2025-11-15
浏览次数:
返回列表

解决井字棋游戏中的平局判断错误

本文旨在解决J*aScript井字棋游戏中,当棋盘填满时,平局判断与胜负判断冲突的问题。我们将分析现有代码,找出问题根源,并提供修改后的代码示例,确保游戏在正确判断胜负后,才进行平局判断,从而避免错误地将胜利判定为平局。

问题分析

原代码中,checkWin() 函数和 draw() 函数是独立调用的,没有明确的先后顺序。这意味着即使 checkWin() 检测到胜利,draw() 函数仍然会执行,并可能错误地输出“Tie Game”。

解决方案

核心思路是:先判断输赢,再判断平局。

我们需要修改 checkWin() 函数,使其返回胜利者('X' 或 'O')或者 null(如果没有胜利者)。然后,在主循环中,先调用 checkWin(),如果返回了胜利者,则显示胜利信息;否则,再调用 draw() 函数判断是否平局。

修改后的代码

以下是修改后的 J*aScript 代码示例:

Visla Visla

AI视频生成器,快速轻松地将您的想法转化为视觉上令人惊叹的视频。

Visla 100 查看详情 Visla
const clear = document.getElementById("clear");
const message = document.querySelector('h2');
const allDiv = document.querySelectorAll('#board div');
const squares = Array.from(allDiv);
let player = 'O';
let gameActive = true; // 添加一个变量来跟踪游戏是否仍在进行

function board() {
    squares.forEach(function(e, i) {
        squares[i].onclick = () => {
            if (gameActive && squares[i].textContent === '') { // 只有在游戏进行中且格子为空时才允许落子
                squares[i].textContent = player = player === 'O' ? 'X' : 'O';
                squares[i].textContent === 'X' ? message.textContent = "It's O's turn" :
                    message.textContent = "It's X's turn";
                const winner = checkWin();
                if (winner) {
                    message.textContent = winner + ' Wins!';
                    gameActive = false; // 游戏结束
                } else if (isDraw()) {
                    message.textContent = 'Draw!';
                    gameActive = false; // 游戏结束
                }
            }
        }
    });
}
board();

function checkWin() {
    const winPatterns = [
        [0, 1, 2], [3, 4, 5], [6, 7, 8], // Rows
        [0, 3, 6], [1, 4, 7], [2, 5, 8], // Columns
        [0, 4, 8], [2, 4, 6]             // Diagonals
    ];

    for (let pattern of winPatterns) {
        const [a, b, c] = pattern;
        if (squares[a].textContent && squares[a].textContent === squares[b].textContent && squares[a].textContent === squares[c].textContent) {
            return squares[a].textContent; // 返回胜利者
        }
    }
    return null; // 没有胜利者
}

clear.onclick = () => {
    squares.forEach(function(e, i) {
        squares[i].textContent = '';
        squares[i].style.color = '';
    });
    message.textContent = "It's X's turn!"; // 重置消息
    player = 'O'; // 重置玩家
    gameActive = true; // 重置游戏状态
};

function isDraw() {
    return squares.every(square => square.textContent !== '');
}

代码解释:

  1. checkWin() 函数修改:
    • 不再直接修改 message.textContent。
    • 遍历所有可能的获胜组合。
    • 如果找到获胜者,返回 'X' 或 'O'。
    • 如果没有获胜者,返回 null。
  2. isDraw() 函数:
    • 如果所有格子都被填充,则返回 true,否则返回 false。
  3. 主循环修改:
    • 在每个格子的点击事件中,首先调用 checkWin()。
    • 如果 checkWin() 返回了胜利者,则显示胜利信息,并停止游戏。
    • 如果 checkWin() 没有返回胜利者,则调用 isDraw() 判断是否平局。
    • 如果 isDraw() 返回 true,则显示平局信息,并停止游戏。
  4. 添加 gameActive 变量:
    • 使用 gameActive 变量来跟踪游戏是否仍在进行。
    • 只有在游戏进行中且格子为空时才允许落子。
    • 当游戏结束(胜利或平局)时,将 gameActive 设置为 false。
    • 在 "Play Again" 按钮的点击事件中,将 gameActive 重置为 true。

HTML 和 CSS (无修改)

HTML 和 CSS 部分的代码保持不变,因为它们不影响游戏逻辑。

总结

通过修改 checkWin() 函数的返回值,并调整主循环中的判断逻辑,我们成功解决了井字棋游戏中平局判断与胜负判断冲突的问题。 现在,游戏可以正确地判断胜负,并在没有胜者的情况下,正确地判定为平局。 此外,通过添加 gameActive 变量,我们确保了游戏结束后,玩家不能再进行操作,直到点击 "Play Again" 按钮。

以上就是解决井字棋游戏中的平局判断错误的详细内容,更多请关注其它相关文章!


# 为空  # 钟祥seo优化视频  # 延庆网站建设费用明细  # SEM或者SEO  # seo简历职业技能  # 厦门网站建设的重要性  # 苏州专业的抖音seo  # 泸州seo培训  # 白云品牌网站建设引流  # 智能推广属于场景营销吗  # 推广营销方案100例  # 判断是否  # 背景色  # 复选框  # css  # 如何实现  # 正确地  # 时才  # 弹出  # 如果没有  # 游戏中  # 点击事件  # win  # ai  # go  # html  # java  # javascript 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: Gmail邮箱申请注册直达_Gmail邮箱免费注册PC版官网入口2025  Python中高效且防溢出的双曲正弦计算:基于对数空间的优化策略  Golang如何通过reflect获取匿名字段方法_Golang reflect匿名字段方法访问技巧  特斯拉自动驾驶房车计划曝光 原型车将于2027年亮相  在Qt QML中通过Python字典动态更新TextEdit内容的教程  修复二维数组索引越界异常:一维循环到二维坐标的正确映射  Angular Material 垂直步进器:实现底部到顶部排序的教程  Go语言中Map存储的结构体如何调用指针方法:深入解析与实践  win11如何加载ICC颜色配置文件 Win11校色文件安装与显示器色彩管理【指南】  在J*aScript中复现SciPy的B样条拟合与求值:关键考量  深入理解Google Cloud Datastore查询:祖先路径与数据一致性  html两个JS只运行一个怎么办_让双JS在html中都运行方法【技巧】  蛙漫限时开放最深处链接_蛙漫全站漫画会员同款秒开地址  win11开机启动修复循环怎么办 Win11无法进入系统高级启动解决方法【修复】  搜狗浏览器如何使用密码生成器创建强密码 搜狗浏览器内置密码安全工具  CSS实现侧边栏导航项全宽圆角悬停背景效果  Lar*el头像管理:图片缩放与旧文件删除的最佳实践  Win10如何清理注册表垃圾 Win10注册表维护与优化指南【慎用】  JUnit5/Mockito:优雅测试内部依赖与异常处理的实践  C#使用XPath查询节点时出错? 常见语法错误与调试技巧  PHP中获取MongoDB服务器运行时间(Uptime)的专业指南  Python Socket多播通信中指定源IP地址的实践指南  千牛数据看板网页版_千牛数据看板网页版访问方法  处理动态列数据:J*a ArrayList的正确初始化与字符累加教程  TikTok评论显示延迟如何处理 TikTok评论刷新优化方法  Win11蓝牙耳机断连怎么解决 Win11蓝牙设置重新配对与驱动更新【技巧】  C++如何使用AddressSanitizer(ASan)_C++调试工具中检测内存访问错误的利器  深入理解J*aScript Promise异步执行与微任务队列  c++中的std::forward_list和std::list有什么不同_c++ forward_list与list区别分析  win11怎么查看应用耗电情况 Win11电池设置查看应用能耗排行榜【优化】  c++ 获取系统当前时间 c++时间戳获取方法  我的世界官方游戏入口 我的世界官网平台直达链接  QQ网页版官方账号入口 QQ网页版网页版登录指南  KFC早餐时段怎么领特惠代码_KFC早餐订餐优惠代码获取与使用说明  晋江读书网页版在线登录 晋江读书电脑版官网  126邮箱账号注册 电脑版登录入口  React Hooks最佳实践:动态组件状态管理的组件化方案  Golang如何优雅处理error_Golang error处理最佳实践总结  哔哩哔哩忘记密码了怎么找回_哔哩哔哩密码找回方法  HTML空白字符处理机制:渲染、DOM与编码实践  J*aScript中在Map循环中检测并处理空数组元素  C++ vector二维数组定义_C++ vector of vector用法  Archive of Our Own官网直达 AO3最新可用地址一览  QQ邮箱官方登录入口_QQ邮箱网页版快捷使用平台  poki网页游戏推荐_poki免费游戏平台入口  微信群消息显示延迟如何解决 微信群消息刷新优化方法  蛙漫2日版入口 WAMAN2(日版)无删减漫画官网链接  浏览器打开即用 美图秀秀网页版入口  163邮箱官方主页登录 直达网易邮箱登录核心页面  Lar*el表单中优雅地处理“返回”按钮以规避验证:最佳实践指南 

搜索