cocos2dx 制作单机麻将(二)
打乱麻将顺序2
前面讲解了如何打乱初始给定的麻将牌堆,还有一种是打乱任意给定的麻将牌堆
//混乱扑克2
voidRandAppointCardData(BYTEcbCardData[],BYTEcbMaxCount,BYTEOriginalData[]/*源牌堆数据*/)
{
//混乱扑克
BYTEcbRandCount=0,cbPosition=0;
do
{
cbPosition=rand()%(cbMaxCount-cbRandCount);
cbCardData[cbRandCount++]=OriginalData[cbPosition];
OriginalData[cbPosition]=OriginalData[cbMaxCount-cbRandCount];
}while(cbRandCount<cbMaxCount);
return;
}
下面是完整控制台代码
- //@H_502_105@
- //main.cpp@H_502_105@
- //MajiangLogicTest@H_502_105@
- //@H_502_105@
- //CreatedbyTinyUlton14-8-16.@H_502_105@
- //Copyright(c)2014年TinyUlt.Allrightsreserved.@H_502_105@
- @H_502_105@
- #include<iostream>@H_502_105@
- usingnamespacestd;@H_502_105@
- @H_502_105@
- #defineMAX_REPERTORY144@H_502_105@
- typedefunsignedcharBYTE;@H_502_105@
- shortWORD;@H_502_105@
- //数组维数@H_502_105@
- #ifndefCountArray@H_502_105@
- #defineCountArray(Array)(sizeof(Array)/sizeof(Array[0]))@H_502_105@
- #endif@H_502_105@
- constBYTEm_cbCardDataArray[MAX_REPERTORY]=@H_502_105@
- {@H_502_105@
- 0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,//万子@H_502_105@
- 0x01,0); background-color:inherit">//万子@H_502_105@
- 0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0); background-color:inherit">//同子@H_502_105@
- 0x11,0); background-color:inherit">//同子@H_502_105@
- 0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0); background-color:inherit">//索子@H_502_105@
- 0x21,0); background-color:inherit">//索子@H_502_105@
- 0x31,0x32,0x33,0x34,0); background-color:inherit">//风牌@H_502_105@
- 0x31,0); background-color:inherit">//风牌@H_502_105@
- 0x41,0x42,0x43,0); background-color:inherit">//箭牌@H_502_105@
- 0x41,0); background-color:inherit">//箭牌@H_502_105@
- 0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0); background-color:inherit">//花牌@H_502_105@
- };@H_502_105@
- //混乱扑克@H_502_105@
- staticvoidRandCardData(BYTEcbCardData[],BYTEcbMaxCount)@H_502_105@
- //混乱准备@H_502_105@
- BYTEcbCardDataTemp[CountArray(m_cbCardDataArray)];//为什么直接用MAX_REPERTORY?因为这样无耦合@H_502_105@
- memcpy(cbCardDataTemp,m_cbCardDataArray,sizeof(m_cbCardDataArray));//拷贝一份到临时牌数组中@H_502_105@
- //混乱扑克(关键的核心打乱代码)@H_502_105@
- BYTEcbRandCount=0,cbPosition=0;@H_502_105@
- do@H_502_105@
- cbPosition=rand()%(cbMaxCount-cbRandCount);@H_502_105@
- cbCardData[cbRandCount++]=cbCardDataTemp[cbPosition];@H_502_105@
- cbCardDataTemp[cbPosition]=cbCardDataTemp[cbMaxCount-cbRandCount];@H_502_105@
- }while(cbRandCount<cbMaxCount);@H_502_105@
- return;@H_502_105@
- }@H_502_105@
- //混乱扑克2@H_502_105@
- voidRandAppointCardData(BYTEcbMaxCount,87); background-color:inherit; font-weight:bold">BYTEOriginalData[]/*源牌堆数据*/)@H_502_105@
- {@H_502_105@
- 502_105@
- do
@H_502_105@ - cbPosition=rand()%(cbMaxCount-cbRandCount);@H_502_105@
- cbCardData[cbRandCount++]=OriginalData[cbPosition];@H_502_105@
- OriginalData[cbPosition]=OriginalData[cbMaxCount-cbRandCount];@H_502_105@
- }while(cbRandCount<cbMaxCount);@H_502_105@
- return;@H_502_105@
- intmain(intargc,char*argv[]){@H_502_105@
- //insertcodehere...@H_502_105@
- /*第一种混乱*/@H_502_105@
- //创建一个空牌堆@H_502_105@
- BYTE_cardData1[MAX_REPERTORY];@H_502_105@
- //把在该函数中创建并打乱牌堆,然后把指针传给_cardData;@H_502_105@
- RandCardData(_cardData1,MAX_REPERTORY);@H_502_105@
- //输出牌数据@H_502_105@
- for(inti=0;i<MAX_REPERTORY;i++){@H_502_105@
- cout<<hex<<int(_cardData1[i])<<"";@H_502_105@
- cout<<endl;@H_502_105@
- /*第二种混乱*/@H_502_105@
- //创建一个空牌堆@H_502_105@
- BYTE_cardData2[MAX_REPERTORY];@H_502_105@
- @H_502_105@
- RandAppointCardData(_cardData2,MAX_REPERTORY,_cardData1);@H_502_105@
- //输出牌数据@H_502_105@
- inti=0;i<MAX_REPERTORY;i++){@H_502_105@
- cout<<hex<<int(_cardData2[i])<<"";@H_502_105@
- }@H_502_105@
- cout<<endl;@H_502_105@
- return0;@H_502_105@
- }@H_502_105@
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 5
16 56 21 7 28 14 41 12 16 24 43 21 31 26 3 53 52 7 12 34 51 14 9 29 23 33 12 31 14 6 16 18 54 21 25 58 19 5 7 28 32 34 1 27 27 33 6 14 9 17 25 33 28 11 17 24 43 2 22 6 23 3 11 42 2 18 3 4 42 4 18 55 25 42 22 32 4 15 8 29 24 13 6 26 19 9 41 25 7 8 1 13 11 15 41 43 57 16 33 18 32 27 1 8 12 31 4 5 27 22 26 23 31 2 5 17 26 13 19 43 17 21 42 5 3 19 23 15 28 15 8 24 9 29 13 32 34 2 34 41 11 29 22 1
Program ended with exit code: 0
麻将逻辑3. 初始化手牌
麻将的逻辑前提是有数据的支持,所有有良好的数据存储方式是很有必要的.
麻将的牌记录一般采取比较通用的方法,即一个一维的数组,长度是牌型的数量,元素的值为牌的数量
例如
#define MAX_INDEX42//最大索引
BYTEcbCardIndex[MAX_INDEX]
因为牌的类型共有42种 1万-9万,1筒-9筒,1索-9索,东南西北中发白(7),春夏秋冬梅兰竹菊(8)
9+9+9+7+8 = 42.
如果每摸到一张 1万 只要cbCardIndex[0]++,摸到 3万 cbCardIndex[2]++,摸到东风就cbCardIndex[0x31]++吗?
你会发现牌值是用16进制表示的(回顾第一讲),所有我们不能用cbCardIndex[牌值] 来表示该类型牌的数量
比如 我想得到手中1筒的数量 不能用cbCardIndex[0x11],应该用cbCardIndex[9]. 所有我们应该要有个可以让牌型值和索引互相转换的函数
即 实现这样的功能cbCardIndex[func(9)] ==cbCardIndex[0x11],这样我们就可以用牌型值来取该类型牌的数量了
直接上代码了 不早了 该睡觉了