room-waiting.html 34 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732
  1. <!DOCTYPE html>
  2. <html lang="zh-CN">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate">
  7. <meta http-equiv="Pragma" content="no-cache">
  8. <meta http-equiv="Expires" content="0">
  9. <title>等待房间 - 主持人 - LineFunQueue</title>
  10. <!-- Tailwind CSS -->
  11. <script src="https://cdn.tailwindcss.com"></script>
  12. <!-- FontAwesome -->
  13. <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
  14. <!-- 自定义样式 -->
  15. <link rel="stylesheet" href="../css/custom.css">
  16. <style>
  17. .app-content {
  18. padding-bottom: 60px; /* 为底部导航栏留出空间 */
  19. }
  20. .share-btn {
  21. position: relative;
  22. }
  23. .share-options {
  24. display: none;
  25. position: absolute;
  26. top: 100%;
  27. right: 0;
  28. width: 200px;
  29. background: white;
  30. border-radius: 8px;
  31. box-shadow: 0 4px 12px rgba(0,0,0,0.1);
  32. padding: 8px 0;
  33. z-index: 100;
  34. }
  35. .share-option {
  36. padding: 8px 16px;
  37. display: flex;
  38. align-items: center;
  39. }
  40. .share-option i {
  41. width: 24px;
  42. margin-right: 8px;
  43. text-align: center;
  44. }
  45. .share-option:hover {
  46. background-color: #f3f4f6;
  47. }
  48. .user-status.ready {
  49. color: var(--color-primary);
  50. }
  51. .user-status.not-ready {
  52. color: #9ca3af;
  53. }
  54. .host-badge {
  55. background-color: #FFA000;
  56. color: white;
  57. }
  58. /* 主题选择弹窗样式 */
  59. .theme-selector-modal {
  60. position: fixed;
  61. inset: 0;
  62. background-color: rgba(0, 0, 0, 0.5);
  63. display: flex;
  64. align-items: center;
  65. justify-content: center;
  66. z-index: 50;
  67. }
  68. .theme-selector-content {
  69. background-color: white;
  70. width: 91.666667%;
  71. border-radius: 0.5rem;
  72. max-height: 80vh;
  73. overflow-y: auto;
  74. }
  75. .theme-selector-header {
  76. padding: 0.75rem;
  77. border-bottom: 1px solid #e5e7eb;
  78. display: flex;
  79. justify-content: space-between;
  80. align-items: center;
  81. position: sticky;
  82. top: 0;
  83. background-color: white;
  84. }
  85. .theme-selector-step {
  86. display: none;
  87. }
  88. .theme-selector-step.active {
  89. display: block;
  90. }
  91. .theme-item {
  92. display: flex;
  93. align-items: center;
  94. padding: 0.5rem;
  95. border: 1px solid #e5e7eb;
  96. border-radius: 0.375rem;
  97. margin-bottom: 0.75rem;
  98. cursor: pointer;
  99. transition: all 0.2s;
  100. }
  101. .theme-item:hover {
  102. border-color: #FFA000;
  103. background-color: #FFF8E1;
  104. }
  105. .theme-item.selected {
  106. background-color: #FFF8E1;
  107. border-color: #FFA000;
  108. }
  109. .difficulty-selector-btn {
  110. background-color: #f3f4f6;
  111. border: 1px solid #e5e7eb;
  112. color: #374151;
  113. font-size: 0.875rem;
  114. padding: 0.5rem 1rem;
  115. border-radius: 0.375rem;
  116. cursor: pointer;
  117. transition: all 0.2s;
  118. }
  119. .difficulty-selector-btn:hover {
  120. background-color: #e5e7eb;
  121. }
  122. .difficulty-selector-btn.selected {
  123. background-color: #FFA000;
  124. color: white;
  125. border-color: #FFA000;
  126. }
  127. .puzzle-item {
  128. padding: 0.75rem;
  129. border: 1px solid #e5e7eb;
  130. border-radius: 0.375rem;
  131. margin-bottom: 0.5rem;
  132. cursor: pointer;
  133. transition: all 0.2s;
  134. }
  135. .puzzle-item:hover {
  136. border-color: #FFA000;
  137. background-color: #FFF8E1;
  138. }
  139. .puzzle-item.selected {
  140. background-color: #FFF8E1;
  141. border-color: #FFA000;
  142. }
  143. </style>
  144. </head>
  145. <body>
  146. <div class="iphone-frame">
  147. <!-- 引入状态栏 -->
  148. <iframe src="../components/status-bar.html" frameborder="0" scrolling="no" style="width:100%; height:44px; overflow:hidden;"></iframe>
  149. <!-- 导航栏 -->
  150. <div class="app-navbar">
  151. <div class="left-button" onclick="history.back()">
  152. <i class="fas fa-chevron-left mr-1"></i> 返回
  153. </div>
  154. <div class="title" id="roomName">欢乐海龟汤</div>
  155. <div class="right-button">
  156. <i class="fas fa-ellipsis-v"></i>
  157. </div>
  158. </div>
  159. <!-- 内容区域 -->
  160. <div class="app-content bg-white">
  161. <!-- 房间状态 -->
  162. <div class="bg-amber-100 p-3 text-center">
  163. <div class="text-amber-700 font-medium">等待开始...</div>
  164. <div class="text-xs text-amber-600 mt-1"><span id="playerCount">3</span>/10人已加入,等待玩家准备</div>
  165. </div>
  166. <!-- 房间信息和分享 -->
  167. <div class="p-3 border-b border-gray-200">
  168. <div class="flex justify-between items-center">
  169. <div class="flex items-center">
  170. <div class="font-bold text-lg mr-2" id="roomCode">ABC123</div>
  171. <button id="copyBtn" class="text-xs text-gray-500 border border-gray-300 rounded px-1.5 py-0.5 flex items-center">
  172. <i class="far fa-copy mr-1"></i> 复制
  173. </button>
  174. </div>
  175. <div class="share-btn relative">
  176. <button id="shareBtn" class="bg-amber-100 text-amber-700 py-1 px-3 rounded-full text-sm flex items-center">
  177. <i class="fas fa-share-alt mr-1"></i> 邀请好友
  178. </button>
  179. <div class="share-options" id="shareOptions">
  180. <div class="share-option">
  181. <i class="fab fa-weixin text-green-500"></i>
  182. <span>微信好友</span>
  183. </div>
  184. <div class="share-option">
  185. <i class="fab fa-qq text-blue-500"></i>
  186. <span>QQ好友</span>
  187. </div>
  188. <div class="share-option">
  189. <i class="fas fa-comment text-yellow-500"></i>
  190. <span>短信</span>
  191. </div>
  192. <div class="share-option">
  193. <i class="fas fa-link text-gray-500"></i>
  194. <span>复制链接</span>
  195. </div>
  196. </div>
  197. </div>
  198. </div>
  199. </div>
  200. <!-- 游戏设置(主持人视图) -->
  201. <div class="p-3 border-b border-gray-200">
  202. <h3 class="font-medium mb-3">游戏设置</h3>
  203. <!-- 游戏设置按钮 -->
  204. <button id="openThemeSelector" class="w-full bg-amber-500 text-white py-2 px-4 rounded-md text-sm flex items-center justify-center mb-3">
  205. <i class="fas fa-cog mr-2"></i> 选择游戏主题和难度
  206. </button>
  207. <!-- 当前选择的设置 -->
  208. <div class="bg-amber-50 p-3 rounded-md border border-amber-200">
  209. <div class="flex items-center justify-between mb-2">
  210. <div class="text-sm font-medium">当前选择:</div>
  211. <div class="text-xs text-amber-600" id="currentThemeText">经典解谜</div>
  212. </div>
  213. <div class="flex items-center justify-between mb-2">
  214. <div class="text-sm font-medium">难度:</div>
  215. <div class="text-xs px-2 py-0.5 bg-amber-100 text-amber-700 rounded-full" id="currentDifficultyText">简单</div>
  216. </div>
  217. <div class="flex items-center justify-between">
  218. <div class="text-sm font-medium">题目:</div>
  219. <div class="text-xs text-amber-600" id="currentPuzzleText">神秘的手表</div>
  220. </div>
  221. </div>
  222. </div>
  223. <!-- 玩家列表 -->
  224. <div class="p-3">
  225. <h3 class="font-medium mb-2">玩家 (<span id="currentPlayers">3</span>/<span id="maxPlayers">10</span>)</h3>
  226. <div class="space-y-2">
  227. <!-- 主持人(我) -->
  228. <div class="flex items-center p-2 bg-amber-50 rounded-lg border border-amber-200">
  229. <div class="w-10 h-10 rounded-full overflow-hidden mr-3 border-2 border-amber-500">
  230. <img src="https://images.unsplash.com/photo-1494790108377-be9c29b29330?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=40&h=40&q=80" class="w-full h-full object-cover" alt="用户头像">
  231. </div>
  232. <div class="flex-1">
  233. <div class="font-medium flex items-center">
  234. 小明 (我)
  235. <span class="ml-2 text-xs host-badge px-1.5 py-0.5 rounded-full">主持人</span>
  236. </div>
  237. <div class="text-xs text-amber-600 user-status ready">选择中题目和难度...</div>
  238. </div>
  239. </div>
  240. <!-- 玩家1 -->
  241. <div class="flex items-center p-2 bg-gray-50 rounded-lg">
  242. <div class="w-10 h-10 rounded-full overflow-hidden mr-3">
  243. <img src="https://images.unsplash.com/photo-1507003211169-0a1dd7228f2d?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=40&h=40&q=80" class="w-full h-full object-cover" alt="用户头像">
  244. </div>
  245. <div class="flex-1">
  246. <div class="font-medium">小红</div>
  247. <div class="text-xs user-status ready">
  248. <i class="fas fa-check-circle mr-1"></i> 已准备
  249. </div>
  250. </div>
  251. </div>
  252. <!-- 玩家2 -->
  253. <div class="flex items-center p-2 bg-gray-50 rounded-lg">
  254. <div class="w-10 h-10 rounded-full overflow-hidden mr-3">
  255. <img src="https://images.unsplash.com/photo-1527980965255-d3b416303d12?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=40&h=40&q=80" class="w-full h-full object-cover" alt="用户头像">
  256. </div>
  257. <div class="flex-1">
  258. <div class="font-medium">小王</div>
  259. <div class="text-xs user-status not-ready">
  260. <i class="fas fa-clock mr-1"></i> 等待准备
  261. </div>
  262. </div>
  263. </div>
  264. </div>
  265. </div>
  266. <!-- 游戏说明 -->
  267. <div class="p-3 bg-gray-50 mb-3">
  268. <h3 class="font-medium mb-2 text-sm">游戏说明</h3>
  269. <p class="text-xs text-gray-700">
  270. 海龟汤是一种解谜类游戏,游戏开始时,主持人会给出一个离奇古怪的情境(汤面),玩家需要通过提问获取更多线索,最终解开谜题找出真相(汤底)。
  271. </p>
  272. </div>
  273. <!-- 主持人视图的按钮 -->
  274. <div class="p-3 sticky bottom-0 bg-white border-t border-gray-200">
  275. <a href="game-turtle-host.html" class="app-button primary w-full flex justify-center items-center">
  276. <i class="fas fa-play-circle mr-1"></i> 开始游戏 (<span id="readyCount">1</span>/<span id="totalPlayers">3</span>人已准备)
  277. </a>
  278. </div>
  279. </div>
  280. <!-- 主题选择弹窗组件 -->
  281. <div id="themeSelector" class="theme-selector-modal hidden">
  282. <div class="theme-selector-content">
  283. <div class="theme-selector-header">
  284. <h3 class="font-bold theme-selector-title">选择主题</h3>
  285. <button id="closeThemeSelector" class="text-gray-500">
  286. <i class="fas fa-times"></i>
  287. </button>
  288. </div>
  289. <!-- 步骤1:选择主题 -->
  290. <div id="step1" class="theme-selector-step active p-3">
  291. <div class="text-xs text-gray-500 mb-3">
  292. 选择一个主题,不同主题包含不同类型的谜题
  293. </div>
  294. <div class="space-y-2">
  295. <!-- 主题列表 -->
  296. <div class="theme-item selected" data-theme="classic" data-name="经典解谜" data-price="免费">
  297. <div class="flex-shrink-0 w-10 h-10 bg-amber-100 rounded-md flex items-center justify-center mr-3">
  298. <i class="fas fa-bookmark text-amber-500"></i>
  299. </div>
  300. <div class="flex-1">
  301. <div class="flex justify-between">
  302. <div class="text-sm font-medium">经典解谜</div>
  303. <div class="text-xs text-amber-600">免费</div>
  304. </div>
  305. <div class="text-xs text-gray-500">基础主题,包含多种经典谜题</div>
  306. </div>
  307. <div class="text-xs bg-amber-500 text-white py-1 px-2 rounded-md">已解锁</div>
  308. </div>
  309. <div class="theme-item" data-theme="universal" data-name="环球影城" data-price="20元/小时">
  310. <div class="flex-shrink-0 w-10 h-10 bg-amber-100 rounded-md flex items-center justify-center mr-3">
  311. <i class="fas fa-ticket-alt text-amber-500"></i>
  312. </div>
  313. <div class="flex-1">
  314. <div class="flex justify-between">
  315. <div class="text-sm font-medium">环球影城</div>
  316. <div class="text-xs text-amber-600">20元/小时</div>
  317. </div>
  318. <div class="text-xs text-gray-500">包含多个环球影城主题谜题</div>
  319. </div>
  320. <div class="text-xs bg-amber-500 text-white py-1 px-2 rounded-md">解锁</div>
  321. </div>
  322. <div class="theme-item" data-theme="disney" data-name="迪士尼奇幻" data-price="15元/小时">
  323. <div class="flex-shrink-0 w-10 h-10 bg-amber-100 rounded-md flex items-center justify-center mr-3">
  324. <i class="fas fa-hat-wizard text-amber-500"></i>
  325. </div>
  326. <div class="flex-1">
  327. <div class="flex justify-between">
  328. <div class="text-sm font-medium">迪士尼奇幻</div>
  329. <div class="text-xs text-amber-600">15元/小时</div>
  330. </div>
  331. <div class="text-xs text-gray-500">迪士尼主题相关谜题</div>
  332. </div>
  333. <div class="text-xs bg-amber-500 text-white py-1 px-2 rounded-md">解锁</div>
  334. </div>
  335. <div class="theme-item" data-theme="fantasy" data-name="奇幻冒险" data-price="12元/小时">
  336. <div class="flex-shrink-0 w-10 h-10 bg-amber-100 rounded-md flex items-center justify-center mr-3">
  337. <i class="fas fa-dragon text-amber-500"></i>
  338. </div>
  339. <div class="flex-1">
  340. <div class="flex justify-between">
  341. <div class="text-sm font-medium">奇幻冒险</div>
  342. <div class="text-xs text-amber-600">12元/小时</div>
  343. </div>
  344. <div class="text-xs text-gray-500">奇幻世界主题谜题</div>
  345. </div>
  346. <div class="text-xs bg-amber-500 text-white py-1 px-2 rounded-md">解锁</div>
  347. </div>
  348. </div>
  349. <div class="mt-4 flex justify-end">
  350. <button id="nextToStep2" class="bg-amber-500 text-white py-2 px-4 rounded-md text-sm">下一步</button>
  351. </div>
  352. </div>
  353. <!-- 步骤2:选择难度 -->
  354. <div id="step2" class="theme-selector-step p-3">
  355. <div class="text-xs text-gray-500 mb-3">
  356. 选择游戏难度,不同难度适合不同玩家群体
  357. </div>
  358. <div class="flex justify-between gap-3 mb-4">
  359. <button class="difficulty-selector-btn flex-1 selected" data-difficulty="easy" data-name="简单">
  360. 简单
  361. </button>
  362. <button class="difficulty-selector-btn flex-1" data-difficulty="medium" data-name="中等">
  363. 中等
  364. </button>
  365. <button class="difficulty-selector-btn flex-1" data-difficulty="hard" data-name="困难">
  366. 困难
  367. </button>
  368. </div>
  369. <div class="my-3">
  370. <div class="text-sm font-medium">难度说明:</div>
  371. <div id="difficultyDescription" class="text-xs text-gray-500 mt-1">
  372. 简单难度适合初次接触海龟汤的玩家,解题时间约10-15分钟。
  373. </div>
  374. </div>
  375. <div class="mt-4 flex justify-between">
  376. <button id="backToStep1" class="border border-gray-300 text-gray-700 py-2 px-4 rounded-md text-sm">上一步</button>
  377. <button id="nextToStep3" class="bg-amber-500 text-white py-2 px-4 rounded-md text-sm">下一步</button>
  378. </div>
  379. </div>
  380. <!-- 步骤3:选择题目 -->
  381. <div id="step3" class="theme-selector-step p-3">
  382. <div class="text-xs text-gray-500 mb-3">
  383. 从当前主题和难度中选择一个谜题
  384. </div>
  385. <div class="space-y-2 max-h-60 overflow-y-auto mb-4">
  386. <!-- 题目列表 -->
  387. <div class="puzzle-item selected" data-puzzle="watch" data-name="神秘的手表">
  388. <div class="flex justify-between">
  389. <div class="text-sm font-medium">神秘的手表</div>
  390. <div class="text-xs text-amber-600">简单 · 平均用时25分钟</div>
  391. </div>
  392. <div class="text-xs text-gray-500 mt-1">一个男人收到了一块神秘的手表,戴上后就再也无法取下来...</div>
  393. </div>
  394. <div class="puzzle-item" data-puzzle="apartment" data-name="高层公寓">
  395. <div class="flex justify-between">
  396. <div class="text-sm font-medium">高层公寓</div>
  397. <div class="text-xs text-amber-600">简单 · 平均用时20分钟</div>
  398. </div>
  399. <div class="text-xs text-gray-500 mt-1">一个男人走进电梯,按下了最低的按钮,然后走到自己家...</div>
  400. </div>
  401. <div class="puzzle-item" data-puzzle="mirror" data-name="破碎的镜子">
  402. <div class="flex justify-between">
  403. <div class="text-sm font-medium">破碎的镜子</div>
  404. <div class="text-xs text-amber-600">简单 · 平均用时18分钟</div>
  405. </div>
  406. <div class="text-xs text-gray-500 mt-1">一面镜子碎了,但没有人受伤,为什么所有人都很高兴...</div>
  407. </div>
  408. <div class="puzzle-item" data-puzzle="snow" data-name="雪地足迹">
  409. <div class="flex justify-between">
  410. <div class="text-sm font-medium">雪地足迹</div>
  411. <div class="text-xs text-amber-600">简单 · 平均用时22分钟</div>
  412. </div>
  413. <div class="text-xs text-gray-500 mt-1">一个人走进雪地,留下了足迹,但回来时却没有足迹...</div>
  414. </div>
  415. </div>
  416. <div class="mt-4 flex justify-between">
  417. <button id="backToStep2" class="border border-gray-300 text-gray-700 py-2 px-4 rounded-md text-sm">上一步</button>
  418. <button id="confirmSelection" class="bg-amber-500 text-white py-2 px-4 rounded-md text-sm">确认选择</button>
  419. </div>
  420. </div>
  421. </div>
  422. </div>
  423. <!-- 引入底部导航栏 -->
  424. <iframe src="../components/nav-bar.html" frameborder="0" scrolling="no" style="width:100%; height:50px; overflow:hidden; position:fixed; bottom:0;"></iframe>
  425. </div>
  426. <script>
  427. document.addEventListener("DOMContentLoaded", function() {
  428. // 阻止页面跳转,以便预览
  429. if (window.location.href.indexOf('?nocheck=1') > -1 || window.location.href.indexOf('?t=') > -1) {
  430. console.log('预览模式,禁止跳转');
  431. return;
  432. }
  433. // 检查是否为主持人
  434. const currentRoom = JSON.parse(localStorage.getItem('currentRoom') || '{}');
  435. if (!currentRoom.isHost) {
  436. // 如果不是主持人,跳转到玩家等待页面
  437. window.location.href = 'room-waiting-player.html';
  438. return;
  439. }
  440. // 填充房间信息
  441. document.getElementById('roomName').textContent = currentRoom.name || '欢乐海龟汤';
  442. document.getElementById('roomCode').textContent = currentRoom.id || 'ABC123';
  443. document.getElementById('playerCount').textContent = currentRoom.currentPlayers || 3;
  444. document.getElementById('currentPlayers').textContent = currentRoom.currentPlayers || 3;
  445. document.getElementById('maxPlayers').textContent = currentRoom.maxPlayers || 10;
  446. document.getElementById('totalPlayers').textContent = currentRoom.currentPlayers || 3;
  447. // 假设第一个玩家已准备,总共三个玩家(包括主持人)
  448. document.getElementById('readyCount').textContent = 1;
  449. // 分享按钮功能
  450. const shareBtn = document.getElementById('shareBtn');
  451. const shareOptions = document.getElementById('shareOptions');
  452. shareBtn.addEventListener('click', function() {
  453. if (shareOptions.style.display === 'block') {
  454. shareOptions.style.display = 'none';
  455. } else {
  456. shareOptions.style.display = 'block';
  457. }
  458. });
  459. // 点击其他地方关闭分享选项
  460. document.addEventListener('click', function(e) {
  461. if (!shareBtn.contains(e.target) && !shareOptions.contains(e.target)) {
  462. shareOptions.style.display = 'none';
  463. }
  464. });
  465. // 复制房间码功能
  466. const copyBtn = document.getElementById('copyBtn');
  467. copyBtn.addEventListener('click', function() {
  468. const roomCode = document.getElementById('roomCode').textContent;
  469. navigator.clipboard.writeText(roomCode).then(function() {
  470. copyBtn.innerHTML = '<i class="fas fa-check mr-1"></i> 已复制';
  471. setTimeout(function() {
  472. copyBtn.innerHTML = '<i class="far fa-copy mr-1"></i> 复制';
  473. }, 2000);
  474. });
  475. });
  476. // 主题选择弹窗控制
  477. const themeSelector = document.getElementById('themeSelector');
  478. const openThemeSelector = document.getElementById('openThemeSelector');
  479. const closeThemeSelector = document.getElementById('closeThemeSelector');
  480. // 打开主题选择弹窗
  481. openThemeSelector.addEventListener('click', function() {
  482. themeSelector.classList.remove('hidden');
  483. // 重置到第一步
  484. showStep(1);
  485. });
  486. // 关闭主题选择弹窗
  487. closeThemeSelector.addEventListener('click', function() {
  488. themeSelector.classList.add('hidden');
  489. });
  490. // 点击弹窗外部关闭
  491. themeSelector.addEventListener('click', function(e) {
  492. if (e.target === themeSelector) {
  493. themeSelector.classList.add('hidden');
  494. }
  495. });
  496. // 步骤控制
  497. const nextToStep2 = document.getElementById('nextToStep2');
  498. const backToStep1 = document.getElementById('backToStep1');
  499. const nextToStep3 = document.getElementById('nextToStep3');
  500. const backToStep2 = document.getElementById('backToStep2');
  501. const confirmSelection = document.getElementById('confirmSelection');
  502. // 当前选择的数据
  503. let selectedTheme = {
  504. theme: 'classic',
  505. themeName: '经典解谜',
  506. themePrice: '免费',
  507. difficulty: 'easy',
  508. difficultyName: '简单',
  509. puzzle: 'watch',
  510. puzzleName: '神秘的手表'
  511. };
  512. // 更新显示的当前选择
  513. function updateCurrentSelection() {
  514. document.getElementById('currentThemeText').textContent = selectedTheme.themeName;
  515. document.getElementById('currentDifficultyText').textContent = selectedTheme.difficultyName;
  516. document.getElementById('currentPuzzleText').textContent = selectedTheme.puzzleName;
  517. }
  518. // 初始化默认选择
  519. updateCurrentSelection();
  520. nextToStep2.addEventListener('click', function() {
  521. showStep(2);
  522. });
  523. backToStep1.addEventListener('click', function() {
  524. showStep(1);
  525. });
  526. nextToStep3.addEventListener('click', function() {
  527. showStep(3);
  528. });
  529. backToStep2.addEventListener('click', function() {
  530. showStep(2);
  531. });
  532. confirmSelection.addEventListener('click', function() {
  533. // 保存当前选择
  534. updateCurrentSelection();
  535. // 关闭弹窗
  536. themeSelector.classList.add('hidden');
  537. // 更新主持人状态
  538. const hostStatusElement = document.querySelector('.user-status.ready');
  539. hostStatusElement.textContent = `已选择: ${selectedTheme.themeName} - ${selectedTheme.difficultyName}`;
  540. });
  541. function showStep(step) {
  542. // 隐藏所有步骤
  543. document.querySelectorAll('.theme-selector-step').forEach(el => {
  544. el.classList.remove('active');
  545. });
  546. // 显示当前步骤
  547. document.getElementById(`step${step}`).classList.add('active');
  548. // 更新标题
  549. const titleElement = document.querySelector('.theme-selector-title');
  550. if (step === 1) {
  551. titleElement.textContent = '选择主题';
  552. } else if (step === 2) {
  553. titleElement.textContent = '选择难度';
  554. } else if (step === 3) {
  555. titleElement.textContent = '选择题目';
  556. }
  557. }
  558. // 主题项选择
  559. const themeItems = document.querySelectorAll('.theme-item');
  560. themeItems.forEach(item => {
  561. item.addEventListener('click', function() {
  562. // 移除其他选中状态
  563. themeItems.forEach(el => {
  564. el.classList.remove('selected');
  565. });
  566. // 添加当前选中状态
  567. this.classList.add('selected');
  568. // 保存选择的主题数据
  569. selectedTheme.theme = this.dataset.theme;
  570. selectedTheme.themeName = this.dataset.name;
  571. selectedTheme.themePrice = this.dataset.price;
  572. });
  573. });
  574. // 难度按钮选择
  575. const difficultyBtns = document.querySelectorAll('.difficulty-selector-btn');
  576. difficultyBtns.forEach(btn => {
  577. btn.addEventListener('click', function() {
  578. // 移除其他选中状态
  579. difficultyBtns.forEach(el => {
  580. el.classList.remove('selected');
  581. });
  582. // 添加当前选中状态
  583. this.classList.add('selected');
  584. // 保存选择的难度数据
  585. selectedTheme.difficulty = this.dataset.difficulty;
  586. selectedTheme.difficultyName = this.dataset.name;
  587. // 更新难度说明
  588. const difficultyDescription = document.getElementById('difficultyDescription');
  589. const difficulty = this.dataset.difficulty;
  590. if (difficulty === 'easy') {
  591. difficultyDescription.textContent = '简单难度适合初次接触海龟汤的玩家,解题时间约10-15分钟。';
  592. } else if (difficulty === 'medium') {
  593. difficultyDescription.textContent = '中等难度需要一定的逻辑思维能力,解题时间约15-25分钟。';
  594. } else if (difficulty === 'hard') {
  595. difficultyDescription.textContent = '困难难度挑战你的思维极限,解题时间约25-40分钟。';
  596. }
  597. });
  598. });
  599. // 题目项选择
  600. const puzzleItems = document.querySelectorAll('.puzzle-item');
  601. puzzleItems.forEach(item => {
  602. item.addEventListener('click', function() {
  603. // 移除其他选中状态
  604. puzzleItems.forEach(el => {
  605. el.classList.remove('selected');
  606. });
  607. // 添加当前选中状态
  608. this.classList.add('selected');
  609. // 保存选择的题目数据
  610. selectedTheme.puzzle = this.dataset.puzzle;
  611. selectedTheme.puzzleName = this.dataset.name;
  612. });
  613. });
  614. // 随机题目按钮功能
  615. const randomBtn = document.getElementById('randomBtn');
  616. if (randomBtn) {
  617. randomBtn.addEventListener('click', function() {
  618. // 打开主题选择弹窗
  619. themeSelector.classList.remove('hidden');
  620. // 直接跳到第三步选择题目
  621. showStep(3);
  622. // 随机选择一个题目
  623. const randomIndex = Math.floor(Math.random() * puzzleItems.length);
  624. puzzleItems.forEach((item, index) => {
  625. item.classList.remove('selected');
  626. if (index === randomIndex) {
  627. item.classList.add('selected');
  628. // 保存选择的题目数据
  629. selectedTheme.puzzle = item.dataset.puzzle;
  630. selectedTheme.puzzleName = item.dataset.name;
  631. }
  632. });
  633. // 选中的题目滚动到可见区域
  634. const selectedPuzzle = puzzleItems[randomIndex];
  635. if(selectedPuzzle) {
  636. selectedPuzzle.scrollIntoView({ behavior: 'smooth', block: 'nearest' });
  637. }
  638. });
  639. }
  640. });
  641. </script>
  642. </body>
  643. </html>