棋牌游戏开发之斗地主算法点选牌

这是转载一位博有的....依稀记得.....尴尬


斗地主算法之点选牌

                           -------

                                    有棋牌游戏开发经验的可以来互相交流 QQ:325131039

                   棋牌游戏开发技术交流群: 490287966

              PS:最近找了几个个朋友主准备把斗地主游戏重写,由于种种原因今天还没有开始,所以先把基本的算法写一写,为以后写项目做准备。如果你对斗地主游戏比较感兴趣可以关注此博文,以后将在博客中写一些关于斗地主方面的东西!!


 在地主点选牌的算法中,我们只要点击每张牌的可见区域,它的状态就会随之变化。我们通过上图可以发现,每张牌选中之后它会遮盖前面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坐标不一样而已。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值