0

0

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

碧海醫心

碧海醫心

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

|

934人浏览过

|

来源于php中文网

原创

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

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

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

一键职达
一键职达

AI全自动批量代投简历软件,自动浏览招聘网站从海量职位中用AI匹配职位并完成投递的全自动操作,真正实现'一键职达'的便捷体验。

下载

✅ 核心设计原则

  • 单入口、双路径:所有交互统一由 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 &#36923;&#36753;&#65306;&#36820;&#22238;&#19968;&#20010;&#38543;&#26426;&#31354;&#20301;&#32034;&#24341;
function AImove() {
  const unpickedCells = [];
  for (let i = 0; i < options.length; i++) {
    if (options[i] === '') unpickedCells.push(i);
  }
  // &#33509;&#23384;&#22312;&#31354;&#20301;&#65292;&#36820;&#22238;&#38543;&#26426;&#32034;&#24341;&#65307;&#21542;&#21017;&#36820;&#22238; 0&#65288;&#38450;&#24322;&#24120;&#65292;&#23454;&#38469;&#19981;&#20250;&#35302;&#21457;&#65289;
  return unpickedCells.length > 0 
    ? unpickedCells[Math.floor(Math.random() * unpickedCells.length)] 
    : 0;
}

// &#22238;&#21512;&#20999;&#25442;&#65306;&#26356;&#26032;&#29609;&#23478;&#26631;&#35782;&#24182;&#35302;&#21457;&#19979;&#19968;&#36718;
function nextPlayer() {
  player = (player === 'X') ? 'O' : 'X';
  currentTurn++;
  statusTxt.textContent = `${player}'s turn!`;

  // &#20851;&#38190;&#65306;&#33509;&#36718;&#21040; O &#19988;&#20026; PvC &#27169;&#24335;&#65292;&#21017;&#31435;&#21363;&#25191;&#34892; AI &#33853;&#23376;&#65288;&#19981;&#31561;&#24453;&#29992;&#25143;&#28857;&#20987;&#65289;
  if (player === 'O' && gameType === 'Player v Computer') {
    boxClick(); // &#36882;&#24402;&#35843;&#29992;&#65292;&#20294;&#22240;&#32034;&#24341;&#30001; AImove &#25552;&#20379;&#65292;&#19981;&#20381;&#36182; 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() 函数体,主体结构零修改。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

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

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

243

2023.09.22

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

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

705

2024.03.01

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

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

85

2025.09.18

python 全局变量
python 全局变量

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

101

2025.09.18

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

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

3633

2024.08.14

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

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

3633

2024.08.14

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

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

52

2025.12.13

2026春节习俗大全
2026春节习俗大全

本专题整合了2026春节习俗大全,阅读专题下面的文章了解更多详细内容。

54

2026.02.11

Yandex网页版官方入口使用指南_国际版与俄罗斯版访问方法解析
Yandex网页版官方入口使用指南_国际版与俄罗斯版访问方法解析

本专题全面整理了Yandex搜索引擎的官方入口信息,涵盖国际版与俄罗斯版官网访问方式、网页版直达入口及免登录使用说明,帮助用户快速、安全地进入Yandex官网,高效使用其搜索与相关服务。

154

2026.02.11

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Excel 教程
Excel 教程

共162课时 | 16.8万人学习

Go语言web开发--经典项目电子商城
Go语言web开发--经典项目电子商城

共23课时 | 1.3万人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号