You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NodeJS开发后端计算走法的国际象棋应用问题咨询

Node.js 国际象棋人机对战实现方案

前后端核心交互逻辑

整套流程不需要复杂设计,前后端职责划清楚就不会乱:

  • 前端仅负责:棋盘渲染、接收用户拖拽落子操作、落子合法性预校验、和后端通信同步走法、收到后端返回的AI走法后更新棋盘
  • 后端仅负责:按用户会话隔离维护棋局状态、最终校验用户走法合法性、生成AI走法、返回最新棋局状态
  • 棋局最终状态以后端存储为准,前端仅做交互层的临时校验,避免前端数据被篡改导致状态异常。

chess.js 集成方法

chess.js是专门处理国际象棋规则校验、合法走法生成的依赖,前后端都需要用到,集成步骤很简单:

  1. 后端集成
    在Node.js项目根目录执行安装命令:
    npm install chess.js
    后端不需要额外配置,直接在路由逻辑中引入即可,注意多用户场景必须按会话ID单独存储棋局实例,禁止使用全局实例,否则会出现不同用户棋局串线的问题,初始化参考:
const express = require('express')
const session = require('express-session')
const { Chess } = require('chess.js')
const app = express()
// 会话存储,key为会话ID,value为对应棋局的Chess实例
const gameSessions = new Map()

app.use(express.static('public'))
app.use(express.urlencoded({ extended: true }))
app.use(session({ secret: 'your-secret-key', resave: false, saveUninitialized: true }))
app.set('view engine', 'ejs')

// 首页初始化棋局
app.get('/', (req, res) => {
  const game = new Chess()
  gameSessions.set(req.sessionID, game)
  res.render('index')
})
  1. 前端集成
    直接下载chess.js的浏览器运行版本,放到你项目的静态资源js目录下,和chessboardjs、jquery放在同级即可,在EJS模板中直接引入,不需要额外构建工具:
<script src="js/chess.min.js"></script>

前端的Chess实例仅做交互层临时校验,不需要长期存储状态,每次同步后端返回的FEN棋局串即可。

随机走法版本最小实现

你现有EJS模板只需要在棋盘div下方加一个状态显示容器即可,其他结构不用改动:

<div id="board" style="width: 400px"></div>
<div id="status" style="margin-top: 10px"></div>

首先替换你原来的board.js内容,不要直接用纯前端的官方示例,要加上和后端通信的逻辑:

let board = null
const game = new Chess()

// 棋盘初始化配置
const boardConfig = {
  draggable: true,
  position: 'start',
  onDragStart: handleDragStart,
  onDrop: handleDrop,
  onSnapEnd: () => board.position(game.fen())
}
board = Chessboard('board', boardConfig)
updateStatus()

// 拖拽开始校验:游戏未结束、拖拽的是当前行棋方的棋子
function handleDragStart(source, piece) {
  if (game.isGameOver()) return false
  const isWhiteTurn = game.turn() === 'w'
  if ((isWhiteTurn && piece.startsWith('b')) || (!isWhiteTurn && piece.startsWith('w'))) {
    return false
  }
}

// 落子处理
function handleDrop(source, target) {
  // 前端预校验走法合法性,升变默认选后
  const playerMove = game.move({ from: source, to: target, promotion: 'q' })
  if (!playerMove) return 'snapback' // 非法走法将棋子归位

  // 合法走法发送给后端
  $.post('/player-move', { from: source, to: target, promotion: 'q' }, (res) => {
    if (res.error) {
      game.undo()
      board.position(game.fen())
      return
    }
    // 同步AI走法
    if (res.aiMove) {
      game.move(res.aiMove)
      board.position(game.fen())
    }
    updateStatus()
  })
}

// 更新行棋状态提示
function updateStatus() {
  let statusText = ''
  const moveColor = game.turn() === 'w' ? '白方' : '黑方'
  if (game.isCheckmate()) {
    statusText = `游戏结束,${moveColor}被将死`
  } else if (game.isDraw()) {
    statusText = '游戏结束,双方平局'
  } else {
    statusText = `${moveColor}行棋`
    if (game.inCheck()) statusText += ',当前处于将军状态'
  }
  $('#status').text(statusText)
}

然后补上后端的走法处理接口,随机走法直接调用chess.js内置的moves()方法获取所有合法走法,随机选一个返回即可:

app.post('/player-move', (req, res) => {
  const game = gameSessions.get(req.sessionID)
  if (!game) return res.json({ error: '会话不存在' })

  // 后端二次校验玩家走法合法性
  const validMove = game.move({
    from: req.body.from,
    to: req.body.to,
    promotion: req.body.promotion || 'q'
  })
  if (!validMove) return res.json({ error: '非法走法' })

  // 玩家走子后游戏结束则直接返回
  if (game.isGameOver()) {
    return res.json({ gameOver: true, fen: game.fen() })
  }

  // 生成随机合法走法作为AI走法
  const allLegalMoves = game.moves()
  const randomMove = allLegalMoves[Math.floor(Math.random() * allLegalMoves.length)]
  game.move(randomMove)

  return res.json({
    aiMove: randomMove,
    fen: game.fen(),
    gameOver: game.isGameOver()
  })
})

app.listen(3000, () => console.log('服务运行在3000端口'))

后续优化提示

  • 先确认所有静态资源路径配置正确,chessboardjs的css、js,jquery、chess.min.js都要放在Express设置的静态资源目录下,否则会出现404导致棋盘无法交互
  • 跑通随机走法流程后,如果要替换成更强的AI,只需要修改后端随机选走法的逻辑,换成极小极大算法、Alpha-Beta剪枝之类的走法评估逻辑即可,前端交互层代码完全不需要改动
  • 如果需要支持升变选子、悔棋、对局记录等功能,直接调用chess.js对应的内置方法即可,不需要自己写规则判断。

内容的提问来源于stack exchange,提问作者jason green

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 12:54:27