HTML+JS谁是卧底游戏

news2024/11/25 0:45:25

先说一句:一段时间没发文章,好多僵尸粉关注我,这CSDN😠

主要功能

  1. 玩家设置:在游戏开始前,输入总人数、卧底人数和白板人数。系统会自动计算出剩下的平民人数,并随机分配身份。

  2. 身份查看:在游戏开始后,所有玩家的身份都会以卡片形式呈现。你可以点击卡片来查看自己的身份,内容会显示“你是白板”或者对应的词语。

  3. 判决系统:所有玩家看完自己的身份后,可以通过“判决”按钮来猜测谁是卧底或白板。你输入认为是卧底或白板的玩家编号,无论猜测正确与否,都会减少一次判决机会。

  4. 剩余机会提示:每次判决后,系统会自动计算并提示你剩余的判决机会

  5. 胜负判定:如果你在机会用完前成功找出了所有的卧底和白板,游戏会提示平民获胜。如果机会用尽而卧底或白板还没被全部找出,游戏会提示失败。

效果图

在这里插入图片描述
在这里插入图片描述在这里插入图片描述

源代码

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>谁是卧底</title>
    <style>
        body {
            font-family: Arial, sans-serif;
            display: flex;
            flex-direction: column;
            align-items: center;
            justify-content: center;
            height: 100vh;
            margin: 0;
            background-color: #1c1c2b;
            color: white;
        }
        .input-container {
            background-color: #2d2d44;
            padding: 20px;
            border-radius: 15px;
            box-shadow: 0 10px 25px rgba(0,0,0,0.3);
            margin-bottom: 20px;
            text-align: center;
        }
        h1 {
            margin-bottom: 15px;
            font-size: 24px;
            font-weight: bold;
        }
        label {
            display: block;
            margin-bottom: 10px;
            font-size: 18px;
        }
        input[type="number"] {
            width: 100px;
            padding: 8px;
            margin-bottom: 15px;
            border-radius: 10px;
            border: none;
            box-shadow: 0 5px 15px rgba(0,0,0,0.1);
            text-align: center;
        }
        button {
            padding: 10px 20px;
            border: none;
            border-radius: 15px;
            background-color: #007BFF;
            color: white;
            font-size: 16px;
            cursor: pointer;
            box-shadow: 0 5px 15px rgba(0,0,0,0.3);
        }
        .card-container {
            position: relative;
            width: 200px;
            height: 300px;
            perspective: 1000px;
        }
        .card {
            width: 100%;
            height: 100%;
            background-color: orange;
            border-radius: 15px;
            box-shadow: 0 5px 15px rgba(0,0,0,0.3);
            position: absolute;
            top: 0;
            left: 0;
            transition: transform 0.6s;
            transform-style: preserve-3d;
            cursor: pointer;
        }
        .card.flipped {
            transform: rotateY(180deg);
        }
        .card-content {
            position: absolute;
            width: 100%;
            height: 100%;
            backface-visibility: hidden;
            display: flex;
            align-items: center;
            justify-content: center;
            font-size: 24px;
            color: white;
        }
        .card-content.back {
            transform: rotateY(180deg);
            background-color: #FFEB3B;
            border-radius: 15px;
        }
        .judge-button {
            display: none;
            padding: 20px 40px;
            border: none;
            border-radius: 25px;
            background-color: #FFD700;
            color: black;
            font-size: 20px;
            cursor: pointer;
            margin-top: 20px;
            box-shadow: 0 5px 15px rgba(0,0,0,0.3);
        }
    </style>
</head>
<body>

    <div class="input-container">
        <h1>谁是卧底游戏</h1>
        <label for="totalPlayers">总人数 (2-10):</label>
        <input type="number" id="totalPlayers" min="2" max="10">
        
        <label for="undercoverCount">卧底人数:</label>
        <input type="number" id="undercoverCount" min="1">
        
        <label for="blankCount">白板人数:</label>
        <input type="number" id="blankCount" min="0">
        <p></p>
        <button onclick="startGame()">开始游戏</button>
    </div>

    <div class="card-container" id="cardContainer">
        <!-- 卡片将会在这里生成 -->
    </div>

    <button class="judge-button" id="judgeButton" onclick="judge()">判决</button>

    <script>
        const wordsPairs = [
            ['苹果', '香蕉'],
            ['水泥', '瓷砖'],
            ['博客园', 'CSDN']
        ];

        let totalPlayers, undercoverCount, blankCount, civilians, undercovers, blanks;
        let remainingChances;
        let cardsFlipped = 0;

        function startGame() {
            totalPlayers = parseInt(document.getElementById('totalPlayers').value);
            undercoverCount = parseInt(document.getElementById('undercoverCount').value);
            blankCount = parseInt(document.getElementById('blankCount').value);

            if (isNaN(totalPlayers) || isNaN(undercoverCount) || isNaN(blankCount) || 
                totalPlayers < 2 || totalPlayers > 10 || 
                undercoverCount > totalPlayers || blankCount > totalPlayers ||
                blankCount > undercoverCount || (undercoverCount + blankCount) > totalPlayers) {
                alert('请检查输入,确保所有数值合理!');
                return;
            }

            civilians = totalPlayers - undercoverCount - blankCount;
            
            // 设置判决机会 = 白板数 + 卧底数 + 1
            remainingChances = blankCount + undercoverCount + 1;

            const wordPair = wordsPairs[Math.floor(Math.random() * wordsPairs.length)];
            undercovers = Array(undercoverCount).fill(wordPair[1]);
            blanks = Array(blankCount).fill('白板');
            const civiliansArr = Array(civilians).fill(wordPair[0]);

            const words = [...undercovers, ...blanks, ...civiliansArr].sort(() => Math.random() - 0.5);

            document.querySelector('.input-container').style.display = 'none';

            generateCards(words);
        }

        function generateCards(words) {
            const cardContainer = document.getElementById('cardContainer');
            cardContainer.innerHTML = '';

            words.forEach((word, index) => {
                const card = document.createElement('div');
                card.className = 'card';
                card.setAttribute('data-word', word);
                card.onclick = () => flipCard(card, index);

                const front = document.createElement('div');
                front.className = 'card-content front';
                front.innerText = '点击查看';

                const back = document.createElement('div');
                back.className = 'card-content back';
                back.innerText = word === '白板' ? '你是白板' : word;

                card.appendChild(front);
                card.appendChild(back);
                cardContainer.appendChild(card);

                card.style.zIndex = words.length - index;
                card.style.top = `${index * 5}px`;
                card.style.left = `${index * 5}px`;
            });
        }

        function flipCard(card, index) {
            if (card.classList.contains('flipped')) return;

            card.classList.add('flipped');
            cardsFlipped++;

            setTimeout(() => {
                card.style.display = 'none';
                if (cardsFlipped === totalPlayers) {
                    document.getElementById('judgeButton').style.display = 'block';
                }
            }, 1500);
        }

        function judge() {
            const guess = prompt('请输入你认为的卧底或白板编号(1-' + totalPlayers + '):');
            const guessIndex = parseInt(guess) - 1;
            if (isNaN(guessIndex) || guessIndex < 0 || guessIndex >= totalPlayers) {
                alert('无效的编号,请重新输入!');
                return;
            }

            const word = document.querySelectorAll('.card')[guessIndex].getAttribute('data-word');

            if (word === '白板' || word === undercovers[0]) {
                alert(`你找到了${word === '白板' ? '白板' : '卧底'},他们被淘汰了!`);
                document.querySelectorAll('.card')[guessIndex].remove();
                if (word === '白板') {
                    blanks.pop();
                } else {
                    undercovers.pop();
                }
            } else {
                alert('你猜错了!');
            }
            
            remainingChances--;
            alert('剩余机会: ' + remainingChances);

            if (undercovers.length === 0 && blanks.length === 0) {
                alert('平民获胜!');
                resetGame();
            } else if (remainingChances === 0) {
                alert('游戏失败!');
                resetGame();
            }
        }

        function resetGame() {
            document.querySelector('.input-container').style.display = 'block';
            document.getElementById('cardContainer').innerHTML = '';
            document.getElementById('judgeButton').style.display = 'none';
            cardsFlipped = 0;
        }
    </script>

</body>
</html>

游戏规则

1. 角色分配

  • 平民:多数玩家会被分配到同一个词语,这些玩家就是平民。平民的目标是找出谁是卧底。
  • 卧底:少数玩家(通常只有一人)会被分配到一个与平民词语类似但不同的词语。卧底的目标是混淆视听,让自己不被平民发现。
  • 白板(可选):某些版本中还有“白板”角色,他们不会得到任何词语,只能靠别人的描述来猜测其他人的身份。

2. 游戏流程

  • 第一轮:描述词语 每个玩家依次用一句话描述自己的词语,注意不能太直白,也不能过于模糊。平民需要小心描述,确保卧底不会轻易发现他们的词语,但又要让其他平民认出自己是同伴。卧底则需要假装自己是平民,在描述时尽量不暴露自己的词语。
  • 讨论与投票 一轮描述结束后,玩家可以互相讨论,并试图找出谁的描述最可疑。然后,所有玩家进行投票,选出他们认为是卧底的玩家。得票最多的玩家会被淘汰,并揭示自己的身份。
  • 下一轮 剩下的玩家继续进行描述和投票,直到所有的卧底被找出(平民获胜)或平民人数与卧底人数相等(卧底获胜)。

3. 胜负判定

  • 平民获胜:如果所有的卧底被投票淘汰,平民获胜。
  • 卧底获胜:如果卧底成功存活到剩下人数与卧底人数相等,卧底获胜。

4. 游戏策略

  • 平民需要通过描述、观察和推理来识别卧底的微妙差异。
  • 卧底则需要运用策略来隐藏自己的身份,并尽量让平民之间互相怀疑。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2063719.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

html+css+js实现登录界面设计

在现代网页设计中&#xff0c;创建一个功能齐全且用户友好的登录页面是至关重要的。本文将介绍如何使用 HTML 和 CSS 创建一个简单而有效的登录页面&#xff0c;包括验证码、记住密码选项及忘记密码链接。 1. HTML 结构 我们将从 HTML 代码开始&#xff0c;构建一个包含登录表…

【Google SEO】搜索引擎索引综合SEO指南

有没有想过网站是如何在搜索引擎上列出的&#xff0c;以及 Google、Bing 和其他公司如何在几秒钟内为我们提供大量信息&#xff1f; 这种闪电般快速性能的秘诀在于搜索索引。它可以与所有页面的庞大且完美有序的目录档案进行比较。进入索引意味着搜索引擎已经看到了你的页面&a…

机器学习——lightGBM(学习整理)

目录 一、认识lightGBM 1. 简单介绍 2. 主要特点 LightGBM 的缺点 3. 模型训练方式 &#xff08;1&#xff09;Training API &#xff08;2&#xff09;Scikit-learn API 二、相关函数参数 1. Training API 2. Scikit-learn API&#xff08;重复只做补充&#xff09;…

python requests 被屏蔽(已设置header和代理IP,解决浏览器指纹问题)

情况说明&#xff1a; 已设置 User-Agent已使用代理IP之前请求没问题&#xff0c;突然无法请求了。我用浏览器打开网站可以正常访问。 我遇到的原因&#xff1a; 目标网站/接口&#xff0c;能够通过JA3或者其他浏览器指纹信息&#xff0c;识别到你不是通过浏览器进行访问的。…

【解决】JS Uncaught RangeError: Invalid array length

【解决】JS Uncaught RangeError: Invalid array length 在JavaScript编程中&#xff0c;Uncaught RangeError: Invalid array length 是一个相对常见的错误&#xff0c;通常发生在处理数组时提供了无效的长度值。这个错误可能由多种原因引起&#xff0c;本文将深入探讨此错误的…

LCP167 两数之和II--输入有序数组[leetcode-5]

LCP167 两数之和II–输入有序数组 给你一个下标从 1 开始的整数数组 numbers &#xff0c;该数组已按 非递减顺序排列 &#xff0c;请你从数组中找出满足相加之和等于目标数 target 的两个数。如果设这两个数分别是 numbers[index1] 和 numbers[index2] &#xff0c;则 1 <…

Redis(day 2)

一、常用指令 哈希Hash kv模式不变&#xff0c;但v是一个键值对 &#xff08;1&#xff09;hset、hget命令用于为哈希表中的字段赋值 。 &#xff08;2&#xff09;hmset、hmget 同时将多个field-value对设置到哈希表中。会覆盖哈希表中已存在的字段。 &#xff08;3&…

AI在医学领域:通过声纹特征来预测血糖水平

糖尿病代谢紊乱&#xff08;DM&#xff09;是一种以血糖水平异常为特征的代谢性疾病&#xff0c;其表现为高血糖&#xff08;≥230 mg/dL&#xff09;或低血糖&#xff08;<65 mg/dL&#xff09;。该病导致胰岛素产生或作用受损&#xff0c;胰岛素作为调节葡萄糖稳态的关键激…

20 动态内存管理

目录 一、为什么要有动态内存管理 二、malloc 和 free &#xff08;一&#xff09;malloc &#xff08;二&#xff09;free 三、calloc 和 realloc &#xff08;一&#xff09;calloc &#xff08;二&#xff09;realloc 四、常见的动态内存错误 &#xff08;一&#…

【初阶数据结构】顺序表与链表的比较(附题)

目录 一、顺序表和链表的区别&#xff08;其他链表存在缺陷&#xff0c;比较意义不大&#xff0c;这里用带头双向循环链表与顺序表进行比较&#xff09; 1.1插入、扩容与随机访问 二、缓存利用率的比较 2.1前置知识 详解及补充知识&#xff08;本文仅为比较顺序表及链表&am…

照片怎么转jpg格式?这些照片格式转换方法简单又高效

图片已成为我们日常生活与工作中不可或缺的一部分。然而&#xff0c;面对多种多样的图片格式&#xff0c;如何高效地将它们转换为最常用的JPG格式&#xff0c;成为了许多人面临的难题。下面给大家分享常用的几种照片格式转换方法&#xff0c;一起来了解下吧。 方法一&#xff1…

数据结构之树体系:二叉树、平衡二叉树、红黑树、AVL树、B树、B+树、最小生成树、哈夫曼树、决策树、LSM树、后缀树、R树

概述 数据结构与算法 二叉树 其中每个结点都不能有多于两个子结点&#xff1a; 满二叉树&#xff1a;若设二叉树的高度为 h h h&#xff0c;除第 h h h层外&#xff0c;其它各层(1&#xff5e;h-1) 的结点数都达到最大个数&#xff0c;最后一层都是叶子结点&#xff0c;且叶…

CICD持续集成持续交付部署

一、CICD概念 1、什么是CI/CD&#xff1f; 通俗来说就是启动一个服务&#xff0c;能够监听代码变化&#xff0c;然后自动执行构建、测试、打包、发布等流程&#xff1b; 2、CI 持续集成 指在开发人员频繁地提交新代码&#xff0c;都会自动执行构建、测试。根据测试结果&…

WPS回应“崩了”:提供15天会员补偿,另有新羊毛,你还不来薅?

近期&#xff0c;“WPS崩了”这一话题在时隔两个月后&#xff0c;再次因多名用户反馈软件使用问题而登上微博热搜。 WPS官方微博随后发布消息称&#xff0c;经过工程师的紧急修复&#xff0c;WPS服务已经恢复正常。 为了补偿用户&#xff0c;在8月22日0点至24点期间&#xff…

视频插帧—— RIFE 和 IFNet 的机制和应用

介绍 最近&#xff0c;数字和模拟技术开始加速融合。我们生活在一个人工智能技术能够显著提高质量的时代&#xff0c;只要模拟材料能够数字化。 例如&#xff0c;讨论中涉及到的纸艺软件&#xff0c;纸龙的移动模型被时间锁定&#xff0c;以大约 3 fps&#xff08;每秒帧数&a…

vm 虚拟机无法调用摄像头(亲测有效)

-- 前言1 报错说明1.1 opencv调用摄像头失败&#xff0c;画面窗口无法显示1.2 选择连接摄像头出现失败&#xff1a;桌面右下角出现【USB 设备“Acer Integrated RGB Camera"的连接失败】连接摄像头方法 2 解决方法步骤一步骤二步骤三 补充 前言 网上找的很多方法都是无效…

2024年游泳耳机哪个牌子好?四大热门游泳耳机多维测评盘点!

游泳不仅是夏日里最受欢迎的消暑方式&#xff0c;也是全年无休的一项全身性运动。在水中畅游时&#xff0c;若能伴随着喜爱的音乐&#xff0c;无疑能让体验更上一层楼。近年来&#xff0c;随着骨传导技术和防水材料的进步&#xff0c;游泳耳机已经成为许多游泳爱好者的必备装备…

网络编程,网络协议,UDP编程

网络&#xff1a; 1.协议&#xff1a;通信双方约定的一套标准 2.国际网络通信协议标准&#xff1a; 1.OSI协议&#xff1a; 应用层 发送的数据内容 表示层 数据是否加密 会话层 是否建立会话连接 传输层 …

electron仿微信,新建贴合窗口

说明 在写electron项目时&#xff0c;只有一个主窗口不足以满足需求&#xff0c;我们通常还会打开很多个窗口。 怎么打开一个子窗口像微信的聊天界面一样&#xff0c;全贴合在一起&#xff0c;看起来像一个整体呢&#xff1a; 分析 这个窗口有点像element ui中的抽屉(drawe…

回归预测|基于北方苍鹰优化NGO-Transformer-BiLSTM组合模型的数据预测Matlab程序多特征输入单输出

回归预测|基于北方苍鹰优化NGO-Transformer-BiLSTM组合模型的数据预测Matlab程序多特征输入单输出 文章目录 前言回归预测|基于北方苍鹰优化NGO-Transformer-BiLSTM组合模型的数据预测Matlab程序多特征输入单输出 一、NGO-Transformer-BiLSTM模型回归预测&#xff1a;NGO-Trans…