跳棋游戏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
相关产品推荐
相关产品推荐

