用python编写1024游戏 (2)

续上篇文章,我们来一步步实现1024游戏。

总体设计

考虑到实现的难度和效率,改进了一下整体思路:

首先直接把它翻译成python代码:

设计数据结构

然后设计一下用到的数据结构:

由于我用的python版本没有enum类型,所以用class代替。

这里的棋盘类我使用一维数组来作为内部存储实现。要注意get和set方法中坐标到下标的换算方式。

其中:

是用来判断棋盘边界的。

实现

接下来是几个关键函数的实现:

随机放置2或4

这个函数会随着空值元素减少效率变低,应该有优化的算法。其中的0.1控制着2和4出现的比例。

检测当前棋盘的状态是否可变

改变棋盘状态

由于滑动的方向有四个,各个方向的处理办法都不一样。留意到上下、左右可以成组,组内操作的方向是反的。但组间的操作却是转置的。

考虑到棋盘本身可以看做一个矩阵,可以用一个线性变换将棋盘统一到某一方向,然后应用同一种操作,然后再变换回来。这样子虽然避免了重复的分支操作,但是程序的复杂度上升,效率也受到影响。

换一个思路,我们尝试提取不同方向下的不同点:定位和遍历。例如向左滑动和向右滑动,它们的定位方法是一样的,但是遍历方向相反。向下和向上滑动的遍历方向也是相反的,定位方法一样。向左滑动和向上滑动的遍历方向一样,但是定位方法确实相反的(一个i行j列,一个j行i列。于是我们对上述两种操作再针对不同滑动方向赋予不同的实现,从而使操作得到统一。

完整代码

代码放在了Github Gist上,如下所示:

《用python编写1024游戏 (2)》有1个想法

  1. 换一个思路,我们尝试提取不同方向下的不同点:定位和遍历。例如向左滑动和向右滑动,它们的定位方法是一样的,但是遍历方向相反。向下和向上滑动的遍历方向也是相反的,定位方法一样。向左滑动和向上滑动的遍历方向一样,但是定位方法确实相反的(一个i行j列,一个j行i列。于是我们可以抽象出上述两种操作,使不同方向上的操作得到统一。——不明觉厉wow~ ⊙o⊙

发表评论

电子邮件地址不会被公开。