斗地主发牌简单算法

斗地主游戏的基本算法实现

     by -wojiushi3344

           QQ:513670524

棋牌游戏交流群:246671414

扫描二维码,添加好友,获取更多的斗地主编程技术


   转载请说明出处

    源代码下载               

       PS:首先祝朋友们5,1节快乐!!闲来无事,今天来写一下斗地主游戏的基本实现,写得不好,大家别喷哈!!具体实现还得参见源代码。朋友们如果你有更好的建议可以到我博客留言讨论。谢谢!

     博客地址:http://blog.csdn.net/wojiushi3344

 发牌动画:

          原理:没隔一段时间更新定时器,然后再更新图片到不同的位置实现地主发牌的动画。

          具体实现:运用初中数学知识,2点确定一条直线(y=kx+b).

根据上图可以看出,P点和A,B,C三点连接成3条不同的直线。我们要实现发牌动画,首先需要要发出的牌从P点依次移动到A,B,C三点。然后再按着途中箭头的方向来更新点的坐标,这样依次执行下去,直到要发的牌剩3张时发牌动画截止。

定义3个vector,来存入我们已经发了的牌的坐标。

vector  player_a;

vector  player_b;

vector  player_c;

 具体的代码实现:

[cpp] view plain copy
print ?
  1. void CGame::calculateTwoPoint(float  x1,float  y1,float  x2,float  y2)//计算两点间的线段  
  2. {  
  3.   
  4.     m_k=(y1-y2)/(x1-x2);  
  5.     m_b=y1-x1*m_k;  
  6. }  
void CGame::calculateTwoPoint(float  x1,float  y1,float  x2,float  y2)//计算两点间的线段
{

    m_k=(y1-y2)/(x1-x2);
    m_b=y1-x1*m_k;
}

根据2点的坐标,来计算出K和b的值。

绘制使将X坐标用Y坐标来表示,这样的好处是,当我们更新Y坐标时X坐标也随之更新,从而达到我们想要实现的效果。

[html] view plain copy
print ?
  1. m_dcBuffer.TransparentBlt((m_coor_y-m_b)/m_k,m_coor_y,80,105,&m_dcImage,80*2,4*105,80,105,RGB(255,0,255));  
m_dcBuffer.TransparentBlt((m_coor_y-m_b)/m_k,m_coor_y,80,105,&m_dcImage,80*2,4*105,80,105,RGB(255,0,255));

最后我们只需要设置一个定时器,每隔一段时间来更新Y值就可以了。

当在更新的时候P点到达A,B,C任何一个点时,将牌的坐标存入相应的vector中,绘制的时候根据VECTOR的值来绘制3方的牌就可以了。

 地主洗牌实现:

 首先上一张图片

大家知道玩斗地主的时候有54张牌吗?如果知道,那很好,你可以进入下面的环节了。分析分牌思路。

首先我们可以定义一个拥有54张牌的一维数组。

int CardValueArray[54];

 注意:详细理解下面的意思,这个对分牌很重要的。我们将54个元素用来代表不同的牌。

CardValueArray[0——–12]:       方块A———方块K

CardValueArray[13——–25]:    梅花A———梅花K

CardValueArray[26——-38-]:    红心A———红心K

CardValueArray[39——–51]:    黑桃A———黑桃K

CardValueArray【52】 小鬼   CardValueArray【53】大鬼

 我想你现在应该明白我接下来该怎么做了吧!(嘿嘿)

我们将CardValueArray[54] 依次初始化为0——53.然后打乱数组的值,将数组分为4份。3份17张,1份3张(枪地主牌牌)。将3份17张牌,依次分发给3个不同的玩家。

 这里难点就是给数组赋值。

这里有很多种方法。

第一种:

我们最直接能想到的一种,也是效率最低的方法。 也是我程序中采用的方法。(呵呵,比较笨吧!)

定义一个拥有54个元素的一维数组赋值为-1。然后随机生成0——54之间的数,然后判断生成的数是否在数组中已存在,不存在则存入数组,已存在则重新生成,直到54个数全部出现为止。

第二种:

可以这样,比如,定义一个拥有54个元素的一维数,依次赋值为1——53,然后随机两个0-53的数字,把这两个位置的数字互换    这样做比较多的次数之后,也是乱序的了,这个效率也不是特别高,但是比第一种要强。

  第三种做法:

      定义一个拥有54个元素的一维数,依次赋值为1——53, 随机54次,每次随机出一个数字,和第i个位置的数字交换,这样就比较不错了 

[html] view plain copy
print ?
  1.  int  CardValueArray[54];  
  2.  for(int i=0;i<54;i++)  
  3.  {  
  4.   CardValueArray[i]=i;  
  5.  }  
  6.  for (int i=0;i<54;i++)    
  7. {  
  8.  swap( CardValueArray[i], CardValueArray[(rand()%54)]);  
  9. }  
   int  CardValueArray[54];
   for(int i=0;i<54;i++)
   {
    CardValueArray[i]=i;
   }
   for (int i=0;i<54;i++)  
  {
   swap( CardValueArray[i], CardValueArray[(rand()%54)]);
  }

比如说,先随机出一个位置,和第一个数字交换,然后随机出一个位置,和第二个数字交换    打个比方,先随机出10,然后第十个数字,和第一个数字交换    然后随机出一个12,第12个数字,和第2个数字交换     然后随机一个数字和第三个交换.

第四种:

    使用rand_shuffle随机化序列元素。

   c++中提供了更好的解决方法,那就是random_shuffle()算法。不要着急,下面我就会告诉你如何用这种算法来产生不同类型的随机数。

 产生指定范围内的随机元素集的最佳方法是创建一个顺序序列(也就是向量或者内置数组),在这个顺序序列中含有指定范围的所有值。例如,如何你需要产生54个0-54之间的数,那么就创建一个向量并用54个按升序排列的数填充向量: 

[cpp] view plain copy
print ?
  1. #include  using std::vector;   
  2.   
  3.  int main()   
  4. {   
  5.  vector<int> vi;   
  6. for (int i = 0; i < 10; i++)   
  7. {  
  8. vi.push_back(i); /*现在向量包含了54个 0-54 之间的整数并且按升序排列*/   
  9. }  
#include  using std::vector; 

 int main() 
{ 
 vector vi; 
for (int i = 0; i < 10; i++) 
{
vi.push_back(i); /*现在向量包含了54个 0-54 之间的整数并且按升序排列*/ 
}


填充完向量之后,用random_shuffle()算法打乱元素排列顺序。random_shuffle()定义在标准的头文件中。因为

 所有的STL算法都是在名字空间std::中声明的,所以你要注意正确地声明数据类型。random_shuffle()有两个参数,第一个参数是指向序列首元素的迭代器,第二个参数则指向序列最后一个元素的下一个位置。下列代码段用random_shuffle()算法打乱了先前填充到向量中的元素:

[cpp] view plain copy
print ?
  1. “FONT-SIZE: 16px”> #include   
  2.   
  3.  using std::random_shuffle;  
  4.   
  5.  random_shuffle(vi.begin(), vi.end()); /* 打乱元素 */  
  6.   
  7.   
 #include 

 using std::random_shuffle;

 random_shuffle(vi.begin(), vi.end()); /* 打乱元素 */


 你可以选择以上4种中的任何一种方法来生成54个0–54之间的不重复数。

这样我们 通过以上的方法就将CardValueArray数组中的值赋值上了。现在我们只需要用数组中的值到大图中切对应的牌就行了。

从上图中我们可以用一个公式来表示每张牌在大图中的,X,Y坐标即:

x=CardValueArray[i]%13*每张牌的宽

y=CardValueArray[i]/13*每张牌的高

 

转载自 http://blog.csdn.net/wojiushi3344/article/details/7522245

你可能感兴趣的:(游戏算法,游戏,算法,编程)