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

如图,这是一个多米诺的项目,相当于是纸牌接龙类似,中间的【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向需要另外
加上偏移量。
思路就是这么个思路,这个只是处理了,向右的方向,向左的方面类似。
如果有更好的思路的大佬,欢迎留言。