斗地主算法之点选牌

转载自: https://blog.csdn.net/wojiushi3344/article/details/7570583


在地主点选牌的算法中,我们只要点击每张牌的可见区域,它的状态就会随之变化。我们通过上图可以发现,每张牌选中之后它会遮盖前面3张牌的可见区域,而后面3张牌会影响自身的可见区域,所以每张牌点选之后与前面3张和后面3张牌有关系(一共就是6张)。第一张牌除外,第一张牌选中之后只有它自己的可见区域会发生变化,因为第一张牌前面没有任何牌。这样我们就可以定义下面几个变量来记录每次点选牌之后的可见区域。


CRECT NormalRect; //正常情况下的可见矩形区域

CRECT TopOrDown; //自己选中或者邻居选中的可见区域

int           CardWidth;//牌的宽度

int           CardHigh;//牌的高度

int          CheckHigh;//选中之后的向上高度

int         CardSpacing;//牌之间的间距


在最开始什么牌也没有点选的时候每张牌有个正常的可见区域,我们用NormalRect来记录,它的值就是NormalRect.setRect(牌的X坐标,牌的Y坐标,牌的X坐标+CardSpacing(牌之间的间距),牌的Y坐标+CardHigh)。下面我们可以分几种情况来讨论可见区域的变化。


第一种:在牌的队列中只有自己被选中,会响应自己的可见区域,和前面一张牌的下部分可见区域(图中蓝色框选出来的部分)。

这种是最简单的,自己被选中的时候,首先改变的正常的可见区域然后+选中之后的可见区域。

选中之后我们改变的就是牌的Y坐标:牌的Y坐标=牌的Y坐标-CheckHigh(选中之后的向上高度)

然后代入下面

NormalRect.setRect(牌的X坐标,牌的Y坐标,牌的X坐标+CardWidth,牌的Y坐标+CardHigh);//这个就是改变之后的正常可见区域。

下面是具体的4个点的坐标计算

X1=牌的X坐标- CardSpacing(牌之间的间距)

Y1=牌的Y坐标

X2=牌的X坐标+CardWidth

Y2=Y1+CheckHigh(选中之后的向上高度)

选中之后的可见区域:TopOrDown.setRect(x1,y1,x2,y2);


然后改变前面一张牌下部分的可见区域。

X1=牌的X坐标+ CardSpacing(牌之间的间距)

Y1=牌的Y坐标+CheckHigh-CheckHigh(选中之后的向上高度)

X2=牌的X坐标+ CardSpacing(牌之间的间距)*2

Y2=牌的Y坐标+CheckHigh;

TopOrDown.setRect(x1,y1,x2,y2);


前面一张牌的正常可见区域不变。


第二种:在牌的队列中会影响其他牌的可见区域

这个可以分二种情况来讨论

1 前面三张牌有被选中的(选中之后前面牌的可见区域会被影响)

当前面3张牌中有选中状态的牌,它们的可见区域会被影响,正常的可见区域不会被影响。而影响的可见区域也只是X2被改变了,影响的可见区域我们可以用一个公式来表示

X2=((checkCardIndex(选中牌的索引) - forntCardindex(前面选中牌的索引))-1)*CardSpacing(牌之间的间距)。


2后面3张牌有被选中的(会影响自身得可见区域)

当我们选中牌的时候,后面三张牌有有被选中的时候。我们首先用第一种:在牌的队列中只有自己被选中的方法来计算出正常的可见区域和可见区域。而选中之后被后面影响的也只有X2,我们同样用一个公式来表示。

X2=( BackCardindex(后面选中牌的索引)-(checkCardIndex(选中牌的索引) )-1)*CardSpacing(牌之间的间距)。


这样当我们选中牌的时候既要改变自身得可见区域也要改变前面3张被选牌的可见区域。


这样在你点选牌的时候根据鼠标坐标,来判断和牌队列中的哪张牌的可见区域碰撞,然后确定牌的索引更改与之对应牌的可见区域就能实现选牌操作。

我们第二种讨论的可见区域只是上面部分的可见区域(图中用红色标框出来的部分),只要你看懂了上面的方法,下面部分的可见区域(图中用蓝色框出来的可见区域)的方法也跟上面的是一样的只是x坐标不一样而已。



在地主点选牌的算法中,我们只要点击每张牌的可见区域,它的状态就会随之变化。我们通过上图可以发现,每张牌选中之后它会遮盖前面3张牌的可见区域,而后面3张牌会影响自身的可见区域,所以每张牌点选之后与前面3张和后面3张牌有关系(一共就是6张)。第一张牌除外,第一张牌选中之后只有它自己的可见区域会发生变化,因为第一张牌前面没有任何牌。这样我们就可以定义下面几个变量来记录每次点选牌之后的可见区域。


CRECT NormalRect; //正常情况下的可见矩形区域

CRECT TopOrDown; //自己选中或者邻居选中的可见区域

int           CardWidth;//牌的宽度

int           CardHigh;//牌的高度

int          CheckHigh;//选中之后的向上高度

int         CardSpacing;//牌之间的间距


在最开始什么牌也没有点选的时候每张牌有个正常的可见区域,我们用NormalRect来记录,它的值就是NormalRect.setRect(牌的X坐标,牌的Y坐标,牌的X坐标+CardSpacing(牌之间的间距),牌的Y坐标+CardHigh)。下面我们可以分几种情况来讨论可见区域的变化。


第一种:在牌的队列中只有自己被选中,会响应自己的可见区域,和前面一张牌的下部分可见区域(图中蓝色框选出来的部分)。

这种是最简单的,自己被选中的时候,首先改变的正常的可见区域然后+选中之后的可见区域。

选中之后我们改变的就是牌的Y坐标:牌的Y坐标=牌的Y坐标-CheckHigh(选中之后的向上高度)

然后代入下面

NormalRect.setRect(牌的X坐标,牌的Y坐标,牌的X坐标+CardWidth,牌的Y坐标+CardHigh);//这个就是改变之后的正常可见区域。

下面是具体的4个点的坐标计算

X1=牌的X坐标- CardSpacing(牌之间的间距)

Y1=牌的Y坐标

X2=牌的X坐标+CardWidth

Y2=Y1+CheckHigh(选中之后的向上高度)

选中之后的可见区域:TopOrDown.setRect(x1,y1,x2,y2);


然后改变前面一张牌下部分的可见区域。

X1=牌的X坐标+ CardSpacing(牌之间的间距)

Y1=牌的Y坐标+CheckHigh-CheckHigh(选中之后的向上高度)

X2=牌的X坐标+ CardSpacing(牌之间的间距)*2

Y2=牌的Y坐标+CheckHigh;

TopOrDown.setRect(x1,y1,x2,y2);


前面一张牌的正常可见区域不变。


第二种:在牌的队列中会影响其他牌的可见区域

这个可以分二种情况来讨论

1 前面三张牌有被选中的(选中之后前面牌的可见区域会被影响)

当前面3张牌中有选中状态的牌,它们的可见区域会被影响,正常的可见区域不会被影响。而影响的可见区域也只是X2被改变了,影响的可见区域我们可以用一个公式来表示

X2=((checkCardIndex(选中牌的索引) - forntCardindex(前面选中牌的索引))-1)*CardSpacing(牌之间的间距)。


2后面3张牌有被选中的(会影响自身得可见区域)

当我们选中牌的时候,后面三张牌有有被选中的时候。我们首先用第一种:在牌的队列中只有自己被选中的方法来计算出正常的可见区域和可见区域。而选中之后被后面影响的也只有X2,我们同样用一个公式来表示。

X2=( BackCardindex(后面选中牌的索引)-(checkCardIndex(选中牌的索引) )-1)*CardSpacing(牌之间的间距)。


这样当我们选中牌的时候既要改变自身得可见区域也要改变前面3张被选牌的可见区域。


这样在你点选牌的时候根据鼠标坐标,来判断和牌队列中的哪张牌的可见区域碰撞,然后确定牌的索引更改与之对应牌的可见区域就能实现选牌操作。

我们第二种讨论的可见区域只是上面部分的可见区域(图中用红色标框出来的部分),只要你看懂了上面的方法,下面部分的可见区域(图中用蓝色框出来的可见区域)的方法也跟上面的是一样的只是x坐标不一样而已。



猜你喜欢

转载自blog.csdn.net/cui6864520fei000/article/details/88080721