讲师中心 微信公众号
AI工具推荐 视频效率加速

实现井字棋人机对战:自动执行电脑回合、更新游戏状态数组与玩家切换逻辑

雨芳同学_5581

雨芳同学_5581

发布时间:2026-02-12 13:34:44

|

1014人浏览过

|

来源于php中文网

原创

实现井字棋人机对战:自动执行电脑回合、更新游戏状态数组与玩家切换逻辑

本文详解如何在纯 javascript 井字棋中无缝集成“玩家 vs 电脑”模式,核心包括:随机决定先手、为电脑实现安全的随机落子(仅选空位)、自动更新游戏状态数组、精准在玩家与电脑间切换回合,并复用大部分 pvp 逻辑以保持代码简洁可维护。

在构建支持双模式(玩家对玩家 / 玩家对电脑)的井字棋时,关键挑战并非重写整套逻辑,而是以最小侵入方式扩展现有结构,让电脑回合成为“自动触发的玩家动作”,而非独立流程。以下方案摒弃冗余的 pvp()/pvc() 双函数架构,采用统一事件流 + 条件分支策略,显著提升可读性与可维护性。

电脑手机电子配件电子商城网站模板
电脑手机电子配件电子商城网站模板

电脑手机电子配件电子商城网站模板是一款提供手机、手表、电脑等电子配件和设备的电子商城宣传网站模板下载。提示:本模板调用到谷歌字体库,可能会出现页面打开比较缓慢。

下载

✅ 核心设计原则

  • 单入口、双路径:所有交互统一由 boxClick() 处理,通过 gameType 和 player 状态动态决定是响应用户点击,还是主动触发 AI 落子;
  • 状态驱动回合切换:使用 currentTurn 计数器精确控制胜负检测时机(第 5 步起校验),避免无效计算;
  • AI 即“自动玩家”:当轮到 O 且模式为 PvC 时,nextPlayer() 直接调用 boxClick(),并传入由 AImove() 生成的合法索引 —— 无需额外 DOM 操作或事件模拟;
  • 防御式编程:所有落子操作前强制校验目标位置为空,杜绝覆盖已有符号。

? 关键代码实现

// 统一初始化:重置棋盘、状态与计数器
function init() {
  boxs.forEach(box => {
    box.textContent = '';
    box.classList.remove('win');
    box.setAttribute('aria-disabled', 'false'); // 启用点击
  });
  options = ['', '', '', '', '', '', '', '', ''];
  running = true;
  isWon = false;
  currentTurn = 0;
  player = Math.random() > 0.5 ? 'X' : 'O'; // 随机先手
  statusTxt.textContent = `${player}'s turn!`;
}

// 主点击处理器:处理用户点击 或 AI 自动落子
function boxClick() {
  // 决定本次落子的索引:用户点击取 data-index,AI 则调用 AImove()
  const clickedCellIndex = (player === 'O' && gameType === 'Player v Computer') 
    ? AImove() 
    : this.dataset.index;

  // 安全校验:仅允许落子到空位
  if (options[clickedCellIndex] !== '' || !running) return;

  // 执行落子:更新 DOM、状态数组、禁用该格
  const clickedElement = document.querySelector(`.box[data-index="${clickedCellIndex}"]`);
  clickedElement.textContent = player;
  clickedElement.setAttribute('aria-disabled', 'true');
  options[clickedCellIndex] = player;

  // 第 5 步起检测胜负(优化性能)
  if (currentTurn >= 4) isWinner();

  // 未结束则进入下一回合
  if (currentTurn < 8 && !isWon) nextPlayer();
}

// AI 逻辑:返回一个随机空位索引
function AImove() {
  const unpickedCells = [];
  for (let i = 0; i < options.length; i++) {
    if (options[i] === '') unpickedCells.push(i);
  }
  // 若存在空位,返回随机索引;否则返回 0(防异常,实际不会触发)
  return unpickedCells.length > 0 
    ? unpickedCells[Math.floor(Math.random() * unpickedCells.length)] 
    : 0;
}

// 回合切换:更新玩家标识并触发下一轮
function nextPlayer() {
  player = (player === 'X') ? 'O' : 'X';
  currentTurn++;
  statusTxt.textContent = `${player}'s turn!`;

  // 关键:若轮到 O 且为 PvC 模式,则立即执行 AI 落子(不等待用户点击)
  if (player === 'O' && gameType === 'Player v Computer') {
    boxClick(); // 递归调用,但因索引由 AImove 提供,不依赖 this
  }
}

⚠️ 注意事项与最佳实践

  • textContent 替代 innerHTML:避免潜在 XSS 风险,且性能更优(无需 HTML 解析);
  • aria-disabled 控制交互:比 CSS pointer-events: none 更语义化,兼容屏幕阅读器;
  • 游戏模式校验前置:checkGameType() 中必须处理 null 选中状态,防止未选模式直接启动;
  • 避免全局变量污染:将 win 数组移至 isWinner() 内部作用域,为未来模块化铺路;
  • 计时器整合提示:原代码中的计时逻辑可无缝注入 nextPlayer() 开头或 boxClick() 结尾,无需修改主干。

? 总结

本方案将 PvC 模式转化为对现有 PvP 流程的轻量增强:电脑不是“另一个玩家”,而是当前玩家 O 的自动化代理。通过 AImove() 提供合法索引、nextPlayer() 触发自动回调、统一 boxClick() 处理落子,彻底消除了手动管理“谁该动”“何时动”的复杂状态机。代码行数减少约 40%,逻辑清晰度大幅提升,且完全满足需求:X/O 符号固定、先手随机、AI 仅选空位、回合无缝切换。后续如需升级 AI(如加入必胜判断),只需替换 AImove() 函数体,主体结构零修改。

相关文章

在线游戏
在线游戏

海量精品小游戏合集,无需安装即点即玩,休闲益智、动作闯关应有尽有,秒开即玩,轻松解压,快乐停不下来

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

讯飞智文

一款面向学习和办公场景的AI文档创作工具,可辅助生成PPT与Word文档,提高资料整理和内容制作效率。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

相关专题

更多
c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

549

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

1698

2024.03.01

全局变量怎么定义
全局变量怎么定义

本专题整合了全局变量相关内容,阅读专题下面的文章了解更多详细内容。

5105

2025.09.18

python 全局变量
python 全局变量

本专题整合了python中全局变量定义相关教程,阅读专题下面的文章了解更多详细内容。

2170

2025.09.18

c++ 全局变量
c++ 全局变量

本专题整合了c++全局变量的使用、定义、作用域等等内容,阅读专题下面的文章了解更多详细内容。

199

2026.03.17

DOM是什么意思
DOM是什么意思

dom的英文全称是documentobjectmodel,表示文件对象模型,是w3c组织推荐的处理可扩展置标语言的标准编程接口;dom是html文档的内存中对象表示,它提供了使用javascript与网页交互的方式。想了解更多的相关内容,可以阅读本专题下面的文章。

6541

2024.08.14

PHP 命令行脚本与自动化任务开发
PHP 命令行脚本与自动化任务开发

本专题系统讲解 PHP 在命令行环境(CLI)下的开发与应用,内容涵盖 PHP CLI 基础、参数解析、文件与目录操作、日志输出、异常处理,以及与 Linux 定时任务(Cron)的结合使用。通过实战示例,帮助开发者掌握使用 PHP 构建 自动化脚本、批处理工具与后台任务程序 的能力。

506

2025.12.13

Figma AI自动化智能数据填充与交互生成实战
Figma AI自动化智能数据填充与交互生成实战

告别机械重复,详细演示如何用 AI 填充业务真实数据,并自动为页面添加交互连线,将静态设计稿快速转变为动态原型。

345

2026.05.13

DBeaver怎么导入数据
DBeaver怎么导入数据

DBeaver数据导入专题,整理Excel、CSV、SQL、TXT等常见文件的数据导入方法,涵盖目标数据库选择、数据表创建、字段映射、数据类型设置及导入参数配置等操作,帮助用户将本地文件中的数据写入数据库,并了解批量导入、重复数据处理和导入失败等常见问题的解决方法。

20

2026.11.05

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Monica AI 基本功能操作教学
Monica AI 基本功能操作教学

共0课时 | 122人学习

稿定AI的偷懒用法分享!
稿定AI的偷懒用法分享!

共0课时 | 123人学习

腾讯元宝使用手册
腾讯元宝使用手册

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn