cocos2dx 制作单机麻将(一)

今天开始打算讲解下cocos2dx下如何制作国标麻将

前半部分先讲解麻将的逻辑部分,因为都是代码,可能会比较枯燥无聊. 这部分讲完后,你也可以用其他游戏引擎来制作麻将

后半部分,就讲解余下的cocos2dx部分,因为要把这部分留到后面讲,主要是还在考虑用3d做还是用2d做.

到最后可以扩展AI部分的机器人 和 服务器模块


cocos2dx 制作单机麻将(一)

麻将逻辑1. 打乱麻将顺序(初始化牌堆)

国标麻将共有144张牌
#define MAX_REPERTORY144


先把所有的牌放入一个常量数组中保存
每种牌都是1-9 共有4张,风牌就是东南西北,箭牌就是中发白,花牌就是春夏秋冬梅兰竹菊
const BYTE m_cbCardDataArray[ MAX_REPERTORY ]=

{

0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,//万子

0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,//同子

0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,//索子

//索子

0x31,0x32,0x33,0x34,//风牌

0x41,0x42,0x43,//箭牌

//箭牌

0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,//花牌

};


有了顺序的数组,然后就可以打乱
打乱牌的函数

//混乱扑克

#define CountArray(Array) (sizeof(Array)/sizeof(Array[0]))

staticvoidRandCardData(BYTEcbCardData[],BYTEcbMaxCount)

{

//混乱准备

BYTEcbCardDataTemp[CountArray(m_cbCardDataArray)];//为什么直接用MAX_REPERTORY?因为这样无耦合

memcpy(cbCardDataTemp,m_cbCardDataArray,sizeof(m_cbCardDataArray));//拷贝一份到临时牌数组中

//混乱扑克(关键的核心打乱代码)

BYTEcbRandCount=0,cbPosition=0;

do

{

cbPosition=rand()%(cbMaxCount-cbRandCount);

cbCardData[cbRandCount++]=cbCardDataTemp[cbPosition];

cbCardDataTemp[cbPosition]=cbCardDataTemp[cbMaxCount-cbRandCount];

}while(cbRandCount<cbMaxCount);

return;

}

这样调用

BYTE_cardData[MAX_REPERTORY];

RandCardData(_cardData,MAX_REPERTORY);


下面是完整的控制台代码

  1. //
  2. //main.cpp
  3. //MajiangLogicTest
  4. //
  5. //CreatedbyTinyUlton14-8-16.
  6. //copyright(c)2014年TinyUlt.Allrightsreserved.
  7. #include<iostream>
  8. usingnamespacestd;
  9. #defineMAX_REPERTORY144
  10. typedefunsignedcharBYTE;
  11. //数组维数
  12. #ifndefCountArray
  13. #defineCountArray(Array)(sizeof(Array)/sizeof(Array[0]))
  14. #endif
  15. constBYTEm_cbCardDataArray[MAX_REPERTORY]=
  16. {
  17. 0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,//万子
  18. 0x01,0); background-color:inherit">//万子
  19. 0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0); background-color:inherit">//同子
  20. 0x11,0); background-color:inherit">//同子
  21. 0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0); background-color:inherit">//索子
  22. 0x21,0); background-color:inherit">//索子
  23. 0x31,0x32,0x33,0x34,0); background-color:inherit">//风牌
  24. 0x31,0); background-color:inherit">//风牌
  25. 0x41,0x42,0x43,0); background-color:inherit">//箭牌
  26. 0x41,0); background-color:inherit">//箭牌
  27. 0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0); background-color:inherit">//花牌
  28. };
  29. //混乱扑克
  30. staticvoidRandCardData(BYTEcbCardData[],BYTEcbMaxCount)
  31. //混乱准备
  32. BYTEcbCardDataTemp[CountArray(m_cbCardDataArray)];//为什么不直接用MAX_REPERTORY?因为这样无耦合
  33. memcpy(cbCardDataTemp,m_cbCardDataArray,sizeof(m_cbCardDataArray));//拷贝一份到临时牌数组中
  34. //混乱扑克(关键的核心打乱代码)
  35. BYTEcbRandCount=0,cbPosition=0;
  36. do
  37. cbPosition=rand()%(cbMaxCount-cbRandCount);
  38. cbCardData[cbRandCount++]=cbCardDataTemp[cbPosition];
  39. cbCardDataTemp[cbPosition]=cbCardDataTemp[cbMaxCount-cbRandCount];
  40. }while(cbRandCount<cbMaxCount);
  41. return;
  42. }
  43. intmain(intargc,char*argv[]){
  44. //insertcodehere...
  45. BYTE_cardData[MAX_REPERTORY];
  46. RandCardData(_cardData,MAX_REPERTORY);
  47. for(inti=0;i<MAX_REPERTORY;i++){
  48. cout<<hex<<int(_cardData[i])<<"";
  49. }
  50. return0;
  51. }


输出: 25 13 1 3 21 43 54 14 9 12 13 8 31 24 13 31 6 4 28 31 34 18 7 27 15 18 51 11 42 12 28 2 57 25 16 4 33 15 18 21 42 33 29 41 25 3 23 55 14 41 27 22 34 21 2 9 29 19 43 23 22 22 19 34 16 15 32 58 6 28 17 21 18 8 43 28 33 32 6 33 2 25 14 11 29 19 26 13 4 24 53 52 16 15 27 3 27 31 9 1 26 22 3 32 17 26 26 7 12 42 41 32 17 8 7 9 34 8 7 16 17 41 19 5 29 2 23 6 4 24 42 24 1 56 11 1 12 5 23 11 14 43 5 5Program ended with exit code: 0

相关文章

    本文实践自 RayWenderlich、Ali Hafizji 的文章《...
Cocos-code-ide使用入门学习地点:杭州滨江邮箱:appdevzw@1...
第一次開始用手游引擎挺激动!!!进入正题。下载资源1:从C...
    Cocos2d-x是一款强大的基于OpenGLES的跨平台游戏开发...
1.  来源 QuickV3sample项目中的2048样例游戏,以及最近《...
   Cocos2d-x3.x已经支持使用CMake来进行构建了,这里尝试...