今天開始打算解说下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 144
typedef unsigned char BYTE; //数组维数
#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; } 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 制作单机麻将(一)的更多相关文章

  1. cocos2dx 制作单机麻将(二)

    cocos2dx 制作单机麻将(二) 打乱麻将顺序2 前面解说了怎样打乱初始给定的麻将牌堆, 另一种是打乱随意给定的麻将牌堆 //混乱扑克2 void RandAppointCardData(BYTE ...

  2. cocos2dx 制作单机麻将(四)

    cocos2dx 制作单机麻将(四) 麻将逻辑5.模拟出牌 // // main.cpp // MajiangLogicTest // // Created by TinyUlt on 14-8-16 ...

  3. cocos2dx 制作单机麻将(五)

    cocos2dx 制作单机麻将(五) 麻将逻辑6 最基础的4人麻将逻辑(轮流循环出牌, 之前学的都能用上  跑起来了!!!) 最基础的麻将逻辑 依据自己须要 设置麻将人数GAME_PLAYER 基本流 ...

  4. 使用cocos2d-x制作 Texture unpacker

    使用cocos2d-x制作 Texture unpacker 没错,就是unpacker. 在大多数游戏包里面,可以找到很多纹理图集,他们基本上是用texture packer制作的,有plist文件 ...

  5. cocos2dx 使得单麻将(三)

    cocos2dx 使得单麻将(三) 麻将逻辑4.得到手牌数据 我们已经保存了一个一维数组, 类似于一个表格,统计出全部牌相应的数量, 但我们如何得到当前手中是什么牌呢 //扑克转换 BYTE Swit ...

  6. 只需要一点点C++基础,新手也可以制作单机游戏内存修改器

    声明:本文只是为了初学C++的,能够做出一些实用的东西,跳出管理系统的束缚,提升学习的兴趣,在这里选取了单机游戏,请不要尝试在线游戏,违发而已未必可行.序:首先我们需要一个Qt+VS环境Qt从http ...

  7. cocos2d-x 制作系统公告

    2013-12-15 21:57:33 下载地址:http://download.csdn.net/detail/jackyvincefu/6434549 (摘自:CSDN资源) CTestLayer ...

  8. cocos2d-x 制作资源下载页面

    开发游戏中用到从http 服务器下载文件的操作,所以要有个界面显示下载进度,同时联网采用curl库,因为下载是同步的操作,所以用了多线程 啥也不说,直接贴代码.我是采用ccbi做的页面,你也可以做一个 ...

  9. 【cocos2d-x制作别踩白块儿】第一期:游戏介绍

    这一系类文章.我们将来分析时下最火的一款游戏 -- 别踩白块儿. 无图无真相,先上图 这就是我们终于要完毕项目的效果图. 游戏刚開始的最以下有一栏为黄色,紧接着上面每一行都是有一个黑色块,其余为白色块 ...

随机推荐

  1. 微软vs2015先行,Visual Studio 2015正式版离线iso及在线下载(附key)附带百度云盘地址

    win10正式版发布之前我们迎来了vs2015正式版,迫不及待要下载朋友可以看看 Visual Studio Community 2015简体中文版(社区版,针对个人免费): 在线安装exe:http ...

  2. 实战ajax

    原文:实战ajax 实战ajax Ajax的原理简单来说通过XmlHttpRequest对象来向服务器发异步请求,从服务器获得数据,然后用javascript来操作DOM而更新页面. 大家都知道aja ...

  3. 我的mysql数据库sql优化原则

    原文 我的mysql数据库sql优化原则 一.前提 这里的原则 只是针对mysql数据库,其他的数据库 某些是殊途同归,某些还是存在差异.我总结的也是mysql普遍的规则,对于某些特殊情况得特殊对待. ...

  4. Android中吐司当前电池电量

    /** * * @author chrp * *土司当当电池电量 */ public class MainActivity extends Activity { class BtteryReceive ...

  5. POJ2782:Bin Packing

    Description   A set of n<tex2html_verbatim_mark> 1-dimensional items have to be packed in iden ...

  6. Windows下用Mingw编译Boost.Regex库

    下载Boost库,解压. 定位到regex库文件夹下. GCC所对应的MAKEFILE为gcc.mak 进入命令提示符下,输入make -f gcc.mak 这是如果直接按回车执行的话,会出现错误: ...

  7. Swift - 启动时的向导页(新手引导)的制作

    在很多iOS产品或者一些应用版本的升级中,新手指导都是一个常用的功能,通过说明页的左右滑动,可以很清晰的展示系统的一些功能特性.制作思路如下: 1,如何检测应用是第一次登陆启动 我们可以使用NSUse ...

  8. Delphi XE7 用indy开发微信公众平台所有功能(10篇博客)

    http://www.cnblogs.com/devinlee/p/4282498.html http://www.cnblogs.com/devinlee/p/4565933.html

  9. Lucene.Net 2.3.1开发介绍 —— 四、搜索(三)

    原文:Lucene.Net 2.3.1开发介绍 -- 四.搜索(三) Lucene有表达式就有运算符,而运算符使用起来确实很方便,但另外一个问题来了. 代码 4.3.4.1 Analyzer anal ...

  10. Swift - 区间运算符(... 和 ..<)

    区间运算符可以用来表示两个操作数之间的范围集合. 1,闭区间运算符:a...b 1 2 3 for iCount in 512...1024{      //从512遍历到1024(包括1024) } ...