<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
<title>移动端开心刮刮乐</title>
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
touch-action: manipulation;
}
body {
font-family: "Microsoft YaHei", sans-serif;
background: #FFD700;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
height: 100vh;
overflow: hidden;
padding: 15px;
}
.container {
position: relative;
width: 100%;
max-width: 400px;
height: 200px;
border-radius: 15px;
overflow: hidden;
box-shadow: 0 10px 20px rgba(0, 0, 0, 0.2);
}
.prize {
position: absolute;
width: 100%;
height: 100%;
background: linear-gradient(135deg, #FF416C, #FF4B2B);
display: flex;
justify-content: center;
align-items: center;
font-size: 24px;
color: white;
font-weight: bold;
z-index: 1;
}
.scratch-area {
position: absolute;
width: 100%;
height: 100%;
background: #888;
z-index: 2;
cursor: url('data:image/png;base64,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'), auto;
}
.result {
display: none;
position: absolute;
width: 100%;
height: 100%;
background: transparent;
z-index: 3;
justify-content: center;
align-items: center;
flex-direction: column;
color: #FFD700;
font-weight: bold;
text-align: center;
}
.result h2 {
font-size: 28px;
margin-bottom: 10px;
text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.5);
}
.result p {
font-size: 18px;
margin-bottom: 15px;
}
.btn-restart {
padding: 8px 20px;
background: #FFD700;
color: #FF4B2B;
border: none;
border-radius: 20px;
font-weight: bold;
font-size: 16px;
cursor: pointer;
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);
}
.credit {
margin-top: 20px;
color: #333;
font-size: 12px;
text-align: center;
}
</style>
</head>
<body>
<h1 style="color: #FF4B2B; margin-bottom: 20px;">开心刮刮乐</h1>
<div class="container">
<div class="prize">刮开涂层查看奖品</div>
<canvas class="scratch-area" id="scratchCanvas"></canvas>
<div class="result" id="result">
<h2 id="prizeText">恭喜您!</h2>
<p id="prizeDesc">获得一等奖!</p>
<button class="btn-restart" οnclick="restartScratch()">再玩一次</button>
</div>
</div>
<div class="credit">游戏提供:www.5cq.website</div>
<script>
// 奖品配置
const prizes = [
{ name: "一等奖", desc: "获得100元现金红包!", color: "#FF0000", bg: "#FFD700", chance: 5 },
{ name: "二等奖", desc: "获得50元优惠券!", color: "#FF4500", bg: "#FFA500", chance: 15 },
{ name: "三等奖", desc: "获得20元优惠券!", color: "#4169E1", bg: "#87CEEB", chance: 30 },
{ name: "参与奖", desc: "谢谢参与!", color: "#2E8B57", bg: "#98FB98", chance: 50 }
];
// 初始化变量
const canvas = document.getElementById('scratchCanvas');
const ctx = canvas.getContext('2d');
const resultDiv = document.getElementById('result');
const prizeText = document.getElementById('prizeText');
const prizeDesc = document.getElementById('prizeDesc');
let isDrawing = false;
let currentPrize = null;
// 设置画布大小
function resizeCanvas() {
const container = document.querySelector('.container');
canvas.width = container.offsetWidth;
canvas.height = container.offsetHeight;
// 初始化刮刮卡涂层
initScratchLayer();
}
// 初始化刮刮卡涂层
function initScratchLayer() {
ctx.fillStyle = '#888';
ctx.fillRect(0, 0, canvas.width, canvas.height);
// 添加纹理
ctx.fillStyle = '#999';
for (let i = 0; i < 100; i++) {
const x = Math.random() * canvas.width;
const y = Math.random() * canvas.height;
const size = Math.random() * 3 + 1;
ctx.beginPath();
ctx.arc(x, y, size, 0, Math.PI * 2);
ctx.fill();
}
// 添加文字
ctx.fillStyle = '#666';
ctx.font = 'bold 16px Arial';
ctx.textAlign = 'center';
ctx.fillText('刮开此处查看奖品', canvas.width / 2, canvas.height / 2);
}
// 随机选择奖品
function selectPrize() {
const totalChance = prizes.reduce((sum, prize) => sum + prize.chance, 0);
let random = Math.random() * totalChance;
let accumulated = 0;
for (const prize of prizes) {
accumulated += prize.chance;
if (random <= accumulated) {
return prize;
}
}
return prizes[prizes.length - 1]; // 默认返回最后一个
}
// 开始刮卡
function startScratching(e) {
isDrawing = true;
// 第一次触摸时确定奖品
if (!currentPrize) {
currentPrize = selectPrize();
prizeText.textContent = currentPrize.name;
prizeText.style.color = currentPrize.color;
prizeDesc.textContent = currentPrize.desc;
}
draw(e);
}
// 结束刮卡
function endScratching() {
isDrawing = false;
ctx.beginPath();
// 检查刮开面积是否超过50%
checkScratchedArea();
}
// 绘制刮痕
function draw(e) {
if (!isDrawing) return;
// 获取触摸位置
let x, y;
if (e.type.includes('touch')) {
const rect = canvas.getBoundingClientRect();
x = e.touches[0].clientX - rect.left;
y = e.touches[0].clientY - rect.top;
} else {
x = e.offsetX;
y = e.offsetY;
}
// 绘制圆形擦除区域
ctx.globalCompositeOperation = 'destination-out';
ctx.beginPath();
ctx.arc(x, y, 20, 0, Math.PI * 2);
ctx.fill();
// 检查刮开面积
checkScratchedArea();
}
// 检查刮开面积
function checkScratchedArea() {
// 获取图像数据
const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);
const pixels = imageData.data;
let transparentPixels = 0;
// 计算透明像素数量
for (let i = 3; i < pixels.length; i += 4) {
if (pixels[i] === 0) {
transparentPixels++;
}
}
// 计算透明像素比例
const totalPixels = canvas.width * canvas.height;
const ratio = transparentPixels / totalPixels;
// 如果刮开面积超过50%,显示结果
if (ratio > 0.5) {
showResult();
}
}
// 显示结果
function showResult() {
resultDiv.style.display = 'flex';
resultDiv.style.backgroundColor = currentPrize.bg;
}
// 重新开始
function restartScratch() {
currentPrize = null;
resultDiv.style.display = 'none';
initScratchLayer();
}
// 事件监听
canvas.addEventListener('mousedown', startScratching);
canvas.addEventListener('mousemove', draw);
canvas.addEventListener('mouseup', endScratching);
canvas.addEventListener('mouseleave', endScratching);
canvas.addEventListener('touchstart', startScratching);
canvas.addEventListener('touchmove', draw);
canvas.addEventListener('touchend', endScratching);
window.addEventListener('resize', resizeCanvas);
// 初始化
resizeCanvas();
</script>
</body>
</html>