五子棋小游戏

看到一个帖子说腾讯前端的面试题是让写一个五子棋小游戏

  • 实现胜负判断,并给出赢棋提示。
  • 任意一方赢棋,锁定棋盘。
  • 尽可能考虑游戏的扩展性,界面可用 DOM/ Canvas 实现,并且切换实现方式代价最小。
  • 实现悔棋和撤销悔棋功能。
  • 人机对战部分可选。

挺有意思的,尝试自己写一个。

代码:https://github.com/chairuosen/my-five

demo:http://demo.ruosen.io/my-five/dist/

思路

首先,要求渲染层可替换,那么逻辑代码就一定要高度抽象,仅对数据操作,然后每一次变动由数据渲染出画面,应该对外提供一个五子棋类,提供api查询棋盘状态,和下棋,撤销,重置等动作。然后可以注册update事件监听来更新渲染。

类 棋子: 状态[未分配,黑,白] 重置方法

因为要点击空白部分来放置棋子,与其判断点击位置来放置棋子数据,不如一开始就铺满棋子只是不显示,点击事件就放在隐形棋子身上。

类 棋盘: 宽度,高度,二维矩阵[[棋子...]...] 赢棋检查 重置方法

类 玩家

类 五子棋: 棋盘 玩家 历史记录 重置方法

实现起来还是挺简单的,有一点复杂的就是赢棋检查这里,没想到什么高效的算法,遍历棋盘成本稍高,所以加了一层判断缓存。当遍历到某一节点1时,发现某一方向[1,2,3..]n星连珠但组不成5星时,把这n个节点在这一方向的结果都在缓存置为false,下次遍历到2,3,4时不用计算。

//todo AI

Ruosen

Be a Geek, Do the right thing;