当前位置: 首页 > news >正文

面试题:使用class类来写工个五子棋

核心功能说明

  1. 类的结构

    • constructor:初始化画布、棋盘数据(15×15 网格)、当前玩家等。
    • drawBoard:绘制棋盘网格线。
    • drawPiece:根据落子位置绘制黑 / 白棋子。
    • initEvent:绑定鼠标点击事件,计算落子坐标并判断有效性。
    • checkWin:从当前落子位置向四个方向检查是否有 “五子连珠”。
  2. 实现逻辑

    • 棋盘使用二维数组board存储状态(0 为空,1 为黑棋,2 为白棋)。
    • 点击画布时,通过坐标计算落子位置,合法则更新数组并绘制棋子。
    • 每步落子后检查胜负,若满足条件则弹出提示。

<!DOCTYPE html>
<html><head><title>五子棋</title><style>canvas {border: 2px solid #333;}</style>
</head><body><canvas id="chessboard" width="500" height="500"></canvas><script>class Gomoku {constructor(canvasId, size = 15) {// 初始化画布和上下文this.canvas = document.getElementById(canvasId);this.ctx = this.canvas.getContext('2d');// 棋盘大小(15×15 格)this.size = size;// 格子尺寸(根据画布大小计算)this.cellSize = this.canvas.width / (this.size - 1);// 棋盘数据:0=空,1=黑棋,2=白棋this.board = Array.from({ length: size }, () => Array(size).fill(0));// 当前回合(1=黑棋先行)this.currentPlayer = 1;// 绑定事件this.initEvent();// 绘制棋盘this.drawBoard();}// 绘制棋盘网格drawBoard() {const { ctx, size, cellSize, canvas } = this;// 清空画布ctx.clearRect(0, 0, canvas.width, canvas.height);// 绘制横线和竖线for (let i = 0; i < size; i++) {// 横线ctx.beginPath();ctx.moveTo(0, i * cellSize);ctx.lineTo((size - 1) * cellSize, i * cellSize);ctx.stroke();// 竖线ctx.beginPath();ctx.moveTo(i * cellSize, 0);ctx.lineTo(i * cellSize, (size - 1) * cellSize);ctx.stroke();}}// 绘制棋子drawPiece(row, col) {const { ctx, cellSize, board } = this;const x = col * cellSize;const y = row * cellSize;const radius = cellSize / 2 - 2; // 棋子半径(略小于格子一半)ctx.beginPath();ctx.arc(x, y, radius, 0, Math.PI * 2);ctx.fillStyle = board[row][col] === 1 ? '#000' : '#fff';ctx.fill();ctx.strokeStyle = '#000'; // 棋子边框ctx.stroke();}// 初始化点击事件(落子)initEvent() {this.canvas.addEventListener('click', (e) => {const rect = this.canvas.getBoundingClientRect();// 计算点击位置对应的棋盘坐标(行、列)const col = Math.round((e.clientX - rect.left) / this.cellSize);const row = Math.round((e.clientY - rect.top) / this.cellSize);// 检查是否在棋盘范围内且位置为空if (row >= 0 && row < this.size && col >= 0 && col < this.size && this.board[row][col] === 0) {// 落子this.board[row][col] = this.currentPlayer;this.drawPiece(row, col);// 判断胜负if (this.checkWin(row, col)) {alert(`玩家${this.currentPlayer === 1 ? '黑' : '白'}获胜!`);return;}// 切换玩家this.currentPlayer = this.currentPlayer === 1 ? 2 : 1;}});}// 检查胜负(上下、左右、对角线四个方向)checkWin(row, col) {const { board, currentPlayer, size } = this;const directions = [[0, 1],  // 水平方向[1, 0],  // 垂直方向[1, 1],  // 右下对角线[1, -1]  // 左下对角线];for (const [dx, dy] of directions) {let count = 1; // 当前位置已有1个棋子// 正向检查for (let i = 1; i < 5; i++) {const r = row + i * dx;const c = col + i * dy;if (r >= 0 && r < size && c >= 0 && c < size && board[r][c] === currentPlayer) {count++;} else break;}// 反向检查for (let i = 1; i < 5; i++) {const r = row - i * dx;const c = col - i * dy;if (r >= 0 && r < size && c >= 0 && c < size && board[r][c] === currentPlayer) {count++;} else break;}// 五子连珠则获胜if (count >= 5) return true;}return false;}}// 初始化游戏new Gomoku('chessboard');</script>
</body></html>

http://www.dtcms.com/a/318273.html

相关文章:

  • spring-dubbo
  • Post-train 入门(1):SFT / DPO / Online RL 概念理解和分类
  • C++与C语言实现Stack的对比分析
  • sqli-labs通关笔记-第34关POST宽字符注入(单引号闭合 手工注入+脚本注入两种方法)
  • Verilog 仿真问题:打拍失败
  • FPGA学习笔记——VGA简介
  • Excel单元格设置下拉框、选项背景
  • 20250806给PRO-RK3566开发板在Buildroot系统下扩大rootfs分区2GB
  • 实习文档背诵
  • 解决Cloudflare人机验证加载异常:从常规排查到hosts配置优化
  • 【软件介绍】RVC本地部署使用方法
  • Linux基础命令详解手册
  • css怪异模式(Quirks Mode)和标准模式(Standards Mode)最明显的区别
  • 【CVPR2025】Mr.DETR: 通过多路线训练机制改进DETR,并进行“one to one”和“one to many”的预测
  • pytorch安装
  • ​​MCU程序的存储方式与存储区域大小要求​
  • c++ template in .h and .cpp
  • RocketMQ和Kafka一样有重平衡的问题吗?
  • 机器学习——朴素贝叶斯
  • Java面试题和答案大全
  • Web 端 AI 图像生成技术的应用与创新:虚拟背景与创意图像合成
  • Session 和 JWT(JSON Web Token)
  • [AI]从零开始的SDXL LORA训练教程
  • 机器视觉的智能手表贴合应用
  • Android 之 ViewBinding 实现更安全、高效的视图绑定
  • envFrom 是一个 列表类型字段bug
  • W3D引擎游戏开发----从入门到精通【22】
  • 《聚氨酯垫性能优化在超薄晶圆研磨中对 TTV 的保障技术》
  • 小实验--震动点灯
  • 昇思+昇腾开发板+DeepSeek模型推理和性能优化