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;
}
下面是完整控制台代码
- //
- //main.cpp
- //MajiangLogicTest
- //
- //CreatedbyTinyUlton14-8-16.
- //Copyright(c)2014年TinyUlt.Allrightsreserved.
- #include<iostream>
- usingnamespacestd;
- #defineMAX_REPERTORY144
- typedefunsignedcharBYTE;
- shortWORD;
- //数组维数
- #ifndefCountArray
- #defineCountArray(Array)(sizeof(Array)/sizeof(Array[0]))
- #endif @H_404_230@constBYTEm_cbCardDataArray[MAX_REPERTORY]=
- {
- 0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,//万子
- 0x01,0); background-color:inherit">//万子
- 0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0); background-color:inherit">//同子
- 0x11,0); background-color:inherit">//同子
- 0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0); background-color:inherit">//索子
- 0x21,0); background-color:inherit">//索子
- 0x31,0x32,0x33,0x34,0); background-color:inherit">//风牌
- 0x31,0); background-color:inherit">//风牌
- 0x41,0x42,0x43,0); background-color:inherit">//箭牌
- 0x41,0); background-color:inherit">//箭牌
- 0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0); background-color:inherit">//花牌
- };
- //混乱扑克 @H_404_230@staticvoidRandCardData(BYTEcbCardData[],BYTEcbMaxCount)
- //混乱准备
- BYTEcbCardDataTemp[CountArray(m_cbCardDataArray)];//为什么直接用MAX_REPERTORY?因为这样无耦合
- memcpy(cbCardDataTemp,m_cbCardDataArray,sizeof(m_cbCardDataArray));//拷贝一份到临时牌数组中
- //混乱扑克(关键的核心打乱代码)
- BYTEcbRandCount=0,cbPosition=0; @H_404_230@do
- cbPosition=rand()%(cbMaxCount-cbRandCount);
- cbCardData[cbRandCount++]=cbCardDataTemp[cbPosition];
- cbCardDataTemp[cbPosition]=cbCardDataTemp[cbMaxCount-cbRandCount];
- }while(cbRandCount<cbMaxCount); @H_404_230@return;
- }
- //混乱扑克2
- voidRandAppointCardData(BYTEcbMaxCount,87); background-color:inherit; font-weight:bold">BYTEOriginalData[]/*源牌堆数据*/)
- {
- do
- cbPosition=rand()%(cbMaxCount-cbRandCount);
- cbCardData[cbRandCount++]=OriginalData[cbPosition];
- OriginalData[cbPosition]=OriginalData[cbMaxCount-cbRandCount];
- }while(cbRandCount<cbMaxCount);
- return;
- intmain(intargc,char*argv[]){
- //insertcodehere...
- /*第一种混乱*/
- //创建一个空牌堆
- BYTE_cardData1[MAX_REPERTORY];
- //把在该函数中创建并打乱牌堆,然后把指针传给_cardData;
- RandCardData(_cardData1,MAX_REPERTORY);
- //输出牌数据
- for(inti=0;i<MAX_REPERTORY;i++){
- cout<<hex<<int(_cardData1[i])<<"";
- cout<<endl;
- /*第二种混乱*/
- //创建一个空牌堆
- BYTE_cardData2[MAX_REPERTORY];
- RandAppointCardData(_cardData2,MAX_REPERTORY,_cardData1);
- //输出牌数据
- inti=0;i<MAX_REPERTORY;i++){
- cout<<hex<<int(_cardData2[i])<<"";
- }
- cout<<endl; @H_404_230@return0;
- }
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],这样我们就可以用牌型值来取该类型牌的数量了
直接上代码了 不早了 该睡觉了