zoukankan      html  css  js  c++  java
  • 棋牌小游戏“加入房间”功能

    模型层
      
    /* * 进房间数据处理 * */ 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;
  • 相关阅读:
    maven更改编译环境的java版本
    ConcurrentHashMap和HashMap的一点区别
    TCP/IP协议中网关和子网掩码概念
    同步和异步关注的是消息通信机制,阻塞和非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态
    maven中央仓库访问速度太慢的解决办法
    BIOS设置和CMOS设置的区别与联系
    PL/SQL 如何查看当前连接信息以及SQL PLUS如何指定IP地址
    【转载】C#常用数据库Sqlserver中DATEPART() 函数
    【转载】 Sqlserver中DateAdd()函数
    【转载】C#递归删除文件夹目录及文件
  • 原文地址:https://www.cnblogs.com/ycqi/p/9368751.html
Copyright © 2011-2022 走看看