$redis_conf['host'], 'port' => $redis_conf['port'], 'passwd' => $redis_conf['passwd'] )); return $r; } protected function getRobot($robot_id, $num) { $address = '../res/robot@robot' . $num . '.php'; $robot_meta_cluster = require($address); $robot_meta = getRobotConfig($robot_meta_cluster, $robot_id); $rob = array( 'id' => $robot_meta['id'], 'name' => $robot_meta['name'], 'avatar_url' => $robot_meta['avatar_url'], ); return $rob; } public function randMatch() { $node_id = 1; if (isset($_REQUEST['node_id'])) { $node_id = (int)$_REQUEST['node_id']; } $room_uuid = $_REQUEST['room_uuid']; //查找当前房间 $r = array(); if ($room_uuid == null) { $r = $this->getRedis($node_id); $current_db_str = $r->get('game2001:match:current_room'); if (empty($current_db_str)) { $room_uuid = $node_id . '_' . md5($_REQUEST['account_id']) . time(); $current_db = array( 'room_uuid' => $room_uuid, ); $r -> set('game2001:match:current_room', json_encode($current_db)); } else { $current_db = json_decode($current_db_str, true); $room_uuid = $current_db['room_uuid']; $r = $this->getRedis($current_db['room_uuid']); } } else { $r = $this->getRedis($room_uuid); } //获取当前房间信息 $join_time = 5; $room_state = 0; $downtime = 0; $room = $this->getRedis($room_uuid); $room_db_str = $room->get($room_uuid); if (empty($room_db_str)) { $room_db = array( 'room_uuid' => $room_uuid, 'create_time' => time(), 'last_join_time' => time(), 'prepare_time' => 0, 'member_list' => array( array( 'account_id' => $_REQUEST['account_id'], 'name' => $_REQUEST['name'], 'avatar_url' => $_REQUEST['avatar_url'], ) )); $room -> set($room_uuid, json_encode($room_db)); $room -> pexpire($room_uuid, 1000 * 300); } else { $room_db = json_decode($room_db_str, true); if (empty($room_db)) { phpcommon\sendError(ERR_USER_BASE + 1,'session失效'); return; } //判断玩家是否在当前房间 $flag = 0; foreach ($room_db['member_list'] as $member) { if ($member['account_id'] == $_REQUEST['account_id']) { $flag = 1; break; } } //判断是否需要创建新房间 if ((count($room_db['member_list']) >= 10 && $flag != 1) || (time() - $room_db['prepare_time'] >= 3 && $room_db['prepare_time'] != 0)) { //创建新房间 $room_uuid = $node_id . '_' . md5($_REQUEST['account_id']) . time(); $room_db = array( 'room_uuid' => $room_uuid, 'create_time' => time(), 'last_join_time' => time(), 'prepare_time' => 0, 'member_list' => array( array( 'account_id' => $_REQUEST['account_id'], 'name' => $_REQUEST['name'], 'avatar_url' => $_REQUEST['avatar_url'], ) )); $room -> set($room_uuid, json_encode($room_db)); $room -> pexpire($room_uuid, 1000 * 300); //改变当前房间room_uuid $current_db_str = $r->get('game2001:match:current_room'); $current_db = json_decode($current_db_str, true); $current_db['room_uuid'] = $room_uuid; $r -> set('game2001:match:current_room', json_encode($current_db)); } else if (count($room_db['member_list']) < 10) { //判断是否添加机器人 if ($flag == 1) { if (time() >= $join_time + $room_db['last_join_time']) { //添加机器人 $num = count($room_db['member_list']); $random = Rand(1, 100); $robot_id = 1000 + ($num - 1) * 100 + $random; $rob = $this->getRobot($robot_id, $num); array_push ($room_db['member_list'], array( 'account_id' => $rob['id'], 'name' => $rob['name'], 'avatar_url' => $rob['avatar_url'], )); $room_db['last_join_time'] = time(); } } else { //加入房间 array_push ($room_db['member_list'], array( 'account_id' => $_REQUEST['account_id'], 'name' => $_REQUEST['name'], 'avatar_url' => $_REQUEST['avatar_url'], )); $room_db['last_join_time'] = time(); } //更新倒计时状态或者开始游戏 if (count($room_db['member_list']) >= 10) { if ($room_db['prepare_time'] == 0) { $room_db['prepare_time'] = time(); $downtime = 3 - (time() - $room_db['prepare_time']); $room_state = 1; } else { if (time() - $room_db['prepare_time'] >= 3) { $downtime = 0; $room_state = 2; } else { $downtime = 3 - (time() - $room_db['prepare_time']); } } } $room -> set($room_uuid, json_encode($room_db)); $room -> pexpire($room_uuid, 1000 * 300); } else if ($room_db['prepare_time'] != 0) { if (time() - $room_db['prepare_time'] >= 3) { $downtime = 0; $room_state = 2; } else { $downtime = 3 - (time() - $room_db['prepare_time']); } } } $room = $this->getRedis($room_uuid); $room_db_str = $room->get($room_uuid); $room_db = json_decode($room_db_str, true); $member_list = array(); foreach ($room_db['member_list'] as $member) { array_push($member_list, array( 'account_id' => $member['account_id'], 'name' => $member['name'], 'avatar_url' => $member['avatar_url'], )); } echo json_encode(array( 'errcode' => 0, 'errmsg'=> '', 'room_uuid' => $room_uuid, 'room_state' => $room_state, 'downtime' => $downtime, 'member_list' => $member_list, )); } public function cancleMatch() { $account_id = $_REQUEST['account_id']; $room_uuid = $_REQUEST['room_uuid']; $r = $this->getRedis($room_uuid); if (!$r) { die(); return; } $room_db_str = $r->get($room_uuid); if (empty($room_db_str)) { phpcommon\sendError(ERR_USER_BASE + 1,'session失效1'); return; } $room_db = json_decode($room_db_str, true); if (empty($room_db)) { phpcommon\sendError(ERR_USER_BASE + 1,'session失效2'); return; } if ($room_db['prepare_time'] != 0) { phpcommon\sendError(ERR_USER_BASE + 2,'游戏即将开始,无法退出匹配'); return; } $flag = 0; foreach ($room_db['member_list'] as $member) { if ($member['account_id'] == $account_id) { break; } $flag++; } unset($room_db['member_list'][$flag]); $room_db['member_list'] = array_values($room_db['member_list']); $r->set($room_uuid, json_encode($room_db)); $r -> pexpire($room_uuid, 1000 * 300); echo json_encode(array( 'errcode' => 0, 'errmsg' => '', )); } public function startGame() { $account_id = $_REQUEST['account_id']; $room_uuid = $_REQUEST['room_uuid']; echo json_encode(array( 'errcode' => 0, 'errmsg'=> '', )); } } ?>