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

跳棋游戏Board类:如何在外部onRestart函数调用initializeBoard重启棋盘

如何跨文件调用TypeScript Board类的方法实现跳棋棋盘重启

要实现跨文件调用Board类的方法完成棋盘重启,核心是通过模块化导出/导入类,并补充棋盘状态重置的逻辑(原initializeBoard仅负责渲染,未重置内部数据),具体步骤如下:


1. 修改Board类:导出类并补充重置逻辑

首先将Board类导出,同时抽离初始棋盘布局、添加状态重置方法,避免直接引用导致的状态污染:

// board.ts 文件
export class Board{
  private board: number[][];
  // 抽离初始棋盘布局为静态常量,方便复用
  private static readonly INITIAL_BOARD = [
    [1, 0, 1, 0, 1, 0, 1, 0],
    [0, 1, 0, 1, 0, 1, 0, 1],
    [1, 0, 1, 0, 1, 0, 1, 0],
    [0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0],
    [0, 2, 0, 2, 0, 2, 0, 2],
    [2, 0, 2, 0, 2, 0, 2, 0],
    [0, 2, 0, 2, 0, 2, 0, 2]
  ];

  constructor(){
    this.board = this.getInitialBoard();
    this.initializeBoard(); // 构造时自动完成初始渲染
  }

  // 深拷贝初始棋盘,避免引用类型导致的状态污染
  private getInitialBoard(): number[][] {
    return Board.INITIAL_BOARD.map(row => [...row]);
  }

  // 重置棋盘到初始状态并重新渲染
  resetBoard() {
    this.board = this.getInitialBoard();
    this.initializeBoard();
  }

  initializeBoard() {
    // 可选:先清空所有格子,避免残留旧棋子
    // for (let i = 0; i < this.board.length; i++) {
    //   for (let j = 0; j < this.board[i].length; j++) {
    //     setTile(i, j, "empty");
    //   }
    // }

    for (let i = 0; i < this.board.length; i++) {
      for (let j = 0; j < this.board[i].length; j++) {
        const cellvalue = this.board[i][j];
        if (cellvalue === 2) {
          setTile(i, j, "red pawn");
        } else if (cellvalue === 1) {
          setTile(i, j, "blue pawn");
        }
      }
    }
    setTile(0, 0, "blue queen");
    setTile(7, 7, "red queen");
  }
}

2. 在目标文件中实现onRestart函数

在另一个文件中导入Board类,创建实例后调用resetBoard方法完成重启:

// game.ts 文件
import { Board } from './board';

// 创建全局唯一的棋盘实例(避免重复创建多个棋盘)
const gameBoard = new Board();

export function onRestart() {
  // 调用重置方法,恢复初始布局
  gameBoard.resetBoard();
}

可选优化:单例模式

如果整个应用仅需一个棋盘实例,可以改用单例模式,确保全局唯一:

// board.ts 文件
export class Board{
  private static instance: Board;
  private board: number[][];
  private static readonly INITIAL_BOARD = [...]; // 同前文初始布局

  // 私有构造函数,禁止外部直接new
  private constructor(){
    this.board = this.getInitialBoard();
    this.initializeBoard();
  }

  // 获取全局唯一实例
  public static getInstance(): Board {
    if (!Board.instance) {
      Board.instance = new Board();
    }
    return Board.instance;
  }

  // 其他方法(getInitialBoard、resetBoard、initializeBoard)同前文
}

此时onRestart函数可简化为:

import { Board } from './board';

export function onRestart() {
  Board.getInstance().resetBoard();
}

内容的提问来源于stack exchange,提问作者Andrea Diaz-Merry

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 07:35:09