1. 游戏逻辑设计

2048游戏使用4x4的格子来表示需要移动的数字,这不难想到可以使用一个矩阵来表示这些数字,我们使用type G2048 [4][4]int来表示。每一次使用方向键来移动数字时,对应方向上的数字需要进行移动和合并,也就是移动和合并矩阵中的非零值。当按下不同的方向键时,移动的数字也不同。我们一共会向上、向下、向左、向右四个方向移动数字,可以通过旋转矩阵将向下、向左、向右的移动都转换为向上的移动,这样能一定程度上简化游戏逻辑。

2. 界面设计

开发的2048游戏将运行在console下。在console中,我们可以控制每一个字符单元的背景色,以及显示的字符。我们可以根据这一点,在console中绘制中图形,也就是2048游戏的框架:4x4的空白格子,然后每一个格子是4个字符单元,也就是最多能显示四位数字。我们将使用包http://github.com/nsf/termbox-go进行界面的绘制,termbox-go能很方便的设置字符单元的属性。

2048游戏的实现

1. 矩阵的旋转

矩阵的旋转操作是为了将其他三个方向的移动都转换为向上的移动操作。向下(↓)、向左(←)、向右(→)转换为向上(↑)的操作时,数组需要进行的翻转操作如下所示:

  • ↓ → ↑此类转换可以有多种方法做到:
  • 上下翻转矩阵,然后向上移动合并,再次上下翻转矩阵上下翻转后:martix_new[n-1-x][y]= martix_old[x][y]
  • 顺时针翻转180度矩阵,然后向上移动合并,接着逆时针旋转180度此时martix_new[n-1-x]n-1-y]= martix_old[x][y]
  • ← → ↑此类转换可以将矩阵向右旋转90度后,向上移动合并,接着向左旋转90度完成向右旋转90度后:martix_new[y][n-x-1] = martix_old[x][y] 向左旋转90度后:martix_new[n-y-1][x]= martix_old[x][y]
  • → → ↑此类转换可以将矩阵向左旋转90度后,向上移动合并,接着向右旋转90度完成

2. 主要代码