使用cocos creator使用c写房卡麻将应该是怎样的结构

cocos2dx 制作单机麻将(六)
cocos2dx 制作单机麻将(六)
当项目做到这时, 会发现项目结构不是太美. 如果接着按照这样面向结构的方式写的话, 就会非常的乱. 这章我们来讨论如何用面向对象的方式写麻将.
标准的麻将(联网的) 会分为服务器模块, 客户端模块, 逻辑模块. 服务器模块必须由逻辑模块支持, 客户端模块很少用到逻辑模块,大多是从服务器发来的判断结果,必要时还是会用到逻辑模块. 因为逻辑模块需要共用, 所以里面都是调用的接口,返回服务器和客户端需要的结果值.
客户端触发开始发生给服务端 > 服务端开始游戏 > 通过逻辑模块得到整理好的牌堆 > 服务端通过牌堆和规则计算拿到各个玩家的手牌 > 把手牌数据发到指定客户端 > 客户端根据发来的牌数据显示牌 > 用户打牌 > 客户端把用户想打的牌发送给服务端 > 服务端通过逻辑模块得出该牌能否打并计算是否有吃碰杠之类的操作, 如果能打(如果有操作牌也是这样) > 把这张能打的牌发给客户端 > 客户端得到该牌并显示出牌动画
所以客户端只负责接受需要绘制的消息, 那些逻辑一般都交给服务端. 客户端的逻辑一般就是判断服务器发来的是哪种消息, 根据不同消息绘制界面.
现在想想 服务端模块, 客户端模块, 逻辑模块 哪个最难?
最难的应该是逻辑模块, 其次是客户端, 最简单是服务端.
服务端最简单是因为他只负责发送数据,那些逻辑判断只要调用逻辑模块, 当然还要存储所有玩家的牌数据. 客户端的话因为也可能要绘制各个玩家牌,所以也要存储玩家的牌数据.
项目内容每增加一点, 服务端只要添加一个值来存储增加的内容, 而逻辑和客户端就要改很多东西.
在我们这个项目中,因为没有服务端, 所以我们让客户端模块直接和逻辑模块进行交互(虽然客户端只是控制台窗口), 首先应该把游戏逻辑模块单独出来, 放在逻辑类中. 客户端模块应该按照面向对象的方式组织
该项目中的客户端比较简单, 只有一个玩家对象和牌堆对象
目前这些对象中的属性和方法都很少.
添加了几个类和文件
CMD_Sparrow.h
MajiangLogicTest
Created by TinyUlt on 14-8-17.
Copyright (c) 2014年 TinyUlt. All rights reserved.
#ifndef MajiangLogicTest_CMD_Sparrow_h
#define MajiangLogicTest_CMD_Sparrow_h
#define MAX_REPERTORY 144
typedef unsigned char BYTE;
typedef unsigned short WORD;
//数组维数
#ifndef CountArray
#define CountArray(Array) (sizeof(Array)/sizeof(Array[0]))
//逻辑掩码
#define MASK_COLOR
//花色掩码
#define MASK_VALUE
//数值掩码
#define MAX_INDEX 42
//最大索引
#define MAX_COUNT
//最大数目
#define GAME_PLAYER
//游戏人数
MajiangLogicTest
Created by TinyUlt on 14-8-17.
Copyright (c) 2014年 TinyUlt. All rights reserved.
#ifndef __MajiangLogicTest__CPile__
#define __MajiangLogicTest__CPile__
#include "CMD_Sparrow.h"
class CPile
BYTE m_cardPile[MAX_REPERTORY];
//摸牌位置
BYTE m_currentI
//得到牌堆数据
BYTE* getCardPile();
//取一张牌
BYTE takeOnCard();
//根据索引获取牌的数据
BYTE getCardDataByIndex(BYTE index);
//得到当前牌堆中牌的数量
BYTE getCount();
#endif /* defined(__MajiangLogicTest__CPile__) */
MajiangLogicTest
Created by TinyUlt on 14-8-17.
Copyright (c) 2014年 TinyUlt. All rights reserved.
#include "CPile.h"
CPile::CPile()
m_currentIndex = 0;
BYTE* CPile::getCardPile()
return m_cardP
BYTE CPile::getCardDataByIndex(BYTE index)
return m_cardPile[index];
BYTE CPile::takeOnCard()
return m_cardPile[m_currentIndex++];
BYTE CPile::getCount()
return MAX_REPERTORY - m_currentI
MajiangLogicTest
Created by TinyUlt on 14-8-17.
Copyright (c) 2014年 TinyUlt. All rights reserved.
#ifndef __MajiangLogicTest__CUser__
#define __MajiangLogicTest__CUser__
#include "CMD_Sparrow.h"
class CUser
//存储牌数据的容器
BYTE m_cardsIndexStore[MAX_INDEX];
#endif /* defined(__MajiangLogicTest__CUser__) */
CGameLogic.h
MajiangLogicTest
Created by TinyUlt on 14-8-17.
Copyright (c) 2014年 TinyUlt. All rights reserved.
#ifndef __MajiangLogicTest__CGameLogic__
#define __MajiangLogicTest__CGameLogic__
#include "CMD_Sparrow.h"
class CGameLogic
//变量定义
protected:
static const BYTE
m_cbCardDataArray[MAX_REPERTORY];
//扑克数据
static const char*
m_cbCardWordArray[MAX_INDEX];
//中文扑克
//混乱扑克
static void RandCardData(BYTE cbCardData[],BYTE cbMaxCount);
//混乱扑克2
static void RandAppointCardData(BYTE cbCardData[],BYTE cbMaxCount,BYTE OriginalData[]/*源牌堆数据*/);
//扑克转换(索引->牌值)
static BYTE SwitchToCardData(BYTE cbCardIndex);
//扑克转换(牌型->索引)
static BYTE SwitchToCardIndex(BYTE cbCardData);
//扑克转换
static BYTE SwitchToCardData(BYTE cbCardIndex[MAX_INDEX]/*传入统计所有牌数量的表格*/, BYTE cbCardData[MAX_COUNT]/*传出手牌数据*/);
//删除扑克
static bool RemoveCard(BYTE cbCardIndex[MAX_INDEX], BYTE cbRemoveCard);
//根据中文牌,得到牌索引
static int getIndexByWord(const char* ch);
//根据牌索引,得到中文牌
static const char* getWordByIndex(int index);
//根据牌型值,得到中文牌
static const char* getWordByData(BYTE cbCardData);
//轮转玩家
static int changePlayer(int id);
#endif /* defined(__MajiangLogicTest__CGameLogic__) */
CGameLogic.cpp
MajiangLogicTest
Created by TinyUlt on 14-8-17.
Copyright (c) 2014年 TinyUlt. All rights reserved.
#include "CGameLogic.h"
//扑克数据
const BYTE CGameLogic::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,
const char* CGameLogic::m_cbCardWordArray[MAX_INDEX]=
"一万","二万","三万","四万","五万","六万","七万","八万","九万",
"一筒","二筒","三筒","四筒","五筒","六筒","七筒","八筒","九筒",
"一索","二索","三索","四索","五索","六索","七索","八索","九索",
"东", "南", "西", "北", "中", "发", "白",
"春", "夏", "秋", "冬", "梅", "兰", "竹", "菊"
void CGameLogic::RandCardData(BYTE cbCardData[],BYTE cbMaxCount)
//混乱准备
BYTE cbCardDataTemp[CountArray(m_cbCardDataArray)];//为什么直接用MAX_REPERTORY? 因为这样无耦合
memcpy(cbCardDataTemp,m_cbCardDataArray,sizeof(m_cbCardDataArray));//拷贝一份到临时牌数组中
//混乱扑克(关键的核心打乱代码)
BYTE cbRandCount=0,cbPosition=0;
cbPosition=rand()%(cbMaxCount-cbRandCount);
cbCardData[cbRandCount++]=cbCardDataTemp[cbPosition];
cbCardDataTemp[cbPosition]=cbCardDataTemp[cbMaxCount-cbRandCount];
} while (cbRandCount<cbMaxCount);
//混乱扑克2
void CGameLogic::RandAppointCardData(BYTE cbCardData[],BYTE cbMaxCount,BYTE OriginalData[]/*源牌堆数据*/)
//混乱扑克
BYTE cbRandCount=0,cbPosition=0;
cbPosition=rand()%(cbMaxCount-cbRandCount);
cbCardData[cbRandCount++]=OriginalData[cbPosition];
OriginalData[cbPosition]=OriginalData[cbMaxCount-cbRandCount];
} while (cbRandCount牌值)
BYTE CGameLogic::SwitchToCardData(BYTE cbCardIndex)
//assert(cbCardIndex<42);
if(cbCardIndex<31)
return ((cbCardIndex/9)<=31&&cbCardIndex<=33)
return(((cbCardIndex/7)<33)
return(cbCardIndex+0x2F);
//assert(false);
//扑克转换(牌型->索引)
BYTE CGameLogic::SwitchToCardIndex(BYTE cbCardData)
ASSERT(IsValidCard(cbCardData));
if((cbCardData&MASK_COLOR)>4)*9+(cbCardData&MASK_VALUE)-1);
if((cbCardData&MASK_COLOR)==0x40)
return (31+(cbCardData&MASK_VALUE)-1);
if((cbCardData&MASK_COLOR)==0x50)
return (34+(cbCardData&MASK_VALUE)-1);
//ASSERT(false);
//扑克转换
BYTE CGameLogic::SwitchToCardData(BYTE cbCardIndex[MAX_INDEX]/*传入统计所有牌数量的表格*/, BYTE cbCardData[MAX_COUNT]/*传出手牌数据*/)
//转换扑克
BYTE cbPosition=0;
for (BYTE i=0;i<MAX_INDEX;i++)
if (cbCardIndex[i]!=0)
for (BYTE j=0;j<cbCardIndex[i];j++)
// ASSERT(cbPosition<MAX_COUNT);
cbCardData[cbPosition++]=SwitchToCardData(i);
return cbP//返回手牌数
//根据中文牌,得到牌索引
int CGameLogic::getIndexByWord(const char* ch)
for (int i = 0; i 0);
//删除扑克
if (cbCardIndex[cbRemoveIndex]>0)
cbCardIndex[cbRemoveIndex]--;
//失败效验
// ASSERT(FALSE);
//轮转玩家
int CGameLogic::changePlayer(int id)
if (id>=GAME_PLAYER) {
MajiangLogicTest
Created by TinyUlt on 14-8-16.
Copyright (c) 2014年 TinyUlt. All rights reserved.
最基础的麻将逻辑
根据自己需要 设置麻将人数GAME_PLAYER
初始化牌堆,
玩家0摸13张牌
玩家1摸13张牌
玩家2摸13张牌
玩家3摸13张牌
庄家摸一张牌
庄家摸一张牌
牌堆数为0 结束
其他功能 比如 碰吃杠听胡等等 先不实现
#include "CGameLogic.h"
#include "CPile.h"
#include "CUser.h"
//混乱扑克
int main(int argc, const char * argv[])
// insert code here...
//创建摸牌堆
//创建玩家
CUser _users[GAME_PLAYER];
//出牌的次数
BYTE _outCardTime = 0;
//庄家用户索引
BYTE _bankerId = rand()%GAME_PLAYER;
/*第一种混乱法*/
//得到牌堆数据
CGameLogic::RandCardData(_pile.getCardPile(), MAX_REPERTORY);
//输出牌堆数据
cout<<"混乱初始牌堆"<<
for (int i = 0 ; i < MAX_REPERTORY; i++)
cout<<hex<<"0x"<<int(_pile.getCardDataByIndex(i))<<" ";
cout<<endl<<
//初始化玩家的牌数据
for (int j = 0; j < GAME_PLAYER; j++)
for ( int i = 0; i < MAX_COUNT-1; i++)
BYTE _cardValue = _pile.takeOnCard();//得到牌堆中的牌
int _index = CGameLogic::SwitchToCardIndex(_cardValue);//得到该牌对应的索引
_users[j].m_cardsIndexStore[_index]++;//该牌型加一
cout<<"-----------------------------------"<<
for (int j = 0; j< GAME_PLAYER; j++)
cout<<"玩家"<<j<<"的牌数据:"<<
for (int i = 0; i< MAX_INDEX; i++)
cout<<hex<<CGameLogic::getWordByIndex(i)<<"(0x"<<int(CGameLogic::SwitchToCardData(i))<<"):"<<dec<<(int)_users[j].m_cardsIndexStore[i]<<" ";//输出手牌中所有牌型对应的数量
cout<<endl<<
cout<<"-----------------------------------"<<
for (int j = 0; j< GAME_PLAYER; j++)
cout<<"玩家"<<j<<"的手牌:"<<
BYTE _handCardData[MAX_COUNT];
int _handandsCount = (int)CGameLogic::SwitchToCardData(_users[j].m_cardsIndexStore,_handCardData);
for (int i = 0; i< _handandsC i++)
cout<<CGameLogic::getWordByData(_handCardData[i])<<"(0x"<<hex<<(int)_handCardData[i]<<") ";
cout<<endl<<
cout<<"-----------------------------------"<<
//初始化工作做好后, 开始麻将的出牌逻辑循环
cout<<"庄家: 玩家"<<(int)_bankerId<0)
//出牌次数
cout<<"共出牌次数:"<<dec<<(int)_outCardTime<<
//准备出牌的玩家先从牌堆中取牌
BYTE _cardValue = _pile.takeOnCard();//得到牌堆中的牌
int _index = CGameLogic::SwitchToCardIndex(_cardValue);//得到该牌对应的索引
_users[_currentPlayer].m_cardsIndexStore[_index]++;//该牌型加一
cout<<"从牌堆中取牌:"<<CGameLogic::getWordByData(_cardValue)<<
cout<<"牌堆剩余:"<<dec<<(int)_pile.getCount()<<
//显示手牌
BYTE _handCardData[MAX_COUNT];
int _handandsCount = (int)CGameLogic::SwitchToCardData(_users[_currentPlayer].m_cardsIndexStore,_handCardData);
cout<<"玩家"<<_currentPlayer<<"的手牌有"<<dec<<_handandsCount<<"张:"<<
for (int i = 0; i< _handandsC i++)
cout<<CGameLogic::getWordByData(_handCardData[i])<<"(0x"<<hex<<(int)_handCardData[i]<<") ";
//输入要出的牌
char ch[20];
cout<<"玩家"<<_currentPlayer<>
int _outCardIndex = CGameLogic::getIndexByWord(ch);
if (_outCardIndex == -1)
cout<<"输入错误,请重新输入"<<
//根据索引得到麻将牌型值
BYTE _outCardValue = CGameLogic::SwitchToCardData(_outCardIndex);
//根据牌型值删除手中的牌
bool _b = CGameLogic::RemoveCard(_users[_currentPlayer].m_cardsIndexStore, _outCardValue);
cout<<"出牌成功,轮到下家"<<
_outCardTime++;
cout<<"输入错误,请重新输入"<<
//显示手牌
BYTE _handCardData[MAX_COUNT];
int _handandsCount = (int)CGameLogic::SwitchToCardData(_users[_currentPlayer].m_cardsIndexStore,_handCardData);
cout<<"出牌后玩家"<<_currentPlayer<<"的手牌有"<<dec<<_handandsCount<<"张:"<<
for (int i = 0; i< _handandsC i++)
cout<<CGameLogic::getWordByData(_handCardData[i])<<"(0x"<<hex<<(int)_handCardData[i]<<") ";
cout<<"-----------------------------------"<<
_currentPlayer = CGameLogic::changePlayer(_currentPlayer);房卡麻将开发系列之”Cocos3D升级”方案
房卡麻将开发系列之&Cocos3D升级&方案。腾讯的&欢迎麻将3D&让很多玩家感受到了3D麻将游戏,立体的桌面,真实的人物抓牌动作,各种炫酷的特效令长期玩2D麻将的牌友耳目一新。自上线以来,广受玩家的喜爱。那么,我们的房卡麻将是否也可以做成3D的呢?怎么做才是最现实的呢?这一节我来给大家谈谈这个话题。
首先,一般进行3D游戏开发,需要一款合适的3D引擎,对于一般手游开发,大多数首选是Unity3D,但是对于麻将,特别是房卡麻将,这可能并不是一个最佳选择,为什么呢?
大多数基于Cocos2D-x引擎进行房卡麻将手游开发的团队,如果要转向Unity3D,则需要面对一个非常头痛的问题:
开发语言和工具的不同,无法延用之前的代码或经验。
作为一个从事房卡棋牌研发的团队,放弃掉长期以来的Cocos2d-x研发经验以及现有的版本参考,从头开始进行3D项目框架搭建,从新学习语言,工具,开发流程,热更新方式,以及3D研发中的各种坑。这里面的风险还是太大了。先不说需要多久,时间成本的问题。即使团队具备一定的基础,能够完成项目的开发和优化,如何与之前的版本进行整合又是一个大问题?
那有没有什么好的办法呢?
有的,因为房卡麻将大多基于Cocos2d-x进行开发,很多开发团队不论是在开发,编辑工具,性能优化,LUA热更,以及SDK接入等等方面都积累了宝贵的经验。更重要的是Cocos2d-x在市面上也有大量可以参考的源代码。所以,基于Cocos2d-x直接进行3D方面模块的改造其实是非常棒的一条路。
Cocos3D!房卡棋牌游戏3D化改造的最佳之选!
为什么这么说呢?最直接的原因是因为可以最大程度的保留原有项目的代码,经验,开发人员,缩短开发周期。Cocos3D是cocos2d-x 3.0版本之后的增量功能模块,Cocos3D本身包含了一些重要而又常用的3D类模块,包括用于模型导入和显示的Sprite3D,以及用于管理骨骼动画的Animation3D,播放动画的ActionInterval子类Animate3D等等,这些类严格按照Cocos2d-x引擎代码框架风格习惯来设计。可以方便的对于3D模型,动画进行加载和处理,又可以与cocos2d-x游戏项目无缝结合。开发人员只需要稍花点时间学习下就可以上手修改,不用担心对项目框架产生任何影响。这将极大的降低升级3D的风险和成本,减少改造的时间周期,并且可以通过热更新直接将原有的2D麻将更新成3D麻将或2D与3D并存的麻将。
下面我给大家介绍一下基本的方法:
首先,如果要在目前的Cocos2d-x项目中增加3D的模型,需要确认一下当前所用的Cocos2d-x引擎版本是否为3.0以上。因为只有Cocos2d-x3.0以上版本才提供了相关的3D模块。
如果你的工程是使用Cocos2d-x 3.0以上版本开发的,恭喜你,你可以直接开始相应的开发了。但在之前,还是要了解一些类和功能:
( 1 ) Camera :摄像机类,提供对于3D场景进行观察的视口和观察投影矩阵形成参数。
//创建一个摄像机,用于观察当前Layer中的3D模型。
auto _camera3D = cocos2d::Camera::createPerspective(60, visibleSize.width / visibleSize.height, 0.1, 5000);
//设置摄像机位置
_camera3D-&setPosition3D(Vec3(0, 7.5, 0));
//设置摄像机观察点位置
_camera3D-&lookAt(Vec3(0, 7.5, 50));
//设置摄像机标记,用于筛选要观察显示的模型
_camera3D-&setCameraFlag(CameraFlag::USER1);
//加入到当前Layer中
this-&addChild(_camera3D, 0, 1);
(2) Sprite3D:3D精灵类,提供对于由FBX转换的C3B或C3T模型文件进行加载和渲染。它的使用类似2D中的Sprite,但create函数传入的参数是模型文件名。
(3) Animation3D:骨骼动画数据管理类,用于从C3B或C3B模型文件中加载骨骼动画数据。
(4) Animate3D:骨骼动画类,用于从指定帧到另一指定帧创建出一个动画给Sprite3D进行播放。
//创建一个人物模型,
Sprite3D* m_roleMode = Sprite3D::create(C3BFile);
if (m_roleMode)
//设置不使用ALPHA BLEND
m_roleMode-&setBlendFunc(BlendFunc::DISABLE);
//受标记为CameraFlag::USER1的摄像机观察处理
m_roleMode-&setCameraMask(2);
//设置位置
m_roleMode-&setPosition3D(Vec3(0, 0.0, 50));
this-&addChild(m_roleMode);
//从模型文件中加载骨骼动画数据
Animation3D* m_roleAnimation = Animation3D::create(C3BFile);
//从0帧 到 80帧创建出一个动画
Animate3D* animate = Animate3D::createWithFrames(m_roleAnimation, 0, 80);
//设置一个动画序列
Sequence* seq = Sequence::create(DelayTime::create(fDelayTime), Show::create(), animate, CallFunc::create(CC_CALLBACK_0(GamePlayer::playNext, this)), pCallFunc,nullptr);
//Sprite3D进行动画序列
m_roleMode-&runAction(seq);
其实主要的类就是这四个,在使用之前,还需要由美术对模型进行建模和导出成FBX,并用Cocos引擎中的fbx-conv工具通过命令行进行转换,将FBX转换为c3b或c3t文件,当然一般都是c3b二进制文件啦。
其实整个过程的使用还是比较简单的,对于大部分棋牌研发团队并不算什么难题。实在不懂也可以看看我之前在CSDN上做的视频教程:http://edu.csdn.net/course/detail/1330
技术上的事情并不复杂,Cocos3D是很轻量的,对于同样轻量的棋牌项目的3D化改造工作是绝配,主要还是团队信心和执行力。
最后, 大家分享一些我们团队使用Cocos3D开发的游戏产品。房卡麻将开发需要多少钱?【游戏开发吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:30,636贴子:
房卡麻将开发需要多少钱?收藏
房卡麻将开发需要多少钱呢?我来告诉你!一、自己组建团队,进行棋牌游戏开发假设自己招募团队的话,至少需要招募cocos2d或者unity3d工程师一名、服务端开发工程师一名、美工一名,这个基本是最低配了。开发平台的时间差不多2个月,每增加1款游戏差不多增加1个月。假设要有6款游戏,那么整体下来差不多要8-9个月。棋牌游戏开发工程师的工资基本都是超过一万的,主管的话至少的开出1.5万到2万,3个开发工程师保守一个月4万元工资。6款游戏下来整体人力成本接近40万元。此外,还有办公成本、管理费用需要分摊。所以自己来组建团队的话,即使你只开发两三款游戏,也要二十万左右的人力投入,更何况游戏团队的组建并不是门外汉能做的事情,如果不是在一线城市或者高薪的话,很难把这批人招募到自己团队里,没有这些技术人员开发就无从谈起。即使你幸运地招募到这批技术团队,并且这些优秀的棋牌游戏开发工程师愿意兢兢业业勤勤恳恳踏踏实实认认真真地帮你把项目做完,后期这班人你打算怎么处理?继续他们开发更多的游戏还是让他们整天在公司里逛逛淘宝喝喝茶抽抽烟依旧给他们算工资?或者是花一笔钱把他们礼貌地打发走?如果打发走了他们后期游戏的维护和运营怎么办?因此,从经济的角度来说,自己组建技术团队来开发,并不是一件特别明智的事情。当然,如果你的土豪或者想任性地玩一票,那么你可以试试。二、外包技术公司,进行棋牌游戏定制目前,市面上的棋牌游戏开发公司琳琅满目,鱼龙混杂。有些公司看起来非常有实力,租了漂亮的写字楼,请了很多的员工,实际上并不一定是那么回事;有些产品看起来设计得很美观,游戏界面很炫,其实是淘宝里几百元买来的低端货。万一你遇到了不靠谱的棋牌游戏开发公司,那么售后服务变得非常痛苦:这个要收费,那么要花钱;这个不能改,那么不能调;今天没时间,明天再看看;这个修改要两万,那个修改要五万。保证让你痛不欲生苦不堪言。万一你买到了不靠谱的棋牌游戏产品,那么可能是进行游戏突然就莫名其妙崩溃了,明天游戏无数的人在刷分,后天游戏又整体失控了,遇到这种情况的时候,叫天天不应叫地地不灵,推来推去,反正就是找不到人来解决问题。那么在选择棋牌游戏开发定制外包的时候怎么来辨别正规的靠谱的开发公司呢:1、正规的棋牌游戏开发商拥有营业执照,此证件代表开发商是正规经营。如果企业在和开发商合作的过程中,出现了任何纠纷,便可以寻找相关部门进行解决,保障企业的利益;2、正规的棋牌游戏开发商他们的售后服务都是非常好的,能够提供专业的售后服务,如果棋牌游戏平台在运行的过程中,出现任何问题,都可寻找棋牌游戏开发商进行解决,直到问题全部解决为止;3、不管是销售还是开发以及售后服务,正规的棋牌游戏开发商都能用专业的服务、指导来打动客户,同时也让客户对自己有一个良好的信任度,让客户发展成为开发商的忠实客户。4、有空多了解一下棋牌开发商的已卖出去的运营平台的运营情况,虽然目前市面上有些棋牌开发商有着很多的官方数据和官方案例,但是可能真正运营成功的,保证一定的活跃玩家数量可能是很少的,前期的投资者很少关注这一点的。最后特别提醒的是:在选择棋牌游戏开发商时,千万不要为了贪图价格便宜而和不正规的开发商进行合作,这种做法只会损坏到你自身的利益。和正规的开发商合作,能够减少很多不必要的麻烦,同时还可以保证后期的长期良好可持续性的合作关系。那么选择了棋牌游戏开发公司后,棋牌游戏开发多少钱够开支呢?首选取决于你要买什么样的游戏,目前整体的行业情况都是买手机游戏赠送电脑端游戏,假设你只要电脑端游戏的话,均价基本是3000元/款。手机端游戏的话,如果是比较常见的游戏,基本是元/款,如果是定制地方性棋牌游戏的话,基本是100000元/款起。另外,游戏平台的市场价为元。这个是市场的平均价格,每家公司会把自己的人力成本、研发投入、营销费用、办公费用分摊到每款游戏里,因而会有不同的价格差异。在这里要特别提醒大家的是,一定不要买去淘宝里的源码,那么做的结果会得不偿失。贝尔利信息技术长期致力于棋牌游戏的研发、运营和销售,研发团队由一群曾参与了QQ游戏、边峰游戏、 4399游戏等国内大型游戏平台中多款游戏的研发经验的精英组成,通过,研发一销售一运营.的 循环改进,积累了丰富的行业实战经验。公司主推的电玩城游戏系列,已经成为业内标杆性产品,并与湖南、湖北、山东、江苏、浙江、四川、贵州、福建、广东等多地合作伙伴展开深入合作,帮助客户快速占领了市场,创造了价值。如果你对棋牌游戏开发多少钱仍然存在疑惑,欢迎你联络老戴进行咨询,手机
QQ:贝尔利网络棋牌开发咨询(老戴 手机
登录百度帐号推荐应用【图片】谁有cocos creator做的房卡麻将呢?【cocos2dx吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:9,376贴子:
谁有cocos creator做的房卡麻将呢?收藏
类似这样的……支持微信登陆支持建立房间支持邀请好友
你可以试试这个网站体验一下:要用微信登陆,好像刚刚做出来。
这个棋牌是支持戳合战,后继还会做AI和一些高级功能。
哈哈!在下有料!!!
我给你。。
留个qq给我
楼主运行起来了吗
登录百度帐号推荐应用

我要回帖

更多关于 cocoscreator 麻将 的文章

 

随机推荐