HTML+JS谁是卧底游戏

server/2024/9/24 16:30:06/

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

主要功能

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

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

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

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

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

效果图

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

源代码

html"><!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>css">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="javascript language-javascript">startGame()">开始游戏</button></div><div class="card-container" id="cardContainer"><!-- 卡片将会在这里生成 --></div><button class="judge-button" id="judgeButton" onclick="javascript language-javascript">judge()">判决</button><script>javascript">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;// 设置判决机会 = 白板数 + 卧底数 + 1remainingChances = 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.ppmy.cn/server/106266.html

相关文章

iphone被锁定怎么解锁?iPhone密码锁解锁办法分享

在忙碌的生活中&#xff0c;有时我们可能会遇到一些“小插曲”&#xff0c;比如苹果手机被锁定&#xff0c;iPhone被锁定是一个常见的问题&#xff0c;可能是由于忘记密码、多次输入错误密码或设备被远程锁定等原因造成的。 本文将介绍解锁被锁定的iPhone的方法以及注意事项&a…

已解决:`javax.xml.transform.TransformerFactoryConfigurationError` 异常的正确解决方法,亲测有效!!

1. 问题描述 javax.xml.transform.TransformerFactoryConfigurationError 是 Java 应用程序在使用 XSLT 转换时抛出的一个错误&#xff0c;通常表示在初始化 TransformerFactory 时出现配置问题。这个错误通常是由于以下原因引起的&#xff1a; 类路径中缺少或找不到所需的 T…

中间件(22) : nginx通过http接口获取代理目标地址(win)|nginx自定义负载均衡算法

参考 : Nginx12 openresty使用lua-resty-http模块 - 金天黑日 - 博客园 (cnblogs.com) windows openresty 死磕&#xff1a;安装和启动脚本 - 疯狂创客圈 - 博客园 (cnblogs.com) https://blog.csdn.net/wwppp987/article/details/122803662 1.下载软件包 1.1.openresty Ope…

(第三十三天)

1. 设置主从从 mysql57 服务器 &#xff08; 1 &#xff09;配置主数据库 [rootmsater_5 ~] # systemctl stop filewalld [rootmsater_5 ~] # setenforce 0 [rootmsater_5 ~] # systemctl disable filewalld [rootmsater_5 ~] # ls anaconda-ks.cfg mysql-5.7.44-linux-g…

【GH】【EXCEL】P6: Shapes

文章目录 componentslinepicture components line picture Picture A Picture object Input parameters: Worksheet (Generic Data) A Worksheet, Workbook, Range Object, Excel Application, or Text Worksheet NameName (Text) An optional object nameLocation (Point) A p…

三种相机模型总结(针孔、鱼眼、全景)

相机标定 文章目录 相机标定前言 前言 我们最常见的投影模型Perspective Projection Model描述的就是针孔相机的成像原理。从上面的图根据相似三角形可以得出 参考链接 https://zhuanlan.zhihu.com/p/540969207 相机标定之张正友标定法数学原理详解&#xff08;含python源码&a…

【C++】01背包问题暴力,记忆,动态规划解法

0-1 背包问题详解与实现 目录 0-1 背包问题详解与实现问题描述问题分析状态定义状态转移方程边界条件算法实现暴力搜索记忆化搜索动态规划空间优化 总结思维导图C学习资源 问题描述 在算法领域&#xff0c;0-1背包问题是一个经典的优化问题。给定一个背包和一个物品集合&#…

ARM——驱动——内核编译

一、内核的介绍 Linux内核是Linux操作系统的核心内容&#xff0c;它负责管理系统的硬件资源&#xff0c;并为上层的应用程序提供接口。&#xff08;在上文都有所介绍&#xff09; 功能&#xff1a; 进程管理&#xff1a;内核负责创建、调度、同步和终止进程。它还管理进程间的…