新闻中心
使用J*aScript构建互动式井字棋游戏:点击事件与游戏逻辑实现

本教程将指导您如何使用j*ascript、html和css构建一个互动式井字棋游戏。我们将详细讲解如何通过监听dom元素的点击事件来放置玩家标记('x'或'o'),如何管理当前玩家状态以实现轮流出子,以及如何实现游戏重置功能。通过具体代码示例,您将学会构建一个功能完善、用户友好的井字棋应用。
井字棋(Tic-Tac-Toe)是一个经典的两人对弈游戏,常被用作前端交互开发的入门项目。本教程将引导您使用纯粹的J*aScript、HTML和CSS从零开始构建一个互动式的井字棋游戏,重点讲解如何处理用户点击事件、实现玩家轮流出子以及游戏重置功能。
1. HTML 结构:构建游戏棋盘
首先,我们需要为井字棋游戏创建一个基本的HTML结构。棋盘将由一个包含九个方格的网格组成,并配备一个重置按钮。
<body>
<div id="board">
<div class="row">
<div class="square"></div>
<div class="square"></div>
<div class="square"></div>
</div>
<div class="row">
<div class="square"></div>
<div class="square"></div>
<div class="square"></div>
</div>
<div class="row">
<div class="square"></div>
<div class="square"></div>
<div class="square"></div>
</div>
<button id="reset-btn">重置游戏</button>
</div>
</body>结构说明:
- #board 作为整个棋盘的容器。
- .row 用于组织每行三个方格。
- .square 代表棋盘上的每个可点击方格。
- #reset-btn 用于清除棋盘并重新开始游戏。
2. CSS 样式:美化棋盘外观
为了让棋盘在浏览器中正确显示并具有良好的用户体验,我们需要添加一些CSS样式。这包括设置棋盘布局、方格大小、边框以及鼠标悬停效果。
#board {
margin: 0 auto; /* 棋盘居中 */
width: 50%;
max-width: 300px; /* 限制棋盘最大宽度 */
}
.row {
display: grid;
grid-template-columns: repeat(3, 1fr); /* 创建3列等宽网格 */
}
.square {
border: 1px solid black;
padding: 1rem;
cursor: pointer; /* 鼠标悬停时显示手型 */
text-align: center;
aspect-ratio: 1/1; /* 保持方格宽高比为1:1 */
display: flex;
align-items: center;
justify-content: center;
font-size: 2em; /* 增加标记字体大小 */
font-weight: bold;
}
.square:hover {
background-color: #CCCCCC; /* 鼠标悬停背景色变化 */
}
#reset-btn {
display: block; /* 使按钮独占一行 */
margin: 20px auto 0; /* 按钮居中,上方留白 */
padding: 10px 20px;
font-size: 1.2em;
cursor: pointer;
}样式说明:
- display: grid 和 grid-template-columns: repeat(3, 1fr) 用于创建3x3的网格布局。
- aspect-ratio: 1/1 确保每个方格都是正方形。
- display: flex 结合 align-items 和 justify-content 可以使 'X' 和 'O' 在方格中居中显示。
3. J*aScript 核心逻辑:实现游戏交互
这是实现井字棋游戏功能的核心部分。我们将使用J*aScript来处理用户点击、切换玩家标记以及重置游戏状态。
独响
一个轻笔记+角色扮演的app
249
查看详情
window.onload = () => {
// 获取所有棋盘方格元素
const squares = document.querySelectorAll(".square");
// 获取重置按钮元素
const resetButton = document.querySelector('#reset-btn');
// 初始化当前玩家为 'X'
let currentPlayer = "X";
// 为每个方格添加点击事件监听器
squares.forEach(square => {
square.addEventListener("click", () => {
// 只有当方格为空时才允许放置标记
if (square.innerHTML === "") {
square.innerHTML = currentPlayer; // 放置当前玩家的标记
// 切换当前玩家:如果当前是 'X' 则变为 'O',否则变为 'X'
currentPlayer = currentPlayer === "X" ? "O" : "X";
}
});
});
// 为重置按钮添加点击事件监听器
resetButton.addEventListener('click', () => {
// 遍历所有方格,清空其内容
squares.forEach(square => {
square.innerHTML = "";
});
// 重置当前玩家为 'X',确保新游戏从 'X' 开始
currentPlayer = "X";
});
};代码解析:
- window.onload: 确保在DOM完全加载后执行J*aScript代码,避免因元素未加载而导致的错误。
- document.querySelectorAll(".square"): 这个方法会返回一个NodeList(类似数组),其中包含了所有匹配 .square 选择器的DOM元素。由于 addEventListener 只能应用于单个DOM元素,因此我们需要遍历这个NodeList。
- let currentPlayer = "X";: 初始化一个变量来跟踪当前应该落子的玩家,默认为 'X'。
- squares.forEach(square => { ... });: 使用 forEach 循环遍历每一个方格,并为它们各自添加一个 click 事件监听器。
-
点击事件处理逻辑:
- if (square.innerHTML === ""): 这是一个关键的检查,确保玩家只能在空白的方格上落子,防止重复点击同一方格。
- square.innerHTML = currentPlayer;: 将当前玩家的标记('X' 或 'O')放置到被点击的方格中。
- currentPlayer = currentPlayer === "X" ? "O" : "X";: 使用三元运算符简洁地切换当前玩家。
- 重置功能: 当重置按钮被点击时,遍历所有方格并将其 innerHTML 清空,同时将 currentPlayer 重置回 'X',使游戏回到初始状态。
4. 完整代码示例
为了方便测试,您可以将上述HTML、CSS和J*aScript代码整合到一个文件中(例如 index.html)。
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>J*aScript井字棋游戏</title>
<style>
/* CSS样式代码 */
#board {
margin: 0 auto;
width: 50%;
max-width: 300px;
}
.row {
display: grid;
grid-template-columns: repeat(3, 1fr);
}
.square {
border: 1px solid black;
padding: 1rem;
cursor: pointer;
text-align: center;
aspect-ratio: 1/1;
display: flex;
align-items: center;
justify-content: center;
font-size: 2em;
font-weight: bold;
}
.square:hover {
background-color: #CCCCCC;
}
#reset-btn {
display: block;
margin: 20px auto 0;
padding: 10px 20px;
font
-size: 1.2em;
cursor: pointer;
}
</style>
</head>
<body>
<div id="board">
<div class="row">
<div class="square"></div>
<div class="square"></div>
<div class="square"></div>
</div>
<div class="row">
<div class="square"></div>
<div class="square"></div>
<div class="square"></div>
</div>
<div class="row">
<div class="square"></div>
<div class="square"></div>
<div class="square"></div>
</div>
<button id="reset-btn">重置游戏</button>
</div>
<script>
// J*aScript代码
window.onload = () => {
const squares = document.querySelectorAll(".square");
const resetButton = document.querySelector('#reset-btn');
let currentPlayer = "X";
squares.forEach(square => {
square.addEventListener("click", () => {
if (square.innerHTML === "") {
square.innerHTML = currentPlayer;
currentPlayer = currentPlayer === "X" ? "O" : "X";
}
});
});
resetButton.addEventListener('click', () => {
squares.forEach(square => {
square.innerHTML = "";
});
currentPlayer = "X"; // 重置当前玩家
});
};
</script>
</body>
</html>总结与展望
通过本教程,您已经成功地使用J*aScript、HTML和CSS实现了一个基础的互动式井字棋游戏。我们学习了如何处理DOM事件、管理游戏状态以及实现用户交互。这个项目是理解前端开发中事件处理和DOM操作的良好起点。
未来可扩展性:
- 胜负判断: 增加逻辑来判断是否有玩家获胜(三子连珠)或游戏是否平局。
- 游戏状态显示: 在界面上显示当前是 'X' 还是 'O' 的回合,以及胜负结果。
- AI 对战: 实现一个简单的AI玩家,让用户可以与电脑对战。
- 动画效果: 添加CSS动画,使 'X' 和 'O' 的出现更加生动。
掌握这些基础知识,将为构建更复杂的前端应用打下坚实的基础。
以上就是使用J*aScript构建互动式井字棋游戏:点击事件与游戏逻辑实现的详细内容,更多请关注其它相关文章!
# 衡阳网站建设知识分享
# 背景色
# 构建一个
# 选择器
# 对战
# 如何处理
# 清空
# 卖房子营销推广文案简短
# 亚马逊运营和海外seo
# 两种
# 邵阳有实力营销推广方式
# 渭南网站建设开发
# SEO排名赚骗子
# 上海网站优化6
# 兰州网站开发建设
# 陕西抖音营销推广教程
# 长安电子网站优化方法
# css
# 鼠标
# 运算符
# 遍历
# cs
# css动画
# win
# ai
# 前端开发
# 电脑
# 浏览器
# node
# 前端
# html
# java
# javascript
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
Yandex搜索引擎官网入口_俄罗斯Yandex免登录一键直达
163邮箱注册官网 免费申请163个人邮箱
夸克浏览器图书入口 夸克手机浏览器阅读入口
LINUX下如何进行磁盘分区_fdisk与parted工具在LINUX中的使用对比
蛙漫官网漫画入口地址_蛙漫在线畅读无广告弹窗
192.168.1.1管理中心入口 192.168.1.1路由器网页设置平台
React Router 嵌套组件中 URL 重定向问题的解决方案
c++中为什么推荐使用using替代typedef_c++现代化类型别名
优化 Python 函数中的条件逻辑:解决 if-else 嵌套与参数选择问题
J*aScript Promise链中如何正确终止后续.then执行并处理错误
Angular Material 垂直步进器:实现底部到顶部排序的教程
在哪找SublimeJ远程工具_SFTP插件配置教程
QQ邮箱官网登录入口 QQ邮箱网页版邮箱快速登录
J*a如何使用AtomicInteger控制计数_J*a无锁计数器性能分析
学习通网页版官方登录 超星学习通电脑端入口指南
拼多多视频播放卡顿如何处理 拼多多视频播放优化技巧
C++如何进行游戏物理模拟_使用Box2D库为C++游戏添加2D物理效果
荒野行动PC版怎么注册_荒野行动PC版账号注册详细流程图文教程
手机CPU怎么影响游戏体验_手机CPU对游戏性能的影响分析
Yandex官网免登录入口_俄罗斯Yandex搜索引擎一键访问
哔哩哔哩忘记密码了怎么找回_哔哩哔哩密码找回方法
CSS Flexbox与媒体查询:实现响应式布局中元素的并排与堆叠
Excel函数批量查找替换超快方法_Excel用REPLACE和FIND函数秒级替换
MAC怎么让Dock栏只显示当前运行的应用_MAC终端命令实现极简Dock栏
Angular中单选按钮的正确使用与常见陷阱解析
解决 Vaadin 8 中大文件音频播放与定位时出现的 IOException
响应式图片在网页设计中的正确实现方法
如何在 Windows 11 中启动游戏手柄设置
Excel Power Pivot如何处理XML数据源 构建高级数据模型
UE5.7引擎表现爆炸优化无敌!5090跑4K稳定60FPS
红果短剧网页版官网入口 官方最新网址发布
Win11 USB传输速度慢怎么解决 Win11 USB驱动更新与设置
C++如何使用AddressSanitizer(ASan)_C++调试工具中检测内存访问错误的利器
树莓派传感器触发:通过Twilio API发送WhatsApp消息教程
QQ邮箱登录首页官网地址2026 QQ邮箱官方网页入口
Python多线程中正确使用sigwait处理SIGALRM信号
绝地鸭卫平a核爆刀流玩法攻略
抓大鹅解压小游戏 抓大鹅摸鱼解压入口
想当下一个《2077》?《心之眼》Steam评价升至"多半好评"
cad如何更改注释性对象的比例_cad注释性比例调整方法
AO3最新镜像入口 Archive of Our Own官方平台访问
漫蛙manwa2最新登录网址_漫蛙manwa2手机网页版入口
京东京造J1和网易云音乐氧气真无线有什么不同_国产电商蓝牙耳机音质对比
J*aScript井字棋(Tic-Tac-Toe)核心交互逻辑实现教程
在命令行怎么运行html项目_命令行运行html项目方法【教程】
c++中的std::basic_string的SSO优化_c++短字符串优化深度解析
新手怎么开始学化妆 零基础化妆入门教程
163邮箱官方主页登录 直达网易邮箱登录核心页面
高德地图家和公司地址在哪设置 高德地图通勤路线设置方法【超详细】
微博网页版怎么开启两步验证_微博网页版账号安全两步验证设置方法


2025-12-03
浏览次数:次
返回列表
-size: 1.2em;
cursor: pointer;
}
</style>
</head>
<body>
<div id="board">
<div class="row">
<div class="square"></div>
<div class="square"></div>
<div class="square"></div>
</div>
<div class="row">
<div class="square"></div>
<div class="square"></div>
<div class="square"></div>
</div>
<div class="row">
<div class="square"></div>
<div class="square"></div>
<div class="square"></div>
</div>
<button id="reset-btn">重置游戏</button>
</div>
<script>
// J*aScript代码
window.onload = () => {
const squares = document.querySelectorAll(".square");
const resetButton = document.querySelector('#reset-btn');
let currentPlayer = "X";
squares.forEach(square => {
square.addEventListener("click", () => {
if (square.innerHTML === "") {
square.innerHTML = currentPlayer;
currentPlayer = currentPlayer === "X" ? "O" : "X";
}
});
});
resetButton.addEventListener('click', () => {
squares.forEach(square => {
square.innerHTML = "";
});
currentPlayer = "X"; // 重置当前玩家
});
};
</script>
</body>
</html>