cocos2dx 制作单机麻将(二)
cocos2dx 制作單機麻將(二)
打亂麻將順序2
前面解說了怎樣打亂初始給定的麻將牌堆, 另一種是打亂隨意給定的麻將牌堆
//混亂撲克2
void RandAppointCardData(BYTE cbCardData[],BYTE cbMaxCount,BYTE OriginalData[]/*源牌堆數據*/)
{
? ? //混亂撲克
? ? BYTE cbRandCount=0,cbPosition=0;
? ? do
? ? {
? ? ? ? cbPosition=rand()%(cbMaxCount-cbRandCount);
? ? ? ? cbCardData[cbRandCount++]=OriginalData[cbPosition];
? ? ? ? OriginalData[cbPosition]=OriginalData[cbMaxCount-cbRandCount];
? ? } while (cbRandCount<cbMaxCount);
?? ?
? ? return;
}
以下是完整控制臺代碼// // main.cpp // MajiangLogicTest // // Created by TinyUlt on 14-8-16. // Copyright (c) 2014年 TinyUlt. All rights reserved. //#include <iostream> using namespace std;#define MAX_REPERTORY 144 typedef unsigned char BYTE; typedef unsigned short WORD; //數組維數 #ifndef CountArray #define CountArray(Array) (sizeof(Array)/sizeof(Array[0])) #endif const BYTE m_cbCardDataArray[MAX_REPERTORY]= {0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09, //萬子0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09, //萬子0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09, //萬子0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09, //萬子0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19, //同子0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19, //同子0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19, //同子0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19, //同子0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29, //索子0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29, //索子0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29, //索子0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29, //索子0x31,0x32,0x33,0x34, //風牌0x31,0x32,0x33,0x34, //風牌0x31,0x32,0x33,0x34, //風牌0x31,0x32,0x33,0x34, //風牌0x41,0x42,0x43, //箭牌0x41,0x42,0x43, //箭牌0x41,0x42,0x43, //箭牌0x41,0x42,0x43, //箭牌0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58, //花牌}; //混亂撲克 static void RandCardData(BYTE cbCardData[],BYTE cbMaxCount) {//混亂準備BYTE cbCardDataTemp[CountArray(m_cbCardDataArray)];//為什么直接用MAX_REPERTORY? 由于這樣無耦合memcpy(cbCardDataTemp,m_cbCardDataArray,sizeof(m_cbCardDataArray));//拷貝一份到暫時牌數組中//混亂撲克(關鍵的核心打亂代碼)BYTE cbRandCount=0,cbPosition=0;do{cbPosition=rand()%(cbMaxCount-cbRandCount);cbCardData[cbRandCount++]=cbCardDataTemp[cbPosition];cbCardDataTemp[cbPosition]=cbCardDataTemp[cbMaxCount-cbRandCount];} while (cbRandCount<cbMaxCount);return;} //混亂撲克2 void RandAppointCardData(BYTE cbCardData[],BYTE cbMaxCount,BYTE OriginalData[]/*源牌堆數據*/) {//混亂撲克BYTE cbRandCount=0,cbPosition=0;do{cbPosition=rand()%(cbMaxCount-cbRandCount);cbCardData[cbRandCount++]=OriginalData[cbPosition];OriginalData[cbPosition]=OriginalData[cbMaxCount-cbRandCount];} while (cbRandCount<cbMaxCount);return; }int main(int argc, const char * argv[]) {// insert code here.../*第一種混亂*///創建一個空牌堆BYTE _cardData1[MAX_REPERTORY];//把在該函數中創建并打亂牌堆,然后把指針傳給_cardData;RandCardData(_cardData1, MAX_REPERTORY);//輸出牌數據for (int i = 0 ; i < MAX_REPERTORY; i++) {cout<<hex<<int(_cardData1[i])<<" ";}cout<<endl;/*另外一種混亂*///創建一個空牌堆BYTE _cardData2[MAX_REPERTORY];//把在該函數中創建并打亂牌堆,然后把指針傳給_cardData;RandAppointCardData(_cardData2, MAX_REPERTORY,_cardData1);//輸出牌數據for (int i = 0 ; i < MAX_REPERTORY; i++) {cout<<hex<<int(_cardData2[i])<<" ";}cout<<endl;return 0; } 輸出:
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_INDEX 42//最大索引
BYTE cbCardIndex[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], 這樣我們就能夠用牌型值來取該類型牌的數量了
直接上代碼了 ?不早了 該睡覺了
輸出:
混亂初始牌堆
0x25 0x13 0x1 0x3 0x21 0x43 0x54 0x14 0x9 0x12 0x13 0x8 0x31 0x24 0x13 0x31 0x6 0x4 0x28 0x31 0x34 0x18 0x7 0x27 0x15 0x18 0x51 0x11 0x42 0x12 0x28 0x2 0x57 0x25 0x16 0x4 0x33 0x15 0x18 0x21 0x42 0x33 0x29 0x41 0x25 0x3 0x23 0x55 0x14 0x41 0x27 0x22 0x34 0x21 0x2 0x9 0x29 0x19 0x43 0x23 0x22 0x22 0x19 0x34 0x16 0x15 0x32 0x58 0x6 0x28 0x17 0x21 0x18 0x8 0x43 0x28 0x33 0x32 0x6 0x33 0x2 0x25 0x14 0x11 0x29 0x19 0x26 0x13 0x4 0x24 0x53 0x52 0x16 0x15 0x27 0x3 0x27 0x31 0x9 0x1 0x26 0x22 0x3 0x32 0x17 0x26 0x26 0x7 0x12 0x42 0x41 0x32 0x17 0x8 0x7 0x9 0x34 0x8 0x7 0x16 0x17 0x41 0x19 0x5 0x29 0x2 0x23 0x6 0x4 0x24 0x42 0x24 0x1 0x56 0x11 0x1 0x12 0x5 0x23 0x11 0x14 0x43 0x5 0x5?
混亂指定牌堆
0x16 0x56 0x21 0x7 0x28 0x14 0x41 0x12 0x16 0x24 0x43 0x21 0x31 0x26 0x3 0x53 0x52 0x7 0x12 0x34 0x51 0x14 0x9 0x29 0x23 0x33 0x12 0x31 0x14 0x6 0x16 0x18 0x54 0x21 0x25 0x58 0x19 0x5 0x7 0x28 0x32 0x34 0x1 0x27 0x27 0x33 0x6 0x14 0x9 0x17 0x25 0x33 0x28 0x11 0x17 0x24 0x43 0x2 0x22 0x6 0x23 0x3 0x11 0x42 0x2 0x18 0x3 0x4 0x42 0x4 0x18 0x55 0x25 0x42 0x22 0x32 0x4 0x15 0x8 0x29 0x24 0x13 0x6 0x26 0x19 0x9 0x41 0x25 0x7 0x8 0x1 0x13 0x11 0x15 0x41 0x43 0x57 0x16 0x33 0x18 0x32 0x27 0x1 0x8 0x12 0x31 0x4 0x5 0x27 0x22 0x26 0x23 0x31 0x2 0x5 0x17 0x26 0x13 0x19 0x43 0x17 0x21 0x42 0x5 0x3 0x19 0x23 0x15 0x28 0x15 0x8 0x24 0x9 0x29 0x13 0x32 0x34 0x2 0x34 0x41 0x11 0x29 0x22 0x1?
輸出牌堆中全部牌型相應的數量
0x1:0 0x2:0 0x3:0 0x4:0 0x5:0 0x6:0 0x7:1 0x8:0 0x9:0 0x11:0 0x12:1 0x13:0 0x14:1 0x15:0 0x16:2 0x17:0 0x18:0 0x19:0 0x21:2 0x22:0 0x23:0 0x24:1 0x25:0 0x26:1 0x27:0 0x28:1 0x29:0 0x31:1 0x32:0 0x33:0 0x34:0 0x41:1 0x42:0 0x43:1 0x51:0 0x52:0 0x53:0 0x54:0 0x55:0 0x56:1 0x57:0 0x58:0?
Program ended with exit code: 0
與50位技術專家面對面20年技術見證,附贈技術全景圖
總結
以上是生活随笔為你收集整理的cocos2dx 制作单机麻将(二)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: jsonp+ajax实现浏览器跨域通信
- 下一篇: SpringMVC4+JPA(Hiber