GameController.php 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  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 App\Model\RoomUser;
  9. use App\Model\RoomQuestion;
  10. use App\Model\RoomAnswer;
  11. use App\Model\Room;
  12. use Illuminate\Support\Facades\Redis;
  13. use App\Jobs\Settlement;
  14. class GameController extends Controller
  15. {
  16. /**
  17. * 回答问题
  18. */
  19. public function Answer(Request $request)
  20. {
  21. if(!$request->session()->has('user_id')){
  22. $response['code'] = 400;
  23. $response['msg'] = '请先登录';
  24. return response()->json($response);
  25. }
  26. $answer_time = time();
  27. $question_id = $request->input('question_id');
  28. $option_id = $request->input('option_id');
  29. $user_id = $request->session()->get('user_id');
  30. //注册gateway地址
  31. Gateway::$registerAddress = env("WS_REGEDIT_ADDR");
  32. //获取房间号
  33. $room_id = RoomUser::where([
  34. ["user_id", $user_id],
  35. ["state", 1]
  36. ])->value('room_id');
  37. if(!$room_id){
  38. $response['code'] = 400;
  39. $response['msg'] = '没有加入房间';
  40. return response()->json($response);
  41. }
  42. //判断答案逻辑
  43. $is_true = Option::where([
  44. ["question_id", $question_id],
  45. ["option_id", $option_id],
  46. ["is_answer", 1],
  47. ])->count();
  48. //判断用户回答获取分数
  49. if($is_true){
  50. //获取当前题目开始时间
  51. $start_at = RoomQuestion::where(["question_id" => $question_id, "room_id" => $room_id])->value('start_at');
  52. $answer_diff = $answer_time - strtotime($start_at);
  53. if($request->input('anwser_time')){
  54. $anwser_time = (int) $request->input('anwser_time');
  55. $answer_diff = abs(10 - $anwser_time);
  56. }
  57. switch ($answer_diff) {
  58. case '0':
  59. $score = 100;
  60. break;
  61. case '1':
  62. $score = 90;
  63. break;
  64. case '2':
  65. $score = 80;
  66. break;
  67. case '3':
  68. $score = 70;
  69. break;
  70. case '4':
  71. $score = 60;
  72. break;
  73. case '5':
  74. $score = 50;
  75. break;
  76. case '6':
  77. $score = 40;
  78. break;
  79. case '7':
  80. $score = 30;
  81. break;
  82. case '8':
  83. $score = 20;
  84. break;
  85. case '9':
  86. $score = 10;
  87. break;
  88. default:
  89. $score = 0;
  90. break;
  91. }
  92. }else{
  93. $score = 0;
  94. }
  95. //写入记录
  96. $result = RoomAnswer::insert([
  97. "question_id" => $question_id,
  98. "option_id" => $option_id,
  99. "user_id" => $user_id,
  100. "room_id" => $room_id,
  101. "score" => $score,
  102. "created_at" => date('Y-m-d H:i:s'),
  103. "updated_at" => date('Y-m-d H:i:s'),
  104. ]);
  105. if(!$result){
  106. //发送消息
  107. $response['code'] = 400;
  108. $response['msg'] = '重复回答';
  109. return response()->json($response);
  110. }
  111. if($score){
  112. //增加总分
  113. RoomUser::where([
  114. "user_id" => $user_id,
  115. "room_id" => $room_id,
  116. ])->increment('score', $score);
  117. }
  118. $total_score = (int) RoomUser::where([
  119. "user_id" => $user_id,
  120. "room_id" => $room_id,
  121. ])->value('score');
  122. $message['score'] = $score;
  123. $message['total_score'] = $total_score;
  124. $message['user_id'] = $user_id;
  125. $message['type'] = 'answer';
  126. Gateway::sendToGroup($room_id, json_encode($message));
  127. //获取房间信息,最后一个回答触发结算程序
  128. $room_user_limit = Room::where("room_id", $room_id)->value("user_limit");
  129. //获取当前题目回答人数
  130. $answer_user_count = RoomAnswer::where([
  131. "room_id" => $room_id,
  132. "question_id" => $question_id,
  133. ])->count();
  134. if($room_user_limit == $answer_user_count){
  135. if(!isset($start_at)){
  136. $start_at = RoomQuestion::where(["question_id" => $question_id, "room_id" => $room_id])->value('start_at');
  137. }
  138. $next_date = date('YmdHis', strtotime("{$start_at} +10 seconds"));
  139. //先删除固定结算任务队列
  140. Redis::lrem("Game_settlement_{$next_date}", 1, $room_id);
  141. //执行结算队列
  142. Settlement::dispatch($room_id)->onQueue('settlement');
  143. }
  144. //发送消息
  145. $response['code'] = 0;
  146. $response['msg'] = '回答成功';
  147. //返回回答信息
  148. return response()->json($response);
  149. }
  150. /**
  151. * 加入房间
  152. */
  153. public function Join(Request $request)
  154. {
  155. if(!$request->session()->has('user_id')){
  156. $response['code'] = 400;
  157. $response['msg'] = '请先登录';
  158. return response()->json($response);
  159. }
  160. $user_id = $request->session()->get('user_id');
  161. //检查是否在房间中
  162. $is_in_room = RoomUser::where("user_id", $user_id)->where("state", 1)->count();
  163. if($is_in_room){
  164. $response['code'] = 400;
  165. $response['msg'] = "已在房间中";
  166. return response()->json($response);
  167. }
  168. //删除队列再加入匹配
  169. Redis::lrem('match_list', 1, $user_id);
  170. Redis::rpush('match_list', $user_id);
  171. $response['code'] = 0;
  172. $response['msg'] = "已加入匹配队列";
  173. return response()->json($response);
  174. }
  175. /**
  176. * 取消匹配
  177. */
  178. public function Quit(Request $request)
  179. {
  180. if(!$request->session()->has('user_id')){
  181. $response['code'] = 400;
  182. $response['msg'] = '请先登录';
  183. return response()->json($response);
  184. }
  185. $username = $session->get('username');
  186. $avatar = $session->get('avatar');
  187. $user_id = $request->session()->get('user_id');
  188. $username = $request->session()->get('username');
  189. $avatar = $request->session()->get('avatar');
  190. $client_id = $request->input('client_id');
  191. $data = json_encode(['user_id'=>$user_id,'level'=>'T1','avatar'=>$avatar,'username'=>$username,'client_id'=>$client_id]);
  192. Redis::lrem('match_list',1,$data);
  193. //删除房间
  194. Redis::del('T1');
  195. $response['code'] = 0;
  196. $response['msg'] = "已取消匹配";
  197. return response()->json($response);
  198. }
  199. }