棋牌小游戏“加入房间”功能_weixin_30517001的博客-程序员秘密

技术标签: 游戏  

模型层
  
/* * 进房间数据处理 * */ public function joinRoom_deal($user,$numb) { // 房间信息 if($room = Db::name('room')->where('number',$numb)->field('id,zhuang,users,ready,lives,times,number,status,create_time,update_time')->find()){ // 坐下玩家组 $users = json_decode($room['users'],true); // 空位组 $list_e = []; // 玩家详情信息 $list_u = []; // 计数是否首个进房 $num = 0; $lives_all = Gateway::getUidListByGroup(config('prefix').$room['id']); // 遍历拿到玩家详情以及空位的key foreach ($users as $key => $val) { if($val){ if(!$room['status']){ if(in_array($val,$lives_all)){ $list_u[$key] = Db::name('member')
                          ->where('uid',$val)
                          ->field('uid,wechat_openid,username,nickname,sex,userpic,is_agent,pid,agent_level,cost,total_bonus,islock')
                          ->find(); }else{ $users[$key] = 0; $list_u[$key] = []; $list_e[] = $key; $num++; } }else{ $list_u[$key] = Db::name('member')
                        ->where('uid',$val)
                        ->field('uid,wechat_openid,username,nickname,sex,userpic,is_agent,pid,agent_level,cost,total_bonus,islock')
                        ->find(); } }else{ $list_u[$key] = []; $list_e[] = $key; $num++; } } // 有空位则加入 if(!empty($list_e) && !in_array($user['uid'],$users)){ // 打乱 shuffle($list_e); // 弹出 $k = array_shift($list_e); // 进详情组 $list_u[$k] = Db::name('member')->where('uid',$user['uid'])
                  ->field('uid,wechat_openid,username,nickname,sex,userpic,is_agent,pid,agent_level,cost,total_bonus,islock')
                  ->find(); // 进房间users组 $users[$k] = $user['uid']; // 排序 ksort($users); // 这里需要给所有人发送 $arr_1 = ['type'=>'joinRoom_all','code'=>200,'data'=>$list_u]; Gateway::sendToGroup(config('prefix').$room['id'],json_encode($arr_1)); } if(in_array($user['uid'],$users)){ $k = array_search($user['uid'],$users); $k++; }else{ $k = 0; } // 首个进房 if($num==6){ $room['zhuang'] = $k - 1;//轮6次换一次庄家 } // 准备组 $ready = json_decode($room['ready'],true); // 排序 ksort($ready); // 检查是否已进过房间 if($user_r = Db::name('roomman')->where('uid',$user['uid'])->where('rid',$room['id'])->find()){ Db::startTrans(); try{ $user_r['status'] = 1; //是否离开 0是/1否 $user_r['update_time'] = time(); Db::name('roomman')->update($user_r); $room['users'] = json_encode($users); // uid用户组 $room['lives'] = count($lives_all)+1; // 在线玩家 $res = Db::name('room')->update($room); $room['list_u'] = $list_u; // 玩家详情信息 $room['list_r'] = $ready; // 准备的uid用户组 $room['is_sit'] = $k; // 加入房间后 你的座位号 $arr = $this->GameStatus($room); // 提交事务 Db::commit(); }catch(\Exception $e){ // 回滚 Db::rollback(); $arr = ['type'=>'joinRoom','code'=>400,'msg'=>'系统繁忙']; } }else{ Db::startTrans(); try{ $roomman['uid'] = $user['uid']; $roomman['rid'] = $room['id']; $roomman['create_time'] = $roomman['update_time'] = time(); $res = Db::name('roomman')->insert($roomman); $room['users'] = json_encode($users); $room['lives'] = count($lives_all)+1; $ress = Db::name('room')->update($room); $room['list_u'] = $list_u; $room['list_r'] = $ready; $room['is_sit'] = $k;//加入房间后 你的座位号 $arr = $this->GameStatus($room); // 提交事务 Db::commit(); }catch(\Exception $e){ // 回滚 Db::rollback(); $arr = ['type'=>'joinRoom','code'=>400,'msg'=>'系统繁忙']; } } }else{ $arr = ['type'=>'joinRoom','code'=>400,'msg'=>'房间不存在']; } return $arr; } /* * 游戏状态 * */ protected function GameStatus($room) { // 正在下注中 if($room['status']){ // 游戏状态标识 if($room['update_time'] - time() <= 5 && $room['update_time'] - time() > 0){ // 准备中 $room['sign'] = 3; $room['waittime'] = $room['update_time'] - time(); }else{ $room['sign'] = 1; // 期号信息 $room['end'] = Db::name('result')->where('status',0)->field('id,rid,uid,users,status,create_time')->order('id desc')->find(); // 剩余下注秒数,20s $room['waittime'] = $room['end']['create_time'] - time(); } }else{ // 开奖信息 if($end = Db::name('result')->where('status',1)->field('id,rid,uid,users,result,status,create_time,update_time')->order('id desc')->find()){ // 开牌时间,20s if(time() - $end['update_time'] <= 20){ // 游戏状态标识,2开牌中 $room['sign'] = 2; // 结果集 $end['result'] = json_decode($end['result'],true); // 剩余开牌时间 $room['waittime'] = $end['update_time'] + 20 - time(); // 开奖信息 $room['end'] = $end; }else{ // 等待着准备 $room['sign'] = 4; $room['waittime'] = 0; } }else{ $room['sign'] = 4; $room['waittime'] = 0; } } $room['qihao'] = Db::name('result')->where('rid',$room['id'])->order('id desc')->value('id');//最近开奖期号 $arr = ['type'=>'joinRoom','code'=>200,'data'=>$room]; return $arr; }

 

控制器层

    /*
     * 加入房间,1是下注中,2是开牌中,3是准备中,4是等待准备
     *
     */
    public function joinRoom($client_id,$data)
    {

        // 玩家信息
        $user = $this->userInfo;
        // 验证
        $result = $this->validate($data,'Jroom');
        if($result!==true){
            $arr = ['type'=>'joinRoom','code'=>400,'msg'=>$result];
            Gateway::sendToUid($user['uid'],json_encode($arr));
            return;
        }
        // 房间id
        $numb = $data['numb'];

        $model = osc_model('push','game');

        $result = $model->joinRoom_deal($user,$numb);

        if($result['code'] == 200){
            Gateway::joinGroup($client_id,config('prefix').$result['data']['id']);
        }
        // 返回
        Gateway::sendToUid($user['uid'],json_encode($result));

    }
涉及4张表:room:房间表;roomman:房间关联表;member:会员表;result:开奖信息表。

CREATE TABLE `sg_room` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `rate` int(11) NOT NULL DEFAULT '0' COMMENT '倍率',
  `remainder` int(11) NOT NULL DEFAULT '0' COMMENT '牌数',
  `z_max` int(11) NOT NULL DEFAULT '0' COMMENT '上庄限额',
  `z_min` int(11) NOT NULL DEFAULT '0' COMMENT '下庄限额',
  `join_min` int(11) NOT NULL DEFAULT '0' COMMENT '进房额度',
  `keep` int(11) NOT NULL DEFAULT '0' COMMENT '最大连庄数',
  `desc` varchar(10) NOT NULL DEFAULT '' COMMENT '描述',
  `users` varchar(256) NOT NULL DEFAULT '[0,0,0,0,0,0]' COMMENT '玩家数组',
  `ready` varchar(256) DEFAULT '[0,0,0,0,0,0]' COMMENT '准备人数',
  `zhuang` int(11) NOT NULL DEFAULT '0' COMMENT '1-10代表位置1-10',
  `times` int(11) NOT NULL DEFAULT '0' COMMENT '坐庄次数',
  `type` int(11) NOT NULL DEFAULT '0' COMMENT '底分',
  `status` int(11) NOT NULL COMMENT '是否结束',
  `lives` int(11) NOT NULL DEFAULT '0' COMMENT '在线人数',
  `number` int(11) NOT NULL DEFAULT '0' COMMENT '加庄,默认0不加庄',
  `create_time` int(11) NOT NULL,
  `update_time` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `number` (`number`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
CREATE TABLE `sg_roomman` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `uid` int(11) NOT NULL COMMENT '玩家id',
  `rid` int(11) NOT NULL COMMENT '房间id',
  `times` int(11) DEFAULT '0' COMMENT '坐庄次数',
  `sort` int(11) DEFAULT '0' COMMENT '上庄队列',
  `status` int(11) NOT NULL DEFAULT '1' COMMENT '是否已离开',
  `create_time` int(11) NOT NULL COMMENT '首次时间',
  `update_time` int(11) NOT NULL COMMENT '更新时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

CREATE TABLE `sg_member` ( `uid` mediumint(8) unsigned NOT NULL AUTO_INCREMENT COMMENT '用户id', `reg_type` varchar(20) DEFAULT NULL, `wechat_openid` varchar(128) DEFAULT NULL, `username` char(20) DEFAULT NULL COMMENT '用户名', `password` char(128) DEFAULT NULL COMMENT '密码', `checked` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否审核', `address_id` int(8) NOT NULL DEFAULT '0', `nickname` char(20) DEFAULT NULL COMMENT '昵称', `sex` tinyint(2) NOT NULL DEFAULT '0', `userpic` varchar(255) DEFAULT NULL COMMENT '会员头像', `is_agent` tinyint(2) NOT NULL DEFAULT '0' COMMENT '是否是代理商', `pid` mediumint(8) NOT NULL DEFAULT '0' COMMENT '上级id', `agent_level` mediumint(8) NOT NULL DEFAULT '0' COMMENT '代理级别', `cost` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '账号余额', `total_bonus` decimal(9,3) NOT NULL DEFAULT '0.000' COMMENT '代理商奖金', `points` mediumint(8) NOT NULL DEFAULT '0' COMMENT '积分', `cash_points` mediumint(8) NOT NULL DEFAULT '0' COMMENT '已经兑换积分', `wish` smallint(5) NOT NULL DEFAULT '0' COMMENT '收藏的数量', `regdate` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '注册时间', `lastdate` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '最后登录时间', `regip` char(15) DEFAULT NULL COMMENT '注册ip', `lastip` char(15) DEFAULT NULL COMMENT '上次登录ip', `loginnum` smallint(5) unsigned NOT NULL DEFAULT '0' COMMENT '登陆次数', `email` char(32) DEFAULT NULL COMMENT '电子邮箱', `telephone` varchar(20) DEFAULT NULL, `groupid` tinyint(3) unsigned NOT NULL DEFAULT '0' COMMENT '用户组id', `areaid` smallint(5) unsigned NOT NULL DEFAULT '0' COMMENT '地区id', `message` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '是否有短消息', `islock` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '是否锁定', PRIMARY KEY (`uid`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='会员表';

CREATE TABLE `sg_result` ( `id` int(11) NOT NULL AUTO_INCREMENT, `rid` int(11) NOT NULL COMMENT '房间id', `uid` int(11) NOT NULL COMMENT '庄家id', `status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '是否结束', `users` varchar(256) NOT NULL COMMENT '该局玩家id组', `result` text NOT NULL COMMENT '结果集', `num` text NOT NULL COMMENT '牛1-牛9结果集', `create_time` int(11) NOT NULL COMMENT '创建时间', `update_time` int(11) NOT NULL COMMENT '更新时间', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1DEFAULT CHARSET=utf8;

 

转载于:https://www.cnblogs.com/ycqi/p/9368751.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_30517001/article/details/98926163

智能推荐

random_shuffle() 随机化_寰宇C++的博客-程序员秘密

//STL中的函数random_shuffle()用来对一个元素序列进行重新排序(随机的),函数原型如下:/* template &lt;class RandomAccessIterator&gt; void random_shuffle( RandomAccessIterator _First, //指向序列首元素的迭代器 RandomAccess...

P1000 超级玛丽游戏 Lebal:水_Radium_的博客-程序员秘密

题目背景本题是洛谷的试机题目,可以帮助了解洛谷的使用。建议完成本题目后继续尝试P1001、P1008。题目描述超级玛丽是一个非常经典的游戏。请你用字符画的形式输出超级玛丽中的一个场景。 ******** ************ ####....#. #..###.....##.... ...

使用ibd文件恢复innodb数据_D蓝叶的博客-程序员秘密

mysql常用引擎有两种,myisam和innodb。myisam备份容易,直接备份.frm,.MYD,.MYI文件,然后再复制粘贴到目标数据库文件夹即可。但是innodb则不可以,即使你把.frm,.ibd文件放到目标数据库文件夹,也不是查看该数据表。那么,能否使用.ibd文件恢复innodb数据表呢?以下则是使用ibd文件恢复数据的方法: 注:使用ibd文件恢复数据的前提是,需要恢复的表的结构

cmd 命令打开mysql 数据库,重启mysql,mysql数据库乱码_cdm重启mysql_安徽君的博客-程序员秘密

如何通过cmd 命令打开mysql 数据库windows +R  输入 cdm 输入: net start mysql输入mysql安装的bin目录: cd /Program Files (x86)/MySQL\MySQL Server 5.0/bin输入账号密码:mysql -hlocalhost -uroot -p1111展示所有的数据库,以分号结束:show databases;打开对应...

Clickhouse 安装教程 - 单机版_琅涯阁的博客-程序员秘密

原文简单的 Clickhouse 单机版安装教程, 适合新手上手体验;安装准备curl 工具, yum install -y curl; yum-utils 工具, yum install -y yum-utils;CentOS Linux 8 系统检查系统是否支持安装 clickhousegrep -q sse4_2 /proc/cpuinfo &amp;&amp; echo "SSE 4.2 supported" || echo "SSE 4.2 not supported."取消

docker 启动数据库 mysqld: Can‘t create directory ‘/var/lib/mysql/‘ (Errcode: 17 - File exists)_妖四灵.Shuen的博客-程序员秘密

使用docker启动数据库,然后发现容器启动失败,为什么呢?查看容器日志what?不能创建文件,文件已经存在mysqld: Can't create directory '/var/lib/mysql/' (Errcode: 17 - File exists)????什么鬼?完全没有头绪,经过查阅一些资料,其实很简单,只需要加入权限参数--privileged=true 需要加,这个参数的作用是:使用该参数,container内的root拥有真正的root权限。否则,contai

随便推点

C#中使用FFMPEG切割、合并视频。_weixin_33804990的博客-程序员秘密

参考网址:https://blog.csdn.net/samwang_/article/details/70332924使用前先确保电脑已经安装了FFMPEG,并且配置好环境变量。检测是否安装配置好的方法:在cmd中输入ffmpeg class FFMEPG { //视频切割 public string Cut(string OriginFile/*视频源文...

win7下Cygwin搭建Hadoop开发环境_今天是昨天的明天的博客-程序员秘密

1.安装JDK2.安装Cygwin3.配置Windows系统变量4.安装并配置sshd服务5.配置Hadoop安装包////1. 安装crgwin下载软件安装crgwin选择相应的安装包Base->sedEditors->vimlibs->libintl3, libintl8Net->OpenSSH配置Window系统变量JAVA

烽火电信光猫语音鉴权密码及超级密码获取方法_hg6543c1是百兆还是千兆_engineerlzk的博客-程序员秘密

安装的电信宽带的光猫是烽火HG6543C1,只有1个千兆口,其它都是百兆口,所以下定决心换成我原来已经淘到的华为HS8145V。可是一系列的问题来了,如何获取超级密码?如何得到宽带电话的语音鉴权密码?经过yifa一番折腾,终于让我找到了方法,一方面感谢网上的大神提供的思路,同时也鼓励一下自己的脑洞大开最终解决了问题。一、获取超级密码1、开启光猫的telnet功能:在浏览器中输入192.16...

OpenVAS漏洞扫描基础教程之创建用户组与创建角色_weixin_30633507的博客-程序员秘密

OpenVAS漏洞扫描基础教程之创建用户组与创建角色OpenVAS创建用户组用户组就是指许多个用户的组合。在网络中,各个访问网络的用户的权限可能各不相同。所以,可以通过将具体相同权限的用户划为一组。这样就不需要单独为某个用户设置权限了,只需要设置组的权限即可。下面将介绍创建用户组的方法。具体操作步骤如下所示:(1)在OpenVAS服务的主界面依次单击Administration|Gro...

ORA-39125: Worker unexpected fatal error in KUPW$WORKER.PUT_DDLS while calling _skate的博客-程序员秘密

author:skatetime:2007/12/28我在执行impdp的时候[[email protected] ~]$ impdp system/rnwoxn table_exists_action=replace directory=DATA_PUMP_DIR dumpfile=movo_new.dmp schemas=movo_new remap_schema =movo_new:

python进行数据分析---python3卡方_weixin_30838921的博客-程序员秘密

数学公式思路:代码:使用典型的pandas进行的逻辑操作同时也指针对了pandashttps://github.com/renfanzi/python3_Variance_Chisquare.git转载于:https://www.cnblogs.com/renfanzi/p/7649076.html...

推荐文章

热门文章

相关标签