如何写一个国际象棋的游戏(第四部分)在棋盘上摆上棋子【Unicode 在前端中的使用】

1,371 阅读2分钟

“我正在参加掘金社区游戏创意投稿大赛个人赛,详情请看:游戏创意投稿大赛

代码仓库,走过路过点一个 Star ✨

在上一段落里面写到了如何写一个棋盘。那接下来就是要摆棋子上去了,白方在下面,黑方在上面,第一排是小兵,第二排是车、马、象、后、王、象、马、车。有一个原则就是黑后在黑色的格子,白后在白色的格子,这样会方便你记忆棋子的顺序。因为第一个版本是 svg 格式的,所以棋子得是一个 text 格式的,这时候自然而然就想到了 Unicode,而 Unicode 里面有一整套这个字符,你甚至能够找到中国象棋,以及日本将棋的。

Unicode

Piece NameHexCode PointSymbol
White King#x2654;U+2654
White Queen#x2655;U+2655
White Bishop#x2657;U+2657
White Knight#x2658;U+2658
White Rock#x2656;U+2656
White Pawn#x2659;U+2659
Black King#x265A;U+265A
Black Queen#x265B;U+265B
Black Bishop#x265D;U+265D
Black Knight#x265E;U+265E
Black Rock#x265C;U+265C
Black Pawn#x265F;U+265F

可以用 <span>&#x265E;</span> 展示出棋子。而 svg 格式的如下

<g
  width={gridSize}
  height={gridSize}
  key={`${rowIndex}-${colIndex}`}
  >
  <rect
    x={colIndex * gridSize}
    y={rowIndex * gridSize}
    width={gridSize}
    height={gridSize}
    style={{ fill: col === 1 ? blackGrid : whiteGrid }}
    />
  <text
    x={gridSize / 2 + gridSize * colIndex}
    y={gridSize / 2 + gridSize * rowIndex}
    dominantBaseline="middle"
    textAnchor="middle"
    fontSize={fontSize}
    stroke={blackPieceColor}
    opacity={0.8}
    >
    &#x265A; // 这里需要特别注意下 ⚠️
  </text>
</g>

这样就是一个完整的格子了,rect 用来表示方格,text 用来表示方格里面的棋子。在这里有一个需要注意的地方,上面那个黄色的 Warning 提示部分,在 React 代码中你不能够直接写 <span>&#x265E;</span> ,这样是不会生效的。你需要像下面代码中那样使用,这也是我为什么在表格中把 Code Point 也列出来了,或者你可以直接把那个字符打出来。

<div>{'First \u00b7 Second'}</div>
// 或者
<div>{'First ' + String.fromCharCode(183) + ' Second'}</div>

图片

以上方式其实并没有问题,但是因为在不同系统上面,Unicode 展示的并不是统一的,这也是我后来在手机上(iOS 15.4)看黑色的兵会比白色的兵大上两号。所以最终只能够使用图片的方式来展示这些棋子,毕竟这个兼容性是没有问题的,也不会受到系统字体的影响。最后这些棋子的变量就会像下面这样展示。

export const WHITE = {
    pawn: '♙',
    rock: '♖',
    knight: '♘',
    bishop: '♗',
    queen: '♕',
    king: '♔',
    pawn_img: WHITE_PAWN,
    rock_img: WHITE_ROCK,
    knight_img: WHITE_KNIGHT,
    bishop_img: WHITE_BISHOP,
    queen_img: WHITE_QUEEN,
    king_img: WHITE_KING,
}

export const BLACK = {
    pawn: '♟',
    rock: '♜',
    knight: '♞',
    bishop: '♝',
    queen: '♛',
    king: '♚',
    pawn_img: BLACK_PAWN,
    rock_img: BLACK_ROCK,
    knight_img: BLACK_KNIGHT,
    bishop_img: BLACK_BISHOP,
    queen_img: BLACK_QUEEN,
    king_img: BLACK_KING,
}