http://topic.csdn.net/u/20120515/23/CE378105-FA76-4A08-A4D3-DE61109F4909.html
斗地主算法之点选牌
PS:最近找了2个朋友主准备把斗地主游戏重写,由于种种原因今天还没有开始,所以先把基本的算法写一写,为以后写项目做准备。如果你对斗地主游戏比较感兴趣可以关注我们(项目人员(QQ网名):麦麦,KelJony, °つ陌途 ),以后我们将在博客中写一些关于斗地主方面的东西!!
博客地址: http://blog.csdn.net/wojiushi3344
地主源码下载
![](https://img-my.csdn.net/uploads/201205/15/1337094769_6896.jpg)
在地主点选牌的算法中,我们只要点击每张牌的可见区域,它的状态就会随之变化。我们通过上图可以发现,每张牌选中之后它会遮盖前面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张被选牌的可见区域。
点选牌的时候得遍历每张牌的正常可见区域和邻居选择之后给自己改变的可见区域。