Swift 实现的鬼脚图小游戏

2,392 阅读2分钟
原文链接: yrq110.me

Ghost Leg

鬼脚图,一种游戏或抽签方法,用于简单的决策,在日本被称为阿弥陀签(あみだくじ)。

画法

在竖线的一端分别写上参与人(如题图的a,b,c,d,e,f),将需分配的事物或工作分成与人数的同等分后分别写在另一端(如题图的1,2,3,4,5,6)。然后在每两个竖线相隔的区域,每个人任意的画上横线。每个人画横线的条数一般不限,但横线间不可交叉且横线不可横跨穿过两个间隔。

玩法

每个人选一起点开始往下走,遇到横线则沿着横线走到隔壁的纵线,最后到达终点就是抽签所抽中的项目。题图为画好线后C子所行走的路线。

实现

普通模式

随意添加横线来得到一种结果。

添加横线

点击红色圆形按钮来添加横线:

执行动画得到结果

添加完成后点击Calculate计算每个棋子的行走路径(路径会在console中输出),然后执行动画得到结果。

逆推模式

随机生成最终结果,你需要在合适的位置添加横线,使这些棋子通过横线倒着返回到正确的排好序的位置。

添加横线

执行动画,得分

看答案

点击Answer按钮自动添加正确的横线(答案不唯一):

func moveUpStepByStep(btn:ACButton){
    var _x = btn.x!
    var _y = btn.y!
//        print("btn\(btn.tag):x is \(_x), y is \(_y)")
    if _x != btn.tag && _y != 0 {
        _x -= 1
        _y -= 1
        isTrackChanged = true
        nextStartY = _y
        turnPointArray.append((_x,_y))
    }else if _y != 0 {
        _y -= 1
    }else{
        if !isTrackChanged  {
            nextStartY -= 1
        }
        moveOtherBtn(btn.tag,moveToY: nextStartY)
        print(turnPointArray)
        return
    }
    (btn.x!,btn.y!) = (_x,_y)
    moveUpStepByStep(btn)
}

上面这个函数用来逐步边移动边检测当前移动的棋子是否到达正确的竖直方向(x==btn.tag)。

计算答案的大致原理:

  1. 找到并添加适当的横线,把序号最小的棋子逆推回正确的竖线上。
  2. 使其他棋子逐步朝上走到刚刚添加的最靠上方横线的水平位置。
  3. 序号最小的棋子从计算数组中移除,使其笔直地向上移动。
  4. 回到步骤1。

也可以这样

_(:з」∠)_

GitHub代码

Amidakuji_Swift