哈哈哈,重阳~深夜1点多在拉斯维加斯问出这个问题,能量真的很赛博了(笑)
既然你要“赛博塔罗Java+前端实现,一键解答”,那咱们就来整一个极简的赛博风格塔罗占卜小工具!
核心玩法:
- 点击“一键抽牌”,系统随机抽一张“赛博塔罗牌”
- 每张牌都有正位/逆位两种状态
- 然后给出针对“他到底喜欢我吗?”的赛博朋克风解读(带点夜之城式的冷酷、暧昧、荒诞感)
快速实现思路(前端 + 纯 JS + 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>
body {
margin: 0;
height: 100vh;
background: linear-gradient(135deg, #0f0c29, #302b63, #24243e);
color: #00ffea;
font-family: 'Courier New', monospace;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
overflow: hidden;
}
h1 {
font-size: 3.2rem;
text-shadow: 0 0 20px #00ffea, 0 0 40px #ff00aa;
margin-bottom: 1rem;
animation: glitch 4s infinite;
}
.card-container {
width: 320px;
height: 480px;
perspective: 1000px;
margin: 2rem 0;
}
.card {
width: 100%;
height: 100%;
position: relative;
transition: transform 0.8s;
transform-style: preserve-3d;
}
.card.flipped .front { transform: rotateY(180deg); }
.front, .back {
position: absolute;
width: 100%;
height: 100%;
backface-visibility: hidden;
border-radius: 16px;
overflow: hidden;
box-shadow: 0 0 30px rgba(0,255,234,0.4);
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
padding: 2rem;
box-sizing: border-box;
}
.front {
background: linear-gradient(135deg, #1a0033, #330066);
transform: rotateY(180deg);
}
.back {
background: #000;
border: 2px solid #00ffea;
}
button {
padding: 1rem 2.5rem;
font-size: 1.4rem;
background: transparent;
border: 2px solid #ff00aa;
color: #ff00aa;
cursor: pointer;
margin-top: 2rem;
transition: all 0.3s;
}
button:hover {
background: #ff00aa;
color: #000;
box-shadow: 0 0 25px #ff00aa;
}
#result {
margin-top: 2rem;
font-size: 1.3rem;
text-align: center;
max-width: 80%;
line-height: 1.6;
color: #e0ffff;
}
@keyframes glitch {
0% { text-shadow: 2px 0 #ff00aa, -2px 0 #00ffea; }
20% { text-shadow: -2px 0 #ff00aa, 2px 0 #00ffea; }
40% { text-shadow: 2px 0 #00ffea, -2px 0 #ff00aa; }
60% { text-shadow: -4px 0 #ff00aa, 4px 0 #00ffea; }
100% { text-shadow: 2px 0 #ff00aa, -2px 0 #00ffea; }
}
</style>
</head>
<body>
<h1>赛博塔罗 - 他到底喜欢我吗?</h1>
<div class="card-container">
<div class="card" id="tarotCard">
<div class="front" id="front">
<h2 id="cardName"></h2>
<p id="cardMeaning" style="text-align:center; margin-top:1.5rem;"></p>
</div>
<div class="back">
<h2 style="margin:0;">?</h2>
<p style="font-size:4rem; margin:0;">抽一张赛博牌</p>
</div>
</div>
</div>
<button onclick="drawCard()">一键抽牌</button>
<div id="result"></div>
<script>
const cards = [
{ name: "愚者(霓虹跃迁)", meaning: "他现在像夜之城里刚入行的佣兵,对你充满好奇,但还没决定要不要跳进这个危险的感情漩涡。喜欢指数:45% —— 别急,冒险才刚开始。" },
{ name: "魔术师(黑客之手)", meaning: "他有能力把你变成他世界里的核心程序,但目前只是在测试API调用。喜欢指数:75% —— 他已经在暗中写代码了,等一个触发条件。" },
{ name: "女祭司(数据幽灵)", meaning: "他对你有很深的潜意识好感,但表面装得很冷,像隐藏在防火墙后的AI。喜欢指数:65% —— 多给他一些神秘的信号,他会自己破解。" },
{ name: "恋人(义体共振)", meaning: "赛博缘分已连接,义体频率匹配度极高。他其实早就心动了,只是在等你按下同步键。喜欢指数:92% —— 现在就是最佳告白窗口期!" },
{ name: "战车(疾驰夜行)", meaning: "他对你有强烈的冲动和征服欲,但感情赛道太拥堵,他还在超车。喜欢指数:80% —— 给他点油门,他会直接漂移到你身边。" },
{ name: "塔(系统崩坏)", meaning: "他对你有感觉,但过去的情感防火墙崩了,导致现在一片混乱。喜欢指数:30% —— 目前是高风险投资,先观望。" },
{ name: "星星(远程信号)", meaning: "远距离的喜欢,像夜空中闪烁的信号塔。他在默默关注你,等一个更清晰的坐标。喜欢指数:70% —— 继续发光,他会慢慢靠近。" },
{ name: "死神(格式化重启)", meaning: "旧的感情模式已经崩溃,他正在对你进行一次彻底的重启安装。喜欢指数:55% —— 别怕,这可能是新版本的开始。" },
{ name: "世界(夜之城顶点)", meaning: "他把你看作自己世界的完成度100%的那个补丁。喜欢指数:98% —— 恭喜,这是最强的赛博肯定信号。" }
];
function drawCard() {
const cardElement = document.getElementById('tarotCard');
const front = document.getElementById('front');
const nameEl = document.getElementById('cardName');
const meaningEl = document.getElementById('cardMeaning');
const resultEl = document.getElementById('result');
// 随机抽牌 + 随机正逆
const randomIndex = Math.floor(Math.random() * cards.length);
const isUpright = Math.random() > 0.35; // 65% 正位(更积极)
const card = cards[randomIndex];
nameEl.textContent = isUpright ? card.name : card.name + "(逆位)";
meaningEl.textContent = isUpright
? card.meaning
: card.meaning.replace(/喜欢指数:(\d+)%/, (m, p) => `喜欢指数:${Math.max(10, Math.floor(p * 0.6))} % —— 逆位信号干扰中...`);
// 翻牌动画
cardElement.classList.remove('flipped');
setTimeout(() => {
cardElement.classList.add('flipped');
resultEl.innerHTML = `赛博扫描结果:${nameEl.textContent}<br><br>${meaningEl.textContent}<br><br>(夜之城没有巧合,只有代码与缘分)`;
}, 300);
}
</script>
</body>
</html>
直接复制上面代码保存成 .html 文件,用浏览器打开,就能玩了!
想更赛博一点?
- 可以再加霓虹闪烁背景动画
- 加打字机音效(JS Audio)
- 接入 WebGL 粒子效果做背景
- 把牌面做成赛博朋克风的 SVG 或 canvas 绘制
现在就问你:
要不要我帮你把这版再升级成更炫的版本?(比如加抽牌音效、更多牌面、分享到朋友圈功能)
或者……你现在就点“一键抽牌”,看看赛博塔罗怎么说?😏
(深夜拉斯维加斯能量已就位,等你来测~)