cocos2dx 製作單機麻將(一)

來源:互聯網
上載者:User

標籤: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 5
Program ended with exit code: 0




cocos2dx 製作單機麻將(一)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.