GameController.php 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. <?php
  2. namespace App\Home\Controllers;
  3. use App\Http\Controllers\Controller;
  4. use Illuminate\Http\Request;
  5. use GatewayWorker\Lib\Gateway;
  6. use App\Model\Question;
  7. use App\Model\Option;
  8. use Illuminate\Support\Facades\Redis;
  9. class GameController extends Controller
  10. {
  11. /**
  12. * 获取问题
  13. */
  14. public function Question(Request $request)
  15. {
  16. if(!$request->session()->has('user_id')){
  17. $response['code'] = 400;
  18. $response['msg'] = '请先登录';
  19. return response()->json($response);
  20. }
  21. $room_id = $request->input('room_id');
  22. if(!$room_id){
  23. $response['code'] = 400;
  24. $response['msg'] = '缺少房间参数';
  25. return response()->json($response);
  26. }
  27. //第几题
  28. $cur_question = $request->input('cur_question');
  29. if(!$cur_question){
  30. $cur_question = 1;
  31. }
  32. //获取当前房间问题
  33. $questions = Redis::get($room_id . '_questions');
  34. if($questions){
  35. $questions = json_decode($questions);
  36. }else{
  37. $questions = [];
  38. }
  39. if(isset($questions[$cur_question -1 ])){
  40. $response['info'] = $questions[$cur_question - 1];
  41. }else{
  42. $questions_id = [];
  43. foreach ($questions as $k => $v) {
  44. // $response['info'] = $v;
  45. $questions_id[] = $v['question'];
  46. $response['ext'] = $questions_id;
  47. }
  48. // $questions_id = array_column($questions, 'question_id');
  49. $question = Question::inRandomOrder()->select('question_id','title')->where("is_released",1)->whereNotIn("question_id", $questions_id)->first();
  50. $options = Option::select('option_id','title')->where("question_id",$question->question_id)->get($question->question_id);
  51. $info['question'] = $question;
  52. $info['options'] = $options;
  53. $info['questions_count'] = count($questions) + 1;
  54. $questions[] = $info;
  55. Redis::set($room_id . '_questions', json_encode($questions));
  56. $response['info'] = $info;
  57. }
  58. //设置返回数据
  59. $response['code'] = 0;
  60. $response['msg'] = '获取成功';
  61. return response()->json($response);
  62. }
  63. /**
  64. * 回答问题
  65. */
  66. public function Answer(Request $request)
  67. {
  68. if(!$request->session()->has('user_id')){
  69. $response['code'] = 400;
  70. $response['msg'] = '请先登录';
  71. return response()->json($response);
  72. }
  73. $room_id = $request->input('room_id');
  74. if(!$room_id){
  75. $response['code'] = 400;
  76. $response['msg'] = '缺少房间参数';
  77. return response()->json($response);
  78. }
  79. $message['is_end'] = 0; //是否结束答题标志
  80. $question_id = $request->input('question_id');
  81. $option_id = $request->input('option_id');
  82. $user_id = $request->session()->get('user_id');
  83. //获取当前房间问题条数
  84. $questions = Redis::get($room_id . '_questions');
  85. if($questions){
  86. $questions = json_decode($questions);
  87. $questions_count = count($questions);
  88. }else{
  89. $questions_count = 0;
  90. }
  91. //问题超过或者到第4条为结束标志
  92. if($questions_count > 4){
  93. $message['is_end'] = 1;
  94. }
  95. //检测用户断线
  96. Gateway::$registerAddress = '127.0.0.1:1238';
  97. //获取当前组存活用户
  98. $clients = Gateway::getUidListByGroup($room_id);
  99. if(count($clients) < 2){
  100. $message['is_end'] = 1;
  101. }
  102. //判断答案逻辑
  103. $is_true = Option::where([
  104. ["question_id", $question_id],
  105. ["option_id", $option_id],
  106. ["is_answer", 1],
  107. ])->count();
  108. $scores = Redis::get($room_id.'_info');
  109. if($scores){
  110. $scores = json_decode($scores, 1);
  111. }else{
  112. $scores = [];
  113. }
  114. if(!isset($scores[$user_id])){
  115. $scores[$user_id] = 0;
  116. }
  117. if($is_true){
  118. $scores[$user_id] = (int) $scores[$user_id] + 1;
  119. }
  120. $scores['questions'][$question_id][$user_id] = $is_true;
  121. Redis::set($room_id . '_info', json_encode($scores));
  122. $message['is_true'] = $is_true;
  123. $message['scores'] = $scores;
  124. $message['user_id'] = $user_id;
  125. $message['online'] = count($clients);
  126. $message['type'] = 'answer';
  127. $message['cur_quc'] = count($scores['questions'][$question_id]);
  128. //发送消息
  129. Gateway::sendToGroup($room_id, json_encode($message));
  130. $response['code'] = 0;
  131. $response['msg'] = '回答成功';
  132. //用户退出房间关闭房间等逻辑 todo ...
  133. return response()->json($response);
  134. }
  135. /**
  136. * 加入房间
  137. */
  138. public function Join(Request $request)
  139. {
  140. if(!$request->session()->has('user_id')){
  141. $response['code'] = 400;
  142. $response['msg'] = '请先登录';
  143. return response()->json($response);
  144. }
  145. $user_id = $request->session()->get('user_id');
  146. $username = $request->session()->get('username');
  147. $avatar = $request->session()->get('avatar');
  148. $client_id = $request->input('client_id');
  149. $data = json_encode(['user_id'=>$user_id,'level'=>'T1','avatar'=>$avatar,'username'=>$username,'client_id'=>$client_id]);
  150. Redis::lpush('match_list',$data);
  151. $response['code'] = 0;
  152. $response['msg'] = "已加入匹配队列";
  153. return response()->json($response);
  154. }
  155. /**
  156. * 退出房间
  157. */
  158. public function Quit(Request $request)
  159. {
  160. if(!$request->session()->has('user_id')){
  161. $response['code'] = 400;
  162. $response['msg'] = '请先登录';
  163. return response()->json($response);
  164. }
  165. $username = $session->get('username');
  166. $avatar = $session->get('avatar');
  167. $user_id = $request->session()->get('user_id');
  168. $username = $request->session()->get('username');
  169. $avatar = $request->session()->get('avatar');
  170. $client_id = $request->input('client_id');
  171. $data = json_encode(['user_id'=>$user_id,'level'=>'T1','avatar'=>$avatar,'username'=>$username,'client_id'=>$client_id]);
  172. Redis::lrem('match_list',1,$data);
  173. //删除房间
  174. Redis::del('T1');
  175. $response['code'] = 0;
  176. $response['msg'] = "已取消匹配";
  177. return response()->json($response);
  178. }
  179. }