標籤:style blog os io strong ar for 2014 art
今天開始打算解說下cocos2dx下怎樣製作國標麻將
前半部分先解說麻將的邏輯部分,由雩都是代碼,可能會比較枯燥無聊. 這部分講完後,你也能夠用其它遊戲引擎來製作麻將
後半部分,就解說餘下的cocos2dx部分, 由於要把這部分留到後面講,主要是還在考慮用3d做還是用2d做.
到最後能夠擴充AI部分的機器人 和 server模組
cocos2dx 製作單機麻將(一)
麻將邏輯1. 打亂麻將順序(初始化牌堆)
國標麻將共同擁有144張牌
#define MAX_REPERTORY 144
先把全部的牌放入一個常量數組中儲存
每種牌都是1-9 共同擁有4張, 風牌就是東南西北,箭牌就是中發白,花牌就是花牌 (春夏秋冬)梅蘭竹菊
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,//花牌
};
有了順序的數組,然後就能夠打亂
打亂牌的函數
//混亂撲克
#define CountArray(Array) (sizeof(Array)/sizeof(Array[0]))
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;
}
這樣調用
BYTE _cardData[MAX_REPERTORY];
RandCardData(_cardData, MAX_REPERTORY);
以下是完整的控制台代碼
//// 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 144typedef unsigned char BYTE;//數組維數#ifndef CountArray#define CountArray(Array) (sizeof(Array)/sizeof(Array[0]))#endifconst 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; }int main(int argc, const char * argv[]) { // insert code here... BYTE _cardData[MAX_REPERTORY]; RandCardData(_cardData, MAX_REPERTORY); for (int i = 0 ; i < MAX_REPERTORY; i++) { cout<<hex<<int(_cardData[i])<<" "; } 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 5Program ended with exit code: 0
cocos2dx 製作單機麻將(一)