HarmonyOS 小游戏《对战五子棋》开发第5篇-五子棋GameConstants常量与类型定义最佳实践

好的常量设计让代码自文档化------从GameConstants看类型定义的艺术

代码如下:

typescript 复制代码
/**
 * GameConstants.ets - 五子棋游戏常量与类型定义
 */

/** 棋盘尺寸 15x15 */
export const BOARD_SIZE: number = 15;

/** 空位 */
export const EMPTY: number = 0;

/** 黑棋 */
export const BLACK: number = 1;

/** 白棋 */
export const WHITE: number = 2;

/** AI难度等级 */
export enum Difficulty {
  EASY = 1,
  NORMAL = 2,
  HARD = 3
}

/** 游戏结果 */
export enum GameResult {
  PLAYING = 0,
  BLACK_WIN = 1,
  WHITE_WIN = 2,
  DRAW = 3
}

/** 落子位置 */
export class Move {
  row: number;
  col: number;

  constructor(row: number, col: number) {
    this.row = row;
    this.col = col;
  }
}

/** 获取对手棋色 */
export function getOpponent(player: number): number {
  return player === BLACK ? WHITE : BLACK;
}

/** 颜色名称 */
export function playerName(player: number): string {
  return player === BLACK ? '黑方' : '白方';
}

为什么需要独立的常量文件

在游戏开发中,"魔法数字"是代码质量的头号杀手。对比两种写法:

typescript 复制代码
// 差:到处是魔法数字
if (board[7][7] === 0) { ... }
if (count >= 5) return true;
this.currentPlayer = player === 1 ? 2 : 1;

// 好:语义清晰
if (board[7][7] === EMPTY) { ... }
if (count >= 5) return true;  // 5是五子棋的固有规则,可以接受
this.currentPlayer = player === BLACK ? WHITE : BLACK;

GameConstants完整解析

typescript 复制代码
export const BOARD_SIZE: number = 15;   // 15x15标准棋盘
export const EMPTY: number = 0;          // 空位
export const BLACK: number = 1;          // 黑棋
export const WHITE: number = 2;          // 白棋

为什么棋子用数字而不是字符串

  1. 性能:数字比较比字符串快
  2. 内存:number占用的内存远小于string
  3. 数组存储 :棋盘是number[][],用数字最自然
  4. 序列化:数字序列化/反序列化更简单

枚举设计

typescript 复制代码
export enum Difficulty {
  EASY = 1,
  NORMAL = 2,
  HARD = 3
}

export enum GameResult {
  PLAYING = 0,
  BLACK_WIN = 1,
  WHITE_WIN = 2,
  DRAW = 3
}

设计要点:

  • 枚举值从1开始(0留给"无"或默认状态)
  • GameResult.PLAYING = 0作为默认值
  • 枚举名用大写驼峰,语义明确

Move类

typescript 复制代码
export class Move {
  row: number;
  col: number;
  constructor(row: number, col: number) {
    this.row = row;
    this.col = col;
  }
}

Move是五子棋中最基础的数据结构------表示棋盘上的一个位置。用class而非interface是因为Move经常需要new Move(row, col)创建实例。

辅助函数

typescript 复制代码
export function getOpponent(player: number): number {
  return player === BLACK ? WHITE : BLACK;
}

export function playerName(player: number): string {
  return player === BLACK ? '黑方' : '白方';
}

这两个工具函数被多处复用:

  • getOpponent:引擎中切换玩家、AI中获取人类棋色
  • playerName:UI中显示当前玩家

常量设计的通用原则

1. 集中管理

所有游戏常量放在一个文件中,方便查找和修改:

typescript 复制代码
// 改棋盘大小只需改一处
export const BOARD_SIZE: number = 15;  // 改成19就是围棋棋盘

2. 命名清晰

  • BOARD_SIZE而非SIZE或BS
  • EMPTY而非EMPTY_CELL或NONE
  • BLACK/WHITE而非COLOR_BLACK/COLOR_WHITE

3. 语义分组

typescript 复制代码
// 棋盘相关
export const BOARD_SIZE = 15;
export const EMPTY = 0;

// 棋子相关
export const BLACK = 1;
export const WHITE = 2;

// 游戏状态
export enum GameResult { ... }

// AI相关
export enum Difficulty { ... }

AI评分常量

AIPlayer中定义了一套完整的评分常量:

typescript 复制代码
const SCORE_FIVE: number = 1000000;       // 五连
const SCORE_OPEN_FOUR: number = 100000;   // 活四
const SCORE_FOUR: number = 10000;         // 冲四
const SCORE_OPEN_THREE: number = 8000;    // 活三
const SCORE_THREE: number = 500;          // 眠三
const SCORE_OPEN_TWO: number = 400;       // 活二
const SCORE_TWO: number = 50;             // 眠二
const SCORE_ONE: number = 10;             // 单子

分值设计逻辑:

  • 五连 > 活四 > 冲四 > 活三 > 眠三 > 活二 > 眠二 > 单子
  • 相邻级别约10倍差距,确保高级棋型优先
  • 活四(100000)是冲四(10000)的10倍,因为活四必胜而冲四可防

总结

GameConstants虽然只有50行代码,但它奠定了整个项目的类型基础。好的常量设计能:

  1. 消除魔法数字,提高可读性
  2. 集中管理,方便修改
  3. 提供类型安全,减少bug
  4. 自文档化,降低理解成本

附:

相关推荐
用户861941772074144 分钟前
uni-app 的蓝牙 API 在鸿蒙上不生效?我写了个兼容层,让老代码零改动跑起来
harmonyos
HarmonyOS_SDK2 小时前
【HarmonyOS SDK Skills】挂载 Agent Skill,轻松跑通鸿蒙应用广告变现
harmonyos
闫东阳LordGalaxy3 小时前
给小艺装上数学能力:数易 App 接入智能体 FunctionComponent 与 A2A 双通路实战
harmonyos
Dream-Y.ocean4 小时前
鸿蒙PC平台逻控 PLC 编辑器适配实战:基于 Electron 壳方案的纯 JavaScript 梯形图编程与仿真引擎开发
javascript·编辑器·harmonyos
OH_TPC6 小时前
HarmonyOS APP开发---"好物清单"购物清单App,需要用到这个库
harmonyos
贾伟康8 小时前
【鸿蒙心迹】个人开发者上架复盘:备案、合规与审核指南没写透的细节
华为·harmonyos
不爱学英文的码字机器9 小时前
2026鸿蒙远程控制软件完全选购指南:从入门到精通选型攻略
华为·harmonyos
贾伟康1 天前
【共创稿事节】HarmonyOS 7.0 BindContentCover全屏模态:从接入到生产验证
性能优化·实战·harmonyos·arkts·arkui
KevinChaos1 天前
声音明信片实验室 03|HarmonyOS 7.0 音频空间化:双版本试听无缝切换
harmonyos
贾伟康1 天前
【共创稿事节】HarmonyOS 7.0 Menu菜单与上下文:从接入到生产验证
性能优化·实战·harmonyos·arkts·arkui