GameController.php 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  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(!$request->session()->has('room_id')){
  23. // $response['code'] = 400;
  24. // $response['msg'] = '请先匹配对手';
  25. // return response()->json($response);
  26. // }
  27. if(!$room_id){
  28. $response['code'] = 400;
  29. $response['msg'] = '缺少房间参数';
  30. return response()->json($response);
  31. }
  32. // $room_id = $request->session()->get('room_id');
  33. //获取当前房间问题
  34. $questions = Redis::smembers($room_id);
  35. $question = Question::inRandomOrder()->select('question_id','title')->where("is_released",1)->whereNotIn("question_id", $questions)->first();
  36. $options = Option::select('option_id','title')->where("question_id",$question->question_id)->get($question->question_id);
  37. Redis::sadd($room_id, $question->question_id);
  38. //设置返回数据
  39. $response['code'] = 0;
  40. $response['msg'] = '获取成功';
  41. $response['info']['question'] = $question;
  42. $response['info']['options'] = $options;
  43. $response['info']['questions_count'] = count($questions) + 1;
  44. return response()->json($response);
  45. }
  46. /**
  47. * 回答问题
  48. */
  49. public function Answer(Request $request)
  50. {
  51. if(!$request->session()->has('user_id')){
  52. $response['code'] = 400;
  53. $response['msg'] = '请先登录';
  54. return response()->json($response);
  55. }
  56. if(!$request->session()->has('room_id')){
  57. $response['code'] = 400;
  58. $response['msg'] = '请先匹配对手';
  59. return response()->json($response);
  60. }
  61. $message['is_end'] = 0; //是否结束答题标志
  62. $question_id = $request->input('question_id');
  63. $option_id = $request->input('option_id');
  64. $room_id = $request->session()->get('room_id');
  65. $user_id = $request->session()->get('user_id');
  66. //获取当前房间问题条数
  67. $questions = Redis::smembers($room_id);
  68. //问题超过或者到第4条为结束标志
  69. if(count($questions) > 4){
  70. $message['is_end'] = 1;
  71. }
  72. //检测用户断线
  73. Gateway::$registerAddress = '127.0.0.1:1238';
  74. //获取当前组存活用户
  75. $clients = Gateway::getUidListByGroup($room_id);
  76. if(count($clients) < 2){
  77. $message['is_end'] = 1;
  78. }
  79. //判断答案逻辑
  80. $is_true = Option::where([
  81. ["question_id", $question_id],
  82. ["option_id", $option_id],
  83. ["is_answer", 1],
  84. ])->count();
  85. $scores = Redis::get($room_id);
  86. if($scores){
  87. $scores = json_decode($scores, 1);
  88. }else{
  89. $scores = [];
  90. }
  91. if(!isset($scores[$user_id])){
  92. $scores[$user_id] = 0;
  93. }
  94. if($is_true){
  95. $scores[$user_id] = (int) $scores[$user_id] + 1;
  96. }
  97. Redis::set($room_id, json_encode($scores));
  98. $message['is_true'] = $is_true;
  99. $message['scores'] = $scores;
  100. $message['user_id'] = $user_id;
  101. $message['online'] = count($clients);
  102. $message['type'] = 'answer';
  103. //发送消息
  104. Gateway::sendToGroup($room_id, json_encode($message));
  105. $response['code'] = 0;
  106. $response['msg'] = '回答成功';
  107. //用户退出房间关闭房间等逻辑 todo ...
  108. return response()->json($response);
  109. }
  110. /**
  111. * 加入房间
  112. */
  113. public function Join(Request $request)
  114. {
  115. if(!$request->session()->has('user_id')){
  116. $response['code'] = 400;
  117. $response['msg'] = '请先登录';
  118. return response()->json($response);
  119. }
  120. $user_id = $request->session()->get('user_id');
  121. $username = $request->session()->get('username');
  122. $avatar = $request->session()->get('avatar');
  123. $client_id = $request->input('client_id');
  124. $data = json_encode(['user_id'=>$user_id,'level'=>'T1','avatar'=>$avatar,'username'=>$username,'client_id'=>$client_id]);
  125. Redis::lpush('match_list',$data);
  126. $response['code'] = 0;
  127. $response['msg'] = "已加入匹配队列";
  128. return response()->json($response);
  129. }
  130. /**
  131. * 退出房间
  132. */
  133. public function Quit(Request $request)
  134. {
  135. if(!$request->session()->has('user_id')){
  136. $response['code'] = 400;
  137. $response['msg'] = '请先登录';
  138. return response()->json($response);
  139. }
  140. $username = $session->get('username');
  141. $avatar = $session->get('avatar');
  142. $user_id = $request->session()->get('user_id');
  143. $username = $request->session()->get('username');
  144. $avatar = $request->session()->get('avatar');
  145. $client_id = $request->input('client_id');
  146. $data = json_encode(['user_id'=>$user_id,'level'=>'T1','avatar'=>$avatar,'username'=>$username,'client_id'=>$client_id]);
  147. Redis::lrem('match_list',1,$data);
  148. //删除房间
  149. Redis::del('T1');
  150. $response['code'] = 0;
  151. $response['msg'] = "已取消匹配";
  152. return response()->json($response);
  153. }
  154. }