本文详解井字棋(Tic Tac Toe)中按钮点击后状态锁定、玩家交替标记(X/O)的核心实现,重点修复原始代码中因参数传递错误、事件绑定缺失及 DOM 引用混淆导致的“按钮无法锁定”问题。
本文详解井字棋(Tic Tac Toe)中按钮点击后状态锁定、玩家交替标记(X/O)的核心实现,重点修复原始代码中因参数传递错误、事件绑定缺失及 DOM 引用混淆导致的“按钮无法锁定”问题。
在开发井字棋游戏时,一个常见但关键的需求是:按钮一旦被点击,必须立即锁定(不可重复操作),同时更新显示内容(X 或 O),并切换当前玩家。原始代码试图通过 button.value = "true" 实现锁定,却因多个根本性错误而失效——最核心的问题在于:onclick="changeX('.but1')" 传入的是字符串选择器,而非 DOM 元素本身;函数内 but.value = "true" 实际是对字符串赋值,毫无效果。
应摒弃内联 onclick 和手动传参,改用现代 JavaScript 的事件监听机制,直接获取被点击的按钮元素:
let isPlayer1 = true; // 更语义化:true 表示 X 玩家,false 表示 O 玩家const buttons = document.querySelectorAll('.but');const handleButtonClick = (e) => {const button = e.target; // 直接获取触发事件的 button 元素// 检查是否已占用(使用 data-* 属性更规范,见下文建议)if (button.dataset.occupied !== 'true') {button.textContent = isPlayer1 ? 'X' : 'O';button.dataset.occupied = 'true'; // 推荐:用 data-attribute 标记状态isPlayer1 = !isPlayer1; // 简洁切换玩家}};buttons.forEach(btn => btn.addEventListener('click', handleButtonClick));
? 关键修正点说明:
HTML 结构简化(移除冗余 value="false" 和内联 JS):
<div class="container1"><button type="button" class="but" data-occupied="false">1</button><button type="button" class="but" data-occupied="false">2</button><button type="button" class="but" data-occupied="false">3</button><!-- ... 其余6个按钮 --></div>
CSS 合理复用(消除 9 个独立类名):
.but {font-size: 40px;height: 150px;width: 150px;background-color: transparent;border: 1px solid black;border-right: none;border-bottom: none;}/* 移除每行末尾按钮的右边界 */.but:nth-child(3n) {border-right: 0;}/* 移除最后一行按钮的下边界 */.but:nth-last-child(-n + 3) {border-bottom: 0;}
通过以上重构,按钮点击即锁定、玩家自动切换、代码简洁可维护——这才是健壮井字棋交互的基础。