今天開始打算解说下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. paip.提升用户体验---c++ qt自定义窗体(1)---标题栏的绘制

    源地址:http://blog.csdn.net/attilax/article/details/12343625 paip.提升用户体验---c++ qt自定义窗体(1)---标题栏的绘制 效果图: ...

  2. 菜单组件——axure线框图部件库介绍

    软件类的教程,我写不出长篇大论,这里面的都是基础的操作,希望初学者,根据一个功能演示,可以自己测试其他功能菜单的效果! Axure自带的菜单组件,我几乎没有用到过,做菜单导航,我第一时间想到的还是矩形 ...

  3. 进阶:案例三: Upload File using WebDynpro

    1.节点创建,其中DATASOURCE存放uploadfile名称 2.layout布局 3.upload事件代码: method ONACTIONUPLOAD . DATA: lo_Node typ ...

  4. webdynpro MESSGAE

    1.  添加辅助类CL_WDR_DEMO_MESSAGES 环境,设计的控件有:输入控件,按钮,每个按钮对应一个事件.分别是下面,然后报消息 TEXT: SUCCESS: method ONACTIO ...

  5. 页面导出生成pdf,使用wkhtmltopdf第三方工具

    把页面导出生成pdf,这里用到第三方的工具,使用方法中文文档没有找到,网上也没找到网友详细的神作.没有深入研究,所以也不赘述了,当然最基本的使用大多数也够用了,详细参数的官网也没介绍,大家使用的时候, ...

  6. Spring拦截器中通过request获取到该请求对应Controller中的method对象

    背景:项目使用Spring 3.1.0.RELEASE,从dao到Controller层全部是基于注解配置.我的需求是想在自定义的Spring拦截器中通过request获取到该请求对应于Control ...

  7. java中怎么判断一个字符串中包含某个字符或字符串

    public static void main(String[] args) { String str="ABC_001"; ){ System.out.println(" ...

  8. 算法设计与分析——多边形游戏(DP)

    1.问题描述:   给定N个顶点的多边形,每个顶点标有一个整数,每条边上标有+(加)或是×(乘)号,并且N条边按照顺时针依次编号为1~N.下图给出了一个N=4个顶点的多边形. 游戏规则 :(1) 首先 ...

  9. ext4 delalloc相关

    ext4文件系统delayed allocation相关研究 最近在一个项目上测试录音时,发现有丢数据的现象.通过串口发现打出了很多overrun的log. overrun是驱动层给上层应用的一个通知 ...

  10. 3D-HEVC/HTM测试序列下载地址(官方完整版)

    最新3DV通用测试条件Common TestConditions of 3DV Core Experiments(JCT3V-E1100)中给出了所有标准测试序列的下载地址,有需要的朋友可以看看! 标 ...