HarmonyOS 小游戏《对战五子棋》开发第5篇-五子棋GameConstants常量与类型定义最佳实践 好的常量设计让代码自文档化——从GameConstants看类型定义的艺术代码如下/** * GameConstants.ets - 五子棋游戏常量与类型定义 *//** 棋盘尺寸 15x15 */exportconstBOARD_SIZE:number15;/** 空位 */exportconstEMPTY:number0;/** 黑棋 */exportconstBLACK:number1;/** 白棋 */exportconstWHITE:number2;/** AI难度等级 */exportenumDifficulty{EASY1,NORMAL2,HARD3}/** 游戏结果 */exportenumGameResult{PLAYING0,BLACK_WIN1,WHITE_WIN2,DRAW3}/** 落子位置 */exportclassMove{row:number;col:number;constructor(row:number,col:number){this.rowrow;this.colcol;}}/** 获取对手棋色 */exportfunctiongetOpponent(player:number):number{returnplayerBLACK?WHITE:BLACK;}/** 颜色名称 */exportfunctionplayerName(player:number):string{returnplayerBLACK?黑方:白方;}为什么需要独立的常量文件在游戏开发中魔法数字是代码质量的头号杀手。对比两种写法// 差到处是魔法数字if(board[7][7]0){...}if(count5)returntrue;this.currentPlayerplayer1?2:1;// 好语义清晰if(board[7][7]EMPTY){...}if(count5)returntrue;// 5是五子棋的固有规则可以接受this.currentPlayerplayerBLACK?WHITE:BLACK;GameConstants完整解析exportconstBOARD_SIZE:number15;// 15x15标准棋盘exportconstEMPTY:number0;// 空位exportconstBLACK:number1;// 黑棋exportconstWHITE:number2;// 白棋为什么棋子用数字而不是字符串性能数字比较比字符串快内存number占用的内存远小于string数组存储棋盘是number[][]用数字最自然序列化数字序列化/反序列化更简单枚举设计exportenumDifficulty{EASY1,NORMAL2,HARD3}exportenumGameResult{PLAYING0,BLACK_WIN1,WHITE_WIN2,DRAW3}设计要点枚举值从1开始0留给无或默认状态GameResult.PLAYING 0作为默认值枚举名用大写驼峰语义明确Move类exportclassMove{row:number;col:number;constructor(row:number,col:number){this.rowrow;this.colcol;}}Move是五子棋中最基础的数据结构——表示棋盘上的一个位置。用class而非interface是因为Move经常需要new Move(row, col)创建实例。辅助函数exportfunctiongetOpponent(player:number):number{returnplayerBLACK?WHITE:BLACK;}exportfunctionplayerName(player:number):string{returnplayerBLACK?黑方:白方;}这两个工具函数被多处复用getOpponent引擎中切换玩家、AI中获取人类棋色playerNameUI中显示当前玩家常量设计的通用原则1. 集中管理所有游戏常量放在一个文件中方便查找和修改// 改棋盘大小只需改一处exportconstBOARD_SIZE:number15;// 改成19就是围棋棋盘2. 命名清晰BOARD_SIZE而非SIZE或BSEMPTY而非EMPTY_CELL或NONEBLACK/WHITE而非COLOR_BLACK/COLOR_WHITE3. 语义分组// 棋盘相关exportconstBOARD_SIZE15;exportconstEMPTY0;// 棋子相关exportconstBLACK1;exportconstWHITE2;// 游戏状态exportenumGameResult{...}// AI相关exportenumDifficulty{...}AI评分常量AIPlayer中定义了一套完整的评分常量constSCORE_FIVE:number1000000;// 五连constSCORE_OPEN_FOUR:number100000;// 活四constSCORE_FOUR:number10000;// 冲四constSCORE_OPEN_THREE:number8000;// 活三constSCORE_THREE:number500;// 眠三constSCORE_OPEN_TWO:number400;// 活二constSCORE_TWO:number50;// 眠二constSCORE_ONE:number10;// 单子分值设计逻辑五连 活四 冲四 活三 眠三 活二 眠二 单子相邻级别约10倍差距确保高级棋型优先活四(100000)是冲四(10000)的10倍因为活四必胜而冲四可防总结GameConstants虽然只有50行代码但它奠定了整个项目的类型基础。好的常量设计能消除魔法数字提高可读性集中管理方便修改提供类型安全减少bug自文档化降低理解成本附