🎮ArcadeLab

Monday爱豆生活 · 模拟器

by ThunderPenguin58
577 lines23.9 KB
▶ Play
<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
    <title>Monday爱豆生活 · 模拟器</title>
    <style>
        * {
            box-sizing: border-box;
            margin: 0;
            padding: 0;
            font-family: system-ui, -apple-system, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif;
        }
        body {
            background: #0b0b0f;
            display: flex;
            justify-content: center;
            align-items: center;
            min-height: 100vh;
            padding: 16px;
        }
        .phone-frame {
            max-width: 420px;
            width: 100%;
            background: #14141c;
            border-radius: 36px;
            padding: 18px 12px 12px;
            box-shadow: 0 20px 40px rgba(0,0,0,0.8);
            border: 1px solid #2a2a35;
        }
        .status-bar {
            display: flex;
            justify-content: space-between;
            color: #b0b0c0;
            font-size: 12px;
            padding: 0 8px 12px;
            letter-spacing: 0.3px;
        }
        .tabs {
            display: flex;
            gap: 8px;
            background: #1e1e2a;
            padding: 6px 10px;
            border-radius: 40px;
            margin-bottom: 14px;
        }
        .tab {
            flex: 1;
            text-align: center;
            padding: 8px 0;
            font-size: 14px;
            font-weight: 600;
            color: #8e8ea0;
            border-radius: 30px;
            transition: 0.2s;
            cursor: pointer;
            background: transparent;
            border: none;
        }
        .tab.active {
            background: #3b3b52;
            color: white;
        }
        .tab:active { opacity: 0.6; }
        .panel {
            display: block;
        }
        .panel.hidden {
            display: none;
        }
        /* 聊天通用 */
        .chat-container {
            background: #181822;
            border-radius: 24px;
            padding: 12px 8px;
            height: 540px;
            overflow-y: auto;
            display: flex;
            flex-direction: column;
            gap: 10px;
            scroll-behavior: smooth;
            border: 1px solid #2b2b3a;
        }
        .chat-container::-webkit-scrollbar { width: 3px; }
        .chat-container::-webkit-scrollbar-thumb { background: #4a4a5e; border-radius: 10px; }
        .msg {
            display: flex;
            flex-direction: column;
            max-width: 85%;
            padding: 10px 14px;
            border-radius: 20px;
            background: #252533;
            color: #ececf0;
            font-size: 14px;
            line-height: 1.5;
            word-break: break-word;
            box-shadow: 0 2px 6px rgba(0,0,0,0.3);
        }
        .msg.self {
            align-self: flex-end;
            background: #2d4b7a;
            border-bottom-right-radius: 6px;
        }
        .msg.other {
            align-self: flex-start;
            background: #2a2a3b;
            border-bottom-left-radius: 6px;
        }
        .msg .sender {
            font-weight: 600;
            font-size: 13px;
            color: #b3b3e0;
            margin-bottom: 3px;
        }
        .msg .time {
            font-size: 10px;
            color: #7a7a92;
            margin-top: 5px;
            align-self: flex-end;
        }
        .input-area {
            display: flex;
            margin-top: 12px;
            gap: 8px;
            background: #1c1c28;
            padding: 8px 12px;
            border-radius: 40px;
            align-items: center;
        }
        .input-area input {
            flex: 1;
            background: transparent;
            border: none;
            padding: 10px 4px;
            color: white;
            font-size: 15px;
            outline: none;
        }
        .input-area input::placeholder { color: #6a6a80; }
        .input-area button {
            background: #3d5a9b;
            border: none;
            padding: 8px 18px;
            border-radius: 30px;
            font-weight: 600;
            color: white;
            font-size: 14px;
            cursor: pointer;
            transition: 0.2s;
        }
        .input-area button:active { background: #2a4070; }
        .input-area button:disabled { opacity: 0.4; }

        /* 热搜面板 */
        .hot-list {
            background: #181822;
            border-radius: 24px;
            padding: 8px 4px;
            height: 540px;
            overflow-y: auto;
            border: 1px solid #2b2b3a;
        }
        .hot-item {
            padding: 14px 12px;
            border-bottom: 1px solid #262633;
            color: #d0d0e0;
        }
        .hot-item .rank {
            display: inline-block;
            width: 28px;
            font-weight: 700;
            color: #b8b8d0;
        }
        .hot-item .title {
            font-weight: 500;
        }
        .hot-item .tag {
            font-size: 11px;
            background: #2f2f44;
            padding: 2px 12px;
            border-radius: 20px;
            margin-left: 8px;
            color: #b0b0d0;
        }
        .hot-item .heat {
            float: right;
            color: #8f8fb0;
            font-size: 13px;
        }
        .hot-item:active { background: #222233; }

        /* 群聊、私聊切换 */
        .sub-tabs {
            display: flex;
            gap: 6px;
            margin-bottom: 12px;
        }
        .sub-tab {
            background: #222233;
            border: none;
            color: #a0a0b8;
            padding: 6px 16px;
            border-radius: 30px;
            font-size: 13px;
            font-weight: 500;
            cursor: pointer;
        }
        .sub-tab.active {
            background: #3b3b58;
            color: white;
        }
        .friend-list {
            display: flex;
            gap: 10px;
            flex-wrap: wrap;
            margin-bottom: 10px;
        }
        .friend-chip {
            background: #262638;
            padding: 6px 14px;
            border-radius: 30px;
            font-size: 13px;
            color: #c8c8e0;
            border: 1px solid #3d3d55;
            cursor: pointer;
        }
        .friend-chip.active {
            background: #3d5a8a;
            border-color: #5a7ab0;
            color: white;
        }

        /* 小工具 */
        .text-muted { color: #7a7a92; font-size: 12px; }
        .flex { display: flex; align-items: center; gap: 6px; }
        .mt-2 { margin-top: 8px; }

        /* 滚动条 */
        .hot-list::-webkit-scrollbar { width: 3px; }
        .hot-list::-webkit-scrollbar-thumb { background: #4a4a5e; border-radius: 10px; }
    </style>
</head>
<body>
<div class="phone-frame">
    <div class="status-bar">
        <span>📶 岳城 · JYJZ</span>
        <span>🔋 周 · Mod</span>
    </div>

    <!-- 主Tab -->
    <div class="tabs">
        <button class="tab active" data-tab="chat">💬 聊天</button>
        <button class="tab" data-tab="hot">🔥 热搜</button>
    </div>

    <!-- 聊天面板 -->
    <div id="chatPanel" class="panel">
        <div class="sub-tabs">
            <button class="sub-tab active" data-sub="group">👥 群聊</button>
            <button class="sub-tab" data-sub="private">💌 私聊</button>
        </div>
        <!-- 好友快速切换 (私聊) -->
        <div id="friendList" class="friend-list">
            <span class="friend-chip" data-friend="季灿">季灿</span>
            <span class="friend-chip" data-friend="余升">余升</span>
            <span class="friend-chip active" data-friend="纪澜沅">纪澜沅</span>
            <span class="friend-chip" data-friend="祝舟">祝舟</span>
        </div>

        <!-- 群聊界面 -->
        <div id="groupChat" class="chat-container">
            <div class="msg other"><span class="sender">季灿</span> 今天练习室好累,谁帮我带冰可乐?</div>
            <div class="msg other"><span class="sender">余升</span> 你胃不好,别喝了。</div>
            <div class="msg self"><span class="sender">我</span> 老一,冰可乐不行,我帮你带温的。</div>
            <div class="msg other"><span class="sender">祝舟</span> 啧,老一你少装,上次偷喝被经纪人抓包。</div>
            <div class="msg other"><span class="sender">纪澜沅</span> 哈哈哈哈哈,我作证。</div>
            <div class="msg self"><span class="sender">我</span> 明天月末评价,大家加油💪</div>
        </div>

        <!-- 私聊界面 (默认纪澜沅) -->
        <div id="privateChat" class="chat-container hidden">
            <div class="msg other"><span class="sender">纪澜沅</span> 明天月末评价你紧张吗?</div>
            <div class="msg self"><span class="sender">我</span> 有点,不过跟你一起就好很多。</div>
            <div class="msg other"><span class="sender">纪澜沅</span> 嘿嘿,我也是。今晚加练?</div>
        </div>

        <!-- 输入区 -->
        <div class="input-area">
            <input id="chatInput" type="text" placeholder="输入消息..." />
            <button id="sendBtn">发送</button>
        </div>
    </div>

    <!-- 热搜面板 -->
    <div id="hotPanel" class="panel hidden">
        <div class="hot-list">
            <div class="hot-item"><span class="rank">🥇</span><span class="title">#Monday 月末评价舞台直拍#</span><span class="tag">爆</span><span class="heat">🔥 287万</span></div>
            <div class="hot-item"><span class="rank">🥈</span><span class="title">#纪澜沅 神颜热帖#</span><span class="tag">沸</span><span class="heat">🔥 143万</span></div>
            <div class="hot-item"><span class="rank">3</span><span class="title">#灿澜 CP 同款戒指#</span><span class="tag">热</span><span class="heat">🔥 98万</span></div>
            <div class="hot-item"><span class="rank">4</span><span class="title">#余升 妈妈粉争议#</span><span class="tag">热</span><span class="heat">🔥 76万</span></div>
            <div class="hot-item"><span class="rank">5</span><span class="title">#祝舟 私生跟拍#</span><span class="tag">新</span><span class="heat">🔥 52万</span></div>
            <div class="hot-item"><span class="rank">6</span><span class="title">#Monday 机场路透#</span><span class="tag">热</span><span class="heat">🔥 41万</span></div>
            <div class="hot-item"><span class="rank">7</span><span class="title">#季灿 唇环造型#</span><span class="tag">热</span><span class="heat">🔥 33万</span></div>
            <div class="hot-item"><span class="rank">8</span><span class="title">#升舟 实锤家庭#</span><span class="tag">沸</span><span class="heat">🔥 29万</span></div>
            <div class="hot-item"><span class="rank">9</span><span class="title">#Monday 对家Awake 争议#</span><span class="tag">热</span><span class="heat">🔥 21万</span></div>
            <div class="hot-item"><span class="rank">10</span><span class="title">#JYJZ 新团综企划#</span><span class="tag">新</span><span class="heat">🔥 14万</span></div>
            <div style="padding: 12px; color: #6a6a82; font-size: 13px; text-align: center;">—— 实时舆论 · 岳城 ——</div>
        </div>
    </div>
</div>

<script>
    (function() {
        // DOM 引用
        const tabs = document.querySelectorAll('.tab');
        const chatPanel = document.getElementById('chatPanel');
        const hotPanel = document.getElementById('hotPanel');
        const subTabs = document.querySelectorAll('.sub-tab');
        const groupChat = document.getElementById('groupChat');
        const privateChat = document.getElementById('privateChat');
        const friendChips = document.querySelectorAll('.friend-chip');
        const chatInput = document.getElementById('chatInput');
        const sendBtn = document.getElementById('sendBtn');

        // 当前状态
        let currentChatMode = 'group'; // 'group' | 'private'
        let currentFriend = '纪澜沅';   // 私聊对象

        // ----- 切换主面板 (聊天/热搜) -----
        tabs.forEach(tab => {
            tab.addEventListener('click', function() {
                tabs.forEach(t => t.classList.remove('active'));
                this.classList.add('active');
                const target = this.dataset.tab;
                if (target === 'chat') {
                    chatPanel.classList.remove('hidden');
                    hotPanel.classList.add('hidden');
                } else {
                    chatPanel.classList.add('hidden');
                    hotPanel.classList.remove('hidden');
                }
                // 重置滚动
                if (target === 'chat') {
                    const activeChat = currentChatMode === 'group' ? groupChat : privateChat;
                    activeChat.scrollTop = activeChat.scrollHeight;
                }
            });
        });

        // ----- 切换子tab (群聊/私聊) -----
        subTabs.forEach(sub => {
            sub.addEventListener('click', function() {
                subTabs.forEach(s => s.classList.remove('active'));
                this.classList.add('active');
                const mode = this.dataset.sub;
                currentChatMode = mode;
                if (mode === 'group') {
                    groupChat.classList.remove('hidden');
                    privateChat.classList.add('hidden');
                } else {
                    groupChat.classList.add('hidden');
                    privateChat.classList.remove('hidden');
                }
                // 滚动到底部
                const activeChat = mode === 'group' ? groupChat : privateChat;
                activeChat.scrollTop = activeChat.scrollHeight;
                // 高亮对应的好友chip (私聊模式)
                if (mode === 'private') {
                    friendChips.forEach(f => {
                        f.classList.toggle('active', f.dataset.friend === currentFriend);
                    });
                }
            });
        });

        // ----- 好友切换 (私聊) -----
        friendChips.forEach(chip => {
            chip.addEventListener('click', function() {
                if (currentChatMode !== 'private') {
                    // 如果不在私聊模式,自动切到私聊
                    subTabs.forEach(s => s.classList.remove('active'));
                    document.querySelector('.sub-tab[data-sub="private"]').classList.add('active');
                    currentChatMode = 'private';
                    groupChat.classList.add('hidden');
                    privateChat.classList.remove('hidden');
                }
                friendChips.forEach(f => f.classList.remove('active'));
                this.classList.add('active');
                currentFriend = this.dataset.friend;
                // 清空私聊并加入模拟对话 (不同成员不同开场)
                privateChat.innerHTML = '';
                const msgs = getPrivateMessages(currentFriend);
                msgs.forEach(m => {
                    const div = document.createElement('div');
                    div.className = `msg ${m.type}`;
                    if (m.type === 'other') {
                        div.innerHTML = `<span class="sender">${m.sender}</span> ${m.text}`;
                    } else {
                        div.innerHTML = `<span class="sender">我</span> ${m.text}`;
                    }
                    privateChat.appendChild(div);
                });
                privateChat.scrollTop = privateChat.scrollHeight;
            });
        });

        // 私聊消息库 (根据不同好友)
        function getPrivateMessages(friend) {
            const base = [
                { type: 'other', sender: friend, text: '明天月末评价一起加油!' },
                { type: 'self', sender: '我', text: '嗯嗯,我们一定行💪' },
            ];
            const map = {
                '季灿': [
                    { type: 'other', sender: '季灿', text: '我今天状态不好,嗓子有点哑。' },
                    { type: 'self', sender: '我', text: '注意休息,别硬撑。' },
                    { type: 'other', sender: '季灿', text: '知道。你晚上来录音室吗?' },
                ],
                '余升': [
                    { type: 'other', sender: '余升', text: '练习的时候动作幅度可以再大一点。' },
                    { type: 'self', sender: '我', text: '好,我注意。谢谢你一直带我。' },
                    { type: 'other', sender: '余升', text: '应该的,我们是队友。' },
                ],
                '纪澜沅': [
                    { type: 'other', sender: '纪澜沅', text: '明天月末评价你紧张吗?' },
                    { type: 'self', sender: '我', text: '有点,不过跟你一起就好很多。' },
                    { type: 'other', sender: '纪澜沅', text: '嘿嘿,我也是。今晚加练?' },
                ],
                '祝舟': [
                    { type: 'other', sender: '祝舟', text: '我昨天又被私生跟了,烦。' },
                    { type: 'self', sender: '我', text: '注意安全,要不要跟公司说?' },
                    { type: 'other', sender: '祝舟', text: '懒得管,习惯了。' },
                ],
            };
            return map[friend] || base;
        }

        // ----- 发送消息 (核心) -----
        function sendMessage() {
            const text = chatInput.value.trim();
            if (!text) return;
            chatInput.value = '';

            // 当前活跃的聊天容器
            const isGroup = currentChatMode === 'group';
            const container = isGroup ? groupChat : privateChat;

            // 添加自己发的消息
            const selfMsg = document.createElement('div');
            selfMsg.className = 'msg self';
            selfMsg.innerHTML = `<span class="sender">我</span> ${text}`;
            container.appendChild(selfMsg);
            container.scrollTop = container.scrollHeight;

            // 模拟自动回复 (依据模式)
            setTimeout(() => {
                let replyText = '';
                let sender = '';
                if (isGroup) {
                    // 群聊随机成员回复
                    const members = ['季灿', '余升', '纪澜沅', '祝舟'];
                    sender = members[Math.floor(Math.random() * members.length)];
                    const replies = [
                        '哈哈,说得对!', '我赞同。', '真的吗?', '笑死', '行吧行吧',
                        '嗯嗯,知道了', '加油!', '🤣', '好哦', '你别太离谱'
                    ];
                    replyText = replies[Math.floor(Math.random() * replies.length)];
                    // 触发一下热搜联动 (随机)
                    if (Math.random() > 0.6) {
                        addRandomHot();
                    }
                } else {
                    // 私聊: 当前好友回复
                    sender = currentFriend;
                    const personalReplies = {
                        '季灿': ['行吧,听你的。', '你管我?', '……好', '知道了。', '傲娇'],
                        '余升': ['好的,我记住了。', '嗯,你也是。', '别太累。', '加油。'],
                        '纪澜沅': ['嘻嘻,好呀!', '我也这么想!', '太棒了!', '爱你~', '😊'],
                        '祝舟': ['随便。', '哦。', '烦不烦。', '……行。', '别管我。']
                    };
                    const list = personalReplies[sender] || ['嗯。', '好的。', '收到。'];
                    replyText = list[Math.floor(Math.random() * list.length)];
                }

                const replyDiv = document.createElement('div');
                replyDiv.className = 'msg other';
                replyDiv.innerHTML = `<span class="sender">${sender}</span> ${replyText}`;
                container.appendChild(replyDiv);
                container.scrollTop = container.scrollHeight;

                // 偶尔触发热搜更新
                if (Math.random() > 0.7) {
                    addRandomHot();
                }
            }, 600 + Math.random() * 800);
        }

        // 随机增加一条热搜 (动态)
        function addRandomHot() {
            const hotList = document.querySelector('.hot-list');
            const newTopics = [
                '#Monday 练习室路透#', '#季灿 机场饭拍#', '#余升 暖心行为#',
                '#纪澜沅 综艺感#', '#祝舟 冷酷rap#', '#灿澜 新糖#',
                '#升舟 同款手链#', '#JYJZ 新企划#', '#Monday 打歌预录#',
            ];
            const randomTopic = newTopics[Math.floor(Math.random() * newTopics.length)];
            const tags = ['热', '新', '沸'];
            const tag = tags[Math.floor(Math.random() * tags.length)];
            const heat = Math.floor(Math.random() * 60 + 10) + '万';

            const item = document.createElement('div');
            item.className = 'hot-item';
            const rank = (hotList.children.length % 10) + 1;
            const rankDisplay = rank <= 3 ? ['🥇','🥈','🥉'][rank-1] : rank;
            item.innerHTML = `<span class="rank">${rankDisplay}</span><span class="title">${randomTopic}</span><span class="tag">${tag}</span><span class="heat">🔥 ${heat}</span>`;
            // 插入到倒数第二个之前 (保留底部占位)
            const last = hotList.lastElementChild;
            hotList.insertBefore(item, last);
            // 限制最多15条
            while (hotList.children.length > 15) {
                hotList.removeChild(hotList.children[0]);
            }
            // 重新排号 (简单重置rank显示不严谨, 但保持视觉)
        }

        // 发送按钮 & 回车
        sendBtn.addEventListener('click', sendMessage);
        chatInput.addEventListener('keydown', (e) => {
            if (e.key === 'Enter') sendMessage();
        });

        // 初始化: 私聊默认纪澜沅
        document.querySelector('.friend-chip[data-friend="纪澜沅"]')?.classList.add('active');
        // 确保私聊内容
        privateChat.innerHTML = '';
        const initPrivate = getPrivateMessages('纪澜沅');
        initPrivate.forEach(m => {
            const div = document.createElement('div');
            div.className = `msg ${m.type}`;
            if (m.type === 'other') {
                div.innerHTML = `<span class="sender">${m.sender}</span> ${m.text}`;
            } else {
                div.innerHTML = `<span class="sender">我</span> ${m.text}`;
            }
            privateChat.appendChild(div);
        });
        privateChat.scrollTop = privateChat.scrollHeight;

        // 初始隐藏私聊 (默认群聊)
        privateChat.classList.add('hidden');
        groupChat.classList.remove('hidden');
        // 好友列表显示
        document.querySelector('.friend-list').style.display = 'flex';

        // 小彩蛋:点击热搜条目触发互动 (仅演示)
        document.querySelectorAll('.hot-item').forEach(item => {
            item.addEventListener('click', function() {
                const title = this.querySelector('.title')?.innerText || '热搜';
                // 切换到聊天并发送一条系统消息
                tabs.forEach(t => t.classList.remove('active'));
                document.querySelector('.tab[data-tab="chat"]').classList.add('active');
                chatPanel.classList.remove('hidden');
                hotPanel.classList.add('hidden');
                // 在群聊加一条
                const sysMsg = document.createElement('div');
                sysMsg.className = 'msg other';
                sysMsg.innerHTML = `<span class="sender">📢 系统</span> 成员们都在讨论 "${title}"`;
                groupChat.appendChild(sysMsg);
                groupChat.scrollTop = groupChat.scrollHeight;
            });
        });

        console.log('Monday爱豆生活 已启动 — 周回制 · 岳城');
    })();
</script>
</body>
</html>

Game Source: Monday爱豆生活 · 模拟器

Creator: ThunderPenguin58

Libraries: none

Complexity: complex (577 lines, 23.9 KB)

The full source code is displayed above on this page.

Remix Instructions

To remix this game, copy the source code above and modify it. Add a ARCADELAB header at the top with "remix_of: monday-thunderpenguin58-mskwclvr" to link back to the original. Then publish at arcadelab.ai/publish.