先来让Trae创建一个文件夹,避免跟其他游戏冲突
我们先了解一下,五子棋的游戏功能,避免ai生成的有问题,我们还不知道
游戏功能
- 标准15×15棋盘
- 黑白双方轮流落子(黑方先行)
- 胜负判定(横、竖、斜方向连成五子即获胜)
- 悔棋功能
- 重新开始游戏
- 响应式设计,适配不同屏幕尺寸
- 最后一手棋标记功能
然后是技术特点,要实现h5游戏,那肯定离不开canvas,看看最终的生成有没有用到
- 纯原生JavaScript实现,无需任何外部库
- 使用Canvas绘制棋盘和棋子
- 美观的UI设计,包括棋子阴影和渐变效果
- 响应式设计,适配不同屏幕尺寸
来看看Trae生成的文件夹目录,看来主要的功能是在script.js上面
- index.html - 游戏的HTML结构,包含游戏标题、玩家信息显示、棋盘画布、控制按钮和游戏规则说明
- style.css - 游戏的样式表,提供美观的界面设计和响应式布局
- script.js - 游戏的核心逻辑,实现了棋盘绘制、落子、胜负判断、悔棋等功能
- README.md - 项目说明文档,包含游戏功能、规则和使用方法
- server.js - 简单的Node.js服务器,用于在浏览器中预览游戏

生成的页面效果,看起来是不错的

还非常贴心的帮我们写好README.md文件,对新手用户非常非常友好
我们看看主要的js代码逻辑
1. 游戏常量与DOM元素
ini
// 游戏常量
const BOARD_SIZE = 15; // 15x15的棋盘
const CELL_SIZE = 40; // 每个格子的大小(像素)
const PIECE_RADIUS = CELL_SIZE / 2 - 2; // 棋子半径
// 获取DOM元素
const canvas = document.getElementById('board');
const ctx = canvas.getContext('2d');
代码开始定义了游戏的基本常量,包括棋盘大小、格子尺寸和棋子半径,然后获取了必要的DOM元素,为后续的游戏逻辑做准备。
2. 游戏状态管理
ini
let gameBoard = [];
let currentPlayer = 1;
let gameOver = false;
let moveHistory = [];
这部分定义了游戏的核心状态变量:
- gameBoard :二维数组,表示棋盘状态
- currentPlayer :当前玩家(1为黑棋,2为白棋)
- gameOver :游戏是否结束的标志
- moveHistory :记录每一步的历史,用于实现悔棋功能
3. 游戏初始化
scss
function initGame() {
// 初始化棋盘
gameBoard = Array(BOARD_SIZE).fill().map(() => Array(BOARD_SIZE).
fill(0));
// 重置游戏状态
currentPlayer = 1;
gameOver = false;
moveHistory = [];
// 更新UI
updatePlayerInfo();
updateStatus();
// 绘制棋盘
drawBoard();
// 隐藏胜利弹窗
winModal.classList.remove('show');
// 启用悔棋按钮
undoButton.disabled = true;
}
initGame 函数负责初始化游戏,包括创建空棋盘、重置游戏状态、更新UI和绘制棋盘。这个函数在游戏开始和重新开始时都会被调用。
4. 胜负判断,最核心的代码,可以看看
javascript
function checkWin(x, y, player) {
// 检查方向:水平、垂直、左上到右下、右上到左下
const directions = [
{ dx: 1, dy: 0 }, // 水平
{ dx: 0, dy: 1 }, // 垂直
{ dx: 1, dy: 1 }, // 左上到右下
{ dx: 1, dy: -1 } // 右上到左下
];
for (const direction of directions) {
let count = 1; // 当前位置已经有一个棋子
// 正向检查
count += countPieces(x, y, direction.dx, direction.dy, player);
// 反向检查
count += countPieces(x, y, -direction.dx, -direction.dy,
player);
// 如果连续5个或更多,则获胜
if (count >= 5) {
return true;
}
}
return false;
}
function countPieces(x, y, dx, dy, player) {
// 计算指定方向上连续相同棋子的数量
}
checkWin 和 countPieces 函数负责判断胜负,通过检查四个方向(水平、垂直、两个对角线)上的连续棋子数量来确定是否有玩家获胜。