求一个布局思路

如图,这是一个多米诺的项目,相当于是纸牌接龙类似,中间的【1,1】为基准点,向两边接龙(左边没弄了),规则为相同点数接龙,如果出的牌的两点为相同的(如【2,2】和【6,6】),则是竖着的,横着只能放7个,然后竖着放2个(竖着的固定为竖着如【3,4】,【4,5】),布局如图,求一个布局的思路。求大佬赐教一下,

没看懂123

纸牌接龙,一张牌是有2个点,如【1,1】算是一张牌,基准牌是最开头的【1,1】,然后【1,2】-》【2,2】-》【2,3】-》【3,4】-》【4,5】-》【5,4】-》【4,6】-》【6,6】-》【6,1】。规律就是一个牌的头的点,需要接上上一个牌尾的点, 其中,如果一个牌的两个点数是相同的,那么这个牌是竖着放的,或者这个牌的位置是在边上的,也必须竖着放(如【3,4】,【4,5】)。
如何才算边上放的?
横着放只能放7个,也就是【1,1】右边放3个(因为【1,1】是起始点,是居中的),然后就需要竖着放2个。然后在横着放7个,然后在竖着放2个,一直延续。
希望能讲解明白。

还有这种排列 每个牌估计要记录链表一样记录 head next。。。。position 位置…然后自己写个算法设置位置?

唉~。不是很好用链表的方式。

node { head next} next === 另外一个 head 可以连接 这时候再考虑 位置是否在边角。获取当前的x y w h 应该可以。类似链表

#mark 等待大佬

用了一个比较笨的办法,能解决:
//当前牌相对于上一个牌的位置,从第0个开始,位置如字面意思,这是右边的排序;
private rightposArr:string[] = [‘right’,‘right’,‘right’,
‘rightBottom’,‘bottom’,
‘bottomLeft’,‘left’,‘left’,‘left’,‘left’,‘left’,‘left’,
‘leftBottom’,‘bottom’,
‘bottomRight’,‘right’,‘right’,‘right’,‘right’,‘right’,‘right’];

/*
    设置牌的坐标;
    @param  previousPai         上一个牌
    @param  currentPai          当前牌
    @param  direction           方位
*/
setPaiPos(previousPai:cc.Node,currentPai:cc.Node,direction:string){
    /**
     *  Global.paiType.VERTICALLY           牌为竖直方面
     *  Global.paiType.LEFT                 牌为向左方面
     *  Global.paiType.RIGHT                牌为向右方面
     */
    //上一个牌的状态和需要保持的距离;
    let previousXDis:number = 0;                //X方向距离;
    let previousYDis:number = 0;                //Y方向距离;
    let previousDis:number = 0;                 //拐角时X的偏差;
    let previousPaiType = previousPai.getComponent('paiLogic').paiType;
    switch(previousPaiType){
        case Global.paiType.VERTICALLY:
            previousXDis = previousPai.width / 2 * this.scaleNum;
            previousYDis = previousPai.height / 2 * this.scaleNum;
            previousDis = 0;
            break;
        case Global.paiType.LEFT:
        case Global.paiType.RIGHT: 
            previousXDis = previousPai.height / 2 * this.scaleNum;
            previousYDis = previousPai.width / 2 * this.scaleNum;
            previousDis = previousYDis;
            break;
    }
    //自己牌的状态和需要保持的距离;
    let currentXDis:number = 0;                 //X方向距离;
    let currentYDis:number = 0;                 //Y方向距离;
    let currentDis:number = 0;                  //拐角时X的偏差;
    let currentPaiType = currentPai.getComponent('paiLogic').paiType;
    switch(currentPaiType){
        case Global.paiType.VERTICALLY:
            currentXDis = previousPai.width / 2 * this.scaleNum;
            currentYDis = previousPai.height / 2 * this.scaleNum;
            currentDis = 0;
            break;
        case Global.paiType.LEFT:
        case Global.paiType.RIGHT: 
            currentXDis = previousPai.height / 2 * this.scaleNum;
            currentYDis = previousPai.width / 2 * this.scaleNum;
            currentDis = previousPai.width / 2 * this.scaleNum;
            break;
    }
    console.log('============direction:'+direction);
    switch(direction){
        case 'left':
            currentPai.x = previousPai.x - currentXDis - previousXDis;
            currentPai.y = previousPai.y;
            break;
        case 'top':
            currentPai.x = previousPai.x;
            currentPai.y = previousPai.y + currentYDis + previousYDis;
            break;
        case 'right':
            currentPai.x = previousPai.x + currentXDis + previousXDis;
            currentPai.y = previousPai.y;
            break;
        case 'bottom':
            currentPai.x = previousPai.x;
            currentPai.y = previousPai.y - currentYDis - previousYDis;
            break;
        case 'rightBottom':
            currentPai.x = previousPai.x + previousDis;
            currentPai.y = previousPai.y - currentYDis - previousYDis;
            break;
        case 'bottomLeft':
            currentPai.x = previousPai.x - currentDis;
            currentPai.y = previousPai.y - currentYDis - previousYDis;
            break;
        case 'leftBottom':
            currentPai.x = previousPai.x - previousDis;
            currentPai.y = previousPai.y - currentYDis - previousYDis;
            break;
        case 'bottomRight':
            currentPai.x = previousPai.x + currentDis;
            currentPai.y = previousPai.y - currentYDis - previousYDis;
            break;
    }

思路就是首先根据2个牌的类型,算出牌的方向上的间隔距离,然后根据当前牌的类型,去算位置:
比如如果是 right状态,那么,y是相同的,x是上一个牌的x + 上一个牌的X向距离 + 自己X向距离。
rightBottom 的话根据上一个牌的类型算,如果上一个牌是竖着摆的,那么当前牌和上一个牌的x坐标
一样,y坐标就是 上一个牌的y向距离 + 当前牌的y向距离,如果上一个牌是横着摆的,那么x向需要另外
加上偏移量。
思路就是这么个思路,这个只是处理了,向右的方向,向左的方面类似。
如果有更好的思路的大佬,欢迎留言。