新的项目需要做一个微信棋牌小游戏,网上搜了一圈相关的代码。

单就完整性来说,幼麟棋牌的开源代码比较完整(cocosCreator客户端、nodeJs服务端、数据库脚本)

实现了一款房卡麻将基本功能(热更新、微信登陆分享、游戏回放),下面贴出分析笔记,希望对后面学习的人多少有些帮助。

只不过最终就整体代码框架方面的一些考虑,我这边放弃了从此套代码上来做二次开发,而是选择了Golang + mongodb的服务端,如果对相关的方面开发有兴趣的朋友也可以添加我为好友一起探讨。

account_server/account_server.js 处理版本获取、账户注册、登陆

app.get('/get_version',function(req,res));//返回版本信息和游戏大厅连接地址

app.get('/guest',function(req,res));         //处理游客登陆

app.get('/wechat_auth',function(req,res)); //处理微信登陆

app.get('/base_info',function(req,res));  //返回用户账户信息 主要用于显示用户头像

-app.get('/wechat_auth',function(req,res); //微信登陆

-create_user(account,nickname,sex,headimgurl,function();

hall_Server/client_service.js 面向客户端http请求

app.get('/login',function(req,res));                            //处理登陆

app.get('/create_private_room',function(req,res));       //创建房间

app.get('/enter_private_room',function(req,res));        //进入房间

app.get('/get_history_list',function(req,res));               //得到游戏历史

app.get('/get_games_of_room',function(req,res));       //房间游戏数

app.get('/get_detail_of_game',function(req,res));        //游戏详细信息 战绩回放

app.get('/get_user_status',function(req,res));              //得到用户状态   钻石数量

app.get('/get_message',function(req,res));                  //得到通知消息

app.get('/is_server_online',function(req,res));              //判断服务器是否在线

hall_Server/room_service.js

-app.get('/register_gs',function(req,res));                  //game server 注册

isServerOnline();                                                    //判断服务器是否在线

chooseServerAndEnter();                                        //选择负荷最小的服务器进入

createRoom();                                                                             //创建房间

-http.get(serverinfo.ip,serverinfo.httpPort,"/create_room");

enterRoom();                                                                              //进入房间

-http.get(serverinfo.ip,serverinfo.httpPort,"/enter_room");

majiang_server/app.js  读取配置信息 启动相关服务

//开启HTTP服务

http_service.start(config);

//开启外网SOCKET服务

socket_service.start(config);

majiang_server/http_service.js

app.get('/get_server_info',function(req,res));         //得到服务器中所有的房间和用户

-app.get('/create_room',function(req,res));            //处理从大厅发来的创建房间请求

app.get('/enter_room',function(req,res));              //处理从大厅发来的加入房间请求

app.get('/ping',function(req,res));                        //大厅服务端判断游戏房间服务端是否在线

app.get('/is_room_runing',function(req,res));        //大厅服务端判断游戏房间服务端是否在线

//心跳 向大厅服务器注册游戏服务器

//如果已经注册则更新 当前服务器的负载信息(房间数量) 以方便客户选择最优房间

function update();

http.get(config.HALL_IP,config.HALL_PORT,"/register_gs",gameServerInfo);

majiang_server/socket_service.js 监听从客户端发来的socket 事件

socket.on('login',function(data));

socket.on('ready',function(data));

socket.on('huanpai',function(data));

socket.on('dingque',function(data));

socket.on('chupai',function(data));

socket.on('peng',function(data));

socket.on('gang',function(data));

socket.on('hu',function(data));

socket.on('guo',function(data));

socket.on('chat',function(data));

socket.on('quick_chat',function(data));

socket.on('voice_msg',function(data));

socket.on('emoji',function(data));

socket.on('exit',function(data));

socket.on('dispress',function(data));

socket.on('dissolve_request',function(data));

socket.on('dissolve_agree',function(data));

socket.on('dissolve_reject',function(data));

socket.on('disconnect',function(data));

socket.on('game_ping',function(data));

majiang_server/ roommgr.js      实现游戏对房间相关的操作

function generateRoomId();                      //随机生成6位数字ID

functionconstructRoomFromDb(dbdata);  //从数据库中获取房间信息数据 重建房间

exports.enterRoom =function(roomId,userId,userName,callback);

exports.createRoom =function(creator,roomConf,gems,ip,port,callback);

exports.exitRoom =function(userId);

exports.destroy =function(roomId);

exports.getTotalRooms =function();

exports.getRoom =function(roomId);

exports.isCreator =function(roomId,userId);

exports.setReady =function(userId,value);

exports.isReady =function(userId);

exports.getUserRoom =function(userId);

exports.getUserSeat =function(userId);

exports.getUserLocations =function();

majiang_server/ gamemgr_xzdd.js            //麻将游戏大体流程实现

function getMJType(id));

function shuffle(game) );

functionmopai(game,seatIndex) );

//检查是否可以碰

functioncheckCanPeng(game,seatData,targetPai) );

//检查是否可以点杠

function checkCanDianGang(game,seatData,targetPai));

//检查是否可以暗杠

functioncheckCanAnGang(game,seatData));

//检查是否可以弯杠(自己摸起来的时候)

functioncheckCanWanGang(game,seatData));

functioncheckCanHu(game,seatData,targetPai) );

functionclearAllOptions(game,seatData));

//检查听牌

functioncheckCanTingPai(game,seatData));

functiongetSeatIndex(userId));

functiongetGameByUserID(userId));

functionhasOperations(seatData));

functionsendOperations(game,seatData,pai) );

functionmoveToNextUser(game,nextSeat));

function doUserMoPai(game));

functionisSameType(type,arr));

functionisQingYiSe(gameSeatData));

functionisMenQing(gameSeatData));

functionisZhongZhang(gameSeatData));

functionisJiangDui(gameSeatData));

functionisTinged(seatData));

functioncomputeFanScore(game,fan));

functionfindMaxFanTingPai(ts));

functionfindUnTingedPlayers(game));

functioncalculateResult(game,roomInfo));

functiondoGameOver(game,userId,forceEnd));

functionrecordUserAction(game,seatData,type,target));

exports.begin =function(roomId) );                               //开始新的一局

exports.chuPai =function(userId,pai));

exports.peng =function(userId));

exports.isPlaying =function(userId));

functiondoGang(game,turnSeat,seatData,gangtype,numOfCnt,pai));

exports.gang =function(userId,pai));

exports.hu =function(userId));

exports.guo =function(userId));

exports.doDissolve =function(roomId));

majiang_server/ mjutils.js           //麻将相关辅助函数

functioncheckTingPai(seatData,begin,end);

functionmatchSingle(seatData,selected);

functioncheckSingle(seatData);

functioncheckCanHu(seatData);

exports.getMJType =function(pai);

majiang_server/usermgr.js                       //绑定用户和socket、发送消息

exports.bind =function(userId,socket);

exports.del =function(userId,socket);

exports.get =function(userId);

exports.isOnline =function(userId);

exports.getOnlineCount =function();

exports.sendMsg = function(userId,event,msgdata);

-socket.emit(event,msgdata);

exports.kickAllInRoom =function(roomId);

exports.broacastInRoom =function(event,data,sender,includingSender);

-socket.emit(event,msgdata);

majiang_server/tokenmgr.js                      //Token相关操作 token的设计用于校验进入房间过程中是否超时

-exports.createToken =function(userId,lifeTime);     //获取到游戏房间信息后创建token

exports.getToken =function(userId);

exports.getUserID =function(token);

exports.isTokenValid =function(token); //连接游戏服务器的时候校验是否有效和超时

exports.delToken =function(token);

-app.get('/enter_room');

roomMgr.enterRoom(roomId,userId,name,function(ret){

tokenMgr.createToken(userId,5000);

cc.vv.gameNetMgr.connectGameServer(ret);   //客户端

var sd = {

token:data.token,

roomid:data.roomid,

time:data.time,

sign:data.sign,

};

cc.vv.net.send("login",sd);

//服务端

socket.on('login',function(data){

//检查token是否有效

if(tokenMgr.isTokenValid(token)==false){

socket.emit('login_result',{errcode:3,errmsg:"tokenout of time."});

return;

}

}

特定流程分析

注册游戏服务器

majiang_server/http_service.js

//初始化本房间服务器地址为空

serverIp =””;

gameServerInfo.load =roomMgr.getTotalRooms();

http.get(HALL_IP, HALL_PORT,"/register_gs",gameServerInfo,function(ret,data){

//注册服务器成功后 设置房间连接IP为本服务器IP

serverIp = data.ip;

}

hall_server/room_service.js

app.get('/register_gs',function(req,res){

hall_server/room_service.js

app.get('/register_gs',function(req,res){

//服务器已经注册

if(serverMap[id]){

//更新服务器负荷信息

info.load= load;

http.send(res,0,"ok",{ip:ip});

return;

}

//将服务器信息保存到服务器数组

serverMap[id]= {

ip:ip,

id:id,

clientip:clientip,

clientport:clientport,

httpPort:httpPort,

load:load

};

}

进入房间 服务器选择

function chooseServer(){

var serverinfo = null;

//在服务器列表中选取 房间数最少的一个

for(var s in serverMap){

var info = serverMap[s];

if(serverinfo == null){

serverinfo = info;

}

else{

if(serverinfo.load >info.load){

serverinfo = info;

}

}

}

return serverinfo;

}

创建房间、进入房间流程

Hall/client_service.js

创建房间

app.get('/create_private_room');

room_service.createRoom();

-room_service.enterRoom();

加入房间

app.get('/enter_private_room');

-room_service.enterRoom();

Hall/room_service.js

exports.enterRoom =function(userId,name,roomId,fnCallback){

//大厅服务端向游戏服务端提交http请求

http.get(serverinfo.ip,serverinfo.httpPort,"/enter_room");

}

majiang_server/http_service.js

app.get('/enter_room');

-roomMgr.enterRoom();

开源H5棋牌 cocos creator微信棋牌小游戏 幼麟棋牌服务端分析笔记相关推荐

  1. cocos creator微信棋牌小游戏 幼麟棋牌服务端分析笔记

    新的项目需要做一个微信棋牌小游戏,网上搜了一圈相关的代码. 单就完整性来说,幼麟棋牌的开源代码比较完整(cocosCreator客户端.nodeJs服务端.数据库脚本) 实现了一款房卡麻将基本功能(热 ...

  2. cocos creator麻将教程系列(九)—— 幼麟棋牌代码讲解

    这篇文章是官方整理的: 技术栈 客户端 引擎:Cocos Creator 2.0.6. 语言:Javasctipt 可用开发平台:MAC,Windows 可发布平台: iOS,Android,Wind ...

  3. Cocos Creator 微信创意小游戏《蛇它虫》团队专访:玩法画面均是新意

    <蛇它虫>是由杭州电魂网络投资的文艺复兴工作室自主研发的一款益智解谜小游戏,在今年 1 月 9 日的微信公开课上,与其他五款小游戏一起,作为首批微信创意小游戏,在公开课上的小游戏环节亮相. ...

  4. Cocos Creator 微信创意小游戏《甜蜜糖果屋》团队专访:让纸片人活起来

    在 1 月 9 日的 2019 微信公开课 Pro 上,有一款创意十足的互动式游戏出现在小游戏宣讲环节,它便是今日 Cocos 的专访对象<甜蜜糖果屋>. <甜蜜糖果屋之花恋奇妙物语 ...

  5. Cocos Creator 微信创意小游戏《五子大作战》团队专访

    2019 微信公开课 PRO:首批创意小游戏公布 1 月 9 日,以"同行 WITH US"为主题的微信公开课 PRO 在广州召开.公开课上,讲师孙春光发布了微信首批创意小游戏,包 ...

  6. 开源H5棋牌 cocos creator微信棋牌小游戏 幼麟棋牌客户端分析笔记

    此文紧接上文的服务端分析来进行客户端的分析 LoadingLogic.js  (与初始化场景绑定 初始化各个组件 获取版本信息 加载资源) 1.onload:显示 splash 界面 初始化各个组件 ...

  7. cocos creator 接QQ小游戏 BannerAd 广告sdk

    cocos creator 接QQ小游戏 BannerAd 广告sdk 开发者工具 0.1.26 版本开始支持调试广告组件 首先,你需要初始化广告,判断什么的你自己加,我就不写很详细 //方法外的全局 ...

  8. cocos creator 接QQ小游戏小程序RewardedVideoAd 激励视频广告sdk

    cocos creator 接QQ小游戏小程序RewardedVideoAd 激励视频广告sdk 开发者工具 0.1.26 版本开始支持调试广告组件 话说你们看完为什么不留言点赞? 首先,你需要初始化 ...

  9. 开源H5棋牌 cocos creator微信棋牌小游戏 点球科技服务端分析笔记

    新的项目需要做一个微信棋牌小游戏,网上搜了一圈相关的代码. 单就完整性来说,幼麟棋牌的开源代码比较完整(cocosCreator客户端.nodeJs服务端.数据库脚本) 实现了一款房卡麻将基本功能(热 ...

  10. 微信小程序案例源码-cocos creator跨平台开发小游戏案例

    前言 本人一直想学习游戏开发,以前做过Android游戏开发,但电脑坏了,所有源码都没有了,后面也就没有开发了,近来下班之余又想开发游戏了.开发游戏之前,需要考虑开发平台及语言,以前基于Android ...

最新文章

  1. 第19件事 财务分析
  2. 换血吃药改基因,硅谷富豪们想用钱收买死神丨视频
  3. 还原软件实施更安全防护机器狗
  4. linux 终端 tty 简介
  5. linux c++ 多进程初步01
  6. ARM处理器基本指令大全
  7. 食物链(扩展域并查集)
  8. Ubuntu16.04编译Android5.1源码
  9. Leetcode 刷题笔记(十七) —— 二叉树篇之公共祖先问题
  10. 3S基础知识:MapX应用教程—查询
  11. plc编程软件通过计算机,英威腾PLC编程软件(Auto Station)
  12. 《游戏设计艺术(第二版)》第十章个人学习
  13. pta C语言选择题
  14. selenium键盘操作
  15. 在论文开题报告中,研究目的和研究意义两者之间有什么区别吗?
  16. 基于RFID自动识别技术的智能试卷管理系统
  17. 【Camunda六】Camunda实现会签和或签
  18. 设计模式简单代码之Command模式(皇帝圣旨篇)
  19. CHIL-SQL-DEFAULT 约束
  20. 多线程卖票深刻分析:为什么会出现只有一个窗口卖票的现象

热门文章

  1. Linux如何增加SSH端口号
  2. 安卓模拟器安装教程_[教程]安卓手机如何安装百度输入法五笔字根皮肤[教程]...
  3. 储存卡怎么格式化为fat32_64g储存卡怎么格式化成fat32格式化
  4. qam映射c程序_DVB-C系统中QAM调制与解调仿真
  5. 原生ajax请求流程
  6. 武田2020财年第三季度业绩彰显增长加速和持续的韧性;确认了2020财年全年管理层指引,并上调了自由现金流以及列报每股盈利的预测
  7. idea添加scala环境_Scala篇:Scala环境及IDEA配置
  8. 故宫回应灯会票秒光:3500人约成功 没票别信黄牛
  9. 读ISSCC TOF部分论文
  10. Modbus RTU 指令