BLOG LIST
ブログ一覧
ブログ一覧
-
豊橋F
ペット育成お散歩ゲーム
🎉 1万歩達成!クーポン獲得 🎉 [ STEP1000 ] ✨ 通算おさんぽ歩数 ✨ 0 歩 🐾 次のクーポンまで: 10,000 歩 Lv.1 🍖あと 5回 / 🧸あと 3回 いっしょに歩こう! 🍖 ごはん🧸 あそぶ👟 おさんぽ計測を開始 🏃 計測中!スマホを持って歩こう #pet-game-wrapper { margin: 10px auto; width: 95%; max-width: 350px; box-sizing: border-box; } .pg-container { background: white; padding: 15px; border-radius: 25px; box-shadow: 0 4px 20px rgba(0,0,0,0.1); text-align: center; border: 2px solid #fff5f7; } /* 歩数表示のデザイン */ .pg-steps-display { background: #fffcf0; padding: 10px; border-radius: 15px; margin-bottom: 12px; border: 1px solid #ffeeba; } .pg-total-label { font-size: 10px; color: #b8860b; font-weight: bold; margin-bottom: 2px; } .pg-total-val { font-size: 22px; font-weight: 900; color: #444; font-family: 'Arial Black', sans-serif; } .pg-sub-steps { font-size: 11px; color: #888; margin-top: 4px; border-top: 1px dashed #ffeeba; padding-top: 4px; } .pg-stats { display: flex; justify-content: space-around; font-size: 11px; margin-bottom: 10px; font-weight: bold; } .pg-bar-bg { background: #eee; height: 8px; border-radius: 5px; width: 45px; display: inline-block; overflow: hidden; vertical-align: middle; } .pg-bar-fill { height: 100%; width: 0%; background: #ff9a9e; transition: width 0.3s; } .pg-stage { height: 150px; display: flex; justify-content: center; align-items: center; overflow: hidden; } #pg-character-img { max-width: 80%; max-height: 130px; height: auto; object-fit: contain; animation: pg-float 2.5s infinite alternate ease-in-out; } @keyframes pg-float { from { transform: translateY(0); } to { transform: translateY(-10px); } } .pg-buttons { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; margin-top: 10px; } .pg-btn { border: none; padding: 12px 5px; border-radius: 15px; font-weight: bold; color: white; cursor: pointer; font-size: 14px; box-shadow: 0 3px 0 rgba(0,0,0,0.1); } .pg-btn-orange { background: #ff8c00; } .pg-btn-green { background: #4caf50; } .pg-btn-blue { background: #4169e1; grid-column: span 2; margin-top: 5px; } .pg-btn:active { transform: translateY(2px); box-shadow: none; } #pg-msg { font-size: 12px; margin: 8px 0; color: #666; font-weight: bold; height: 1.2em; } const FEED_LIMIT = 5; const PLAY_LIMIT = 3; // データキーをv7に更新 let pgState = JSON.parse(localStorage.getItem('hp_pet_v7')) || { exp: 0, totalSteps: 0, lastCoupon: 0, feedCount: 0, playCount: 0, lastDate: "" }; function pgUpdate() { const today = new Date().toLocaleDateString(); if (pgState.lastDate !== today) { pgState.feedCount = 0; pgState.playCount = 0; pgState.lastDate = today; } // UI表示の更新 document.getElementById('pg-lv').innerText = Math.floor(pgState.exp / 20) + 1; document.getElementById('pg-bar-exp').style.width = (pgState.exp % 20) * 5 + '%'; // 通算歩数(toLocaleStringでカンマ区切りに) const total = Math.floor(pgState.totalSteps); document.getElementById('pg-lifetime-steps').innerText = total.toLocaleString(); // 次のクーポンまでの残り計算 const nextGoal = 10000 - (total % 10000); document.getElementById('pg-next-goal').innerText = nextGoal.toLocaleString(); document.getElementById('pg-feed-rem').innerText = (FEED_LIMIT - pgState.feedCount); document.getElementById('pg-play-rem').innerText = (PLAY_LIMIT - pgState.playCount); // クーポン判定 if (Math.floor(pgState.totalSteps / 10000) > pgState.lastCoupon) { document.getElementById('pg-coupon').style.display = 'block'; } localStorage.setItem('hp_pet_v7', JSON.stringify(pgState)); } function pgAction(type) { const msg = document.getElementById('pg-msg'); const char = document.getElementById('pg-character-img'); if(type === 'feed') { if (pgState.feedCount >= FEED_LIMIT) { msg.innerText = "今日は満腹だよ!"; return; } pgState.feedCount++; pgState.exp += 2; msg.innerText = "モグモグ、おいしい!"; } if(type === 'play') { if (pgState.playCount >= PLAY_LIMIT) { msg.innerText = "また明日遊ぼうね!"; return; } pgState.playCount++; pgState.exp += 1; msg.innerText = "たのしいね!ピョコ!"; } char.style.transform = "scale(1.15) translateY(-5px)"; setTimeout(() => { char.style.transform = "scale(1)"; }, 200); pgUpdate(); } async function pgRequestPermission() { if (typeof DeviceMotionEvent.requestPermission === 'function') { const p = await DeviceMotionEvent.requestPermission(); if (p === 'granted') startCounting(); } else { startCounting(); } } function startCounting() { window.addEventListener('devicemotion', (e) => { const acc = e.accelerationIncludingGravity; if (!acc) return; const total = Math.sqrt(acc.x**2 + acc.y**2 + acc.z**2); if (total > 18) { pgState.totalSteps += 1; pgState.exp += 0.05; // 歩行での経験値を少し調整 pgUpdate(); } }); document.getElementById('pg-start-btn').style.display = 'none'; document.getElementById('pg-walking-status').style.display = 'block'; } pgUpdate();
-
豊橋F
待ち時間の暇つぶしに!特製シューティングゲームを公開しました🎮2万点で割引も⁉
【ランキング復旧】WASDで移動、左クリックで攻撃、右クリック(または右下ボタン)でボム! 💣 ハイスコアはブラウザに保存されます。当店NO.1のパイロットを目指しましょう! 🔥 20,000点突破で【90分以上1,000円OFFチケット】進呈! 🎫✨ SCORE: 0 LEVEL: 1 BOMB: 💣💣💣 TRIPLE SHOT: 10s ⚠️ WARNING: BOSS APPROACHING ⚠️ 🏆 TOP 3 RANKING 🎉 20,000点突破特典 🎉 90分以上コース 1,000円OFFチケット この画面をスタッフにご提示ください ゲームスタート 🚀 ▲◀▶▼ FIRE 🔥BOMB 💣 @keyframes blink { 0% { opacity: 1; } 50% { opacity: 0; } 100% { opacity: 1; } } #shooting-game-container { position: relative; width: 100%; max-width: 600px; margin: 20px auto; background: #000; border: 4px solid #444; border-radius: 15px; overflow: hidden; touch-action: none; -webkit-user-select: none; user-select: none; font-family: sans-serif; box-sizing: border-box; } #shootingCanvas { display: block; width: 100%; height: auto; background: #000; cursor: crosshair; } #game-ui { position: absolute; top: 0; left: 0; width: 100%; height: 100%; display: flex; flex-direction: column; justify-content: center; align-items: center; color: white; z-index: 10; pointer-events: none; background: rgba(0,0,0,0.2); } #score-board { position: absolute; top: 10px; left: 10px; font-size: 16px; font-weight: bold; line-height: 1.4; text-shadow: 2px 2px 2px #000; text-align: left; } #ranking-container { background: rgba(0, 0, 0, 0.8); padding: 15px 20px; border-radius: 10px; margin-bottom: 20px; text-align: center; border: 1px solid #555; pointer-events: auto; } #start-btn { pointer-events: auto; padding: 15px 30px; font-size: 20px; cursor: pointer; background: #0f0; border: none; border-radius: 5px; font-weight: bold; } #controls { display: flex; justify-content: space-around; align-items: center; padding: 20px 10px; background: #222; gap: 10px; } .d-pad { display: grid; grid-template-areas: ". up ." "left . right" ". down ."; gap: 5px; } .game-btn { width: 55px; height: 55px; border-radius: 50%; border: none; background: #555; color: white; font-size: 20px; font-weight: bold; display: flex; justify-content: center; align-items: center; transition: transform 0.1s; pointer-events: auto; } (function() { const container = document.getElementById("shooting-game-container"); const canvas = document.getElementById("shootingCanvas"); const ctx = canvas.getContext("2d"); const startBtn = document.getElementById("start-btn"); const scoreVal = document.getElementById("score-val"); const levelVal = document.getElementById("level-val"); const bombVal = document.getElementById("bomb-val"); const rankingList = document.getElementById("ranking-list"); const rankingContainer = document.getElementById("ranking-container"); const bossWarning = document.getElementById("boss-warning"); const couponDisplay = document.getElementById("coupon-display"); canvas.width = 600; canvas.height = 400; let score = 0, level = 1, survivalFrames = 0, gameOver = false, gameRunning = false; let spawnTimer = 0, itemSpawnTimer = 0, tripleShotTime = 0, bombs = 3, bombActive = 0; let boss = null, nextBossScore = 10000; const player = { x: 50, y: 180, w: 40, h: 30, speed: 6 }; let bullets = [], enemies = [], particles = [], items = [], enemyBullets = []; const input = { up: false, down: false, left: false, right: false }; // --- ランキング処理 --- function updateRankingDisplay() { const scores = JSON.parse(localStorage.getItem('shooting_scores_v3') || '[]'); rankingList.innerHTML = scores.length ? scores.map((s, i) => `${i+1}位: ${s}点`).join('') : 'まだ記録がありません'; } function saveScore(newScore) { if (newScore === 0) return; let scores = JSON.parse(localStorage.getItem('shooting_scores_v3') || '[]'); scores.push(newScore); scores.sort((a, b) => b - a); scores = scores.slice(0, 3); localStorage.setItem('shooting_scores_v3', JSON.stringify(scores)); } const triggerBomb = (e) => { if (e) e.preventDefault(); useBomb(); }; canvas.addEventListener("contextmenu", triggerBomb); container.addEventListener("contextmenu", triggerBomb); document.getElementById("btn-bomb").addEventListener("pointerdown", triggerBomb); canvas.addEventListener("pointerdown", (e) => { if (gameRunning && !gameOver && e.button === 0) { e.preventDefault(); shoot(); } }); function useBomb() { if (!gameRunning || gameOver || bombs 0) return; bombs--; bombActive = 30; updateUI(); enemyBullets = []; enemies.forEach(e => { for(let i=0; i { if (!gameRunning) return; if(["Space", "ArrowUp", "ArrowDown", "ArrowLeft", "ArrowRight", "KeyW", "KeyA", "KeyS", "KeyD", "KeyB"].includes(e.code)) e.preventDefault(); if (e.code === "ArrowUp" || e.code === "KeyW") input.up = true; if (e.code === "ArrowDown" || e.code === "KeyS") input.down = true; if (e.code === "ArrowLeft" || e.code === "KeyA") input.left = true; if (e.code === "ArrowRight" || e.code === "KeyD") input.right = true; if (e.code === "Space") shoot(); if (e.code === "KeyB") useBomb(); }); window.addEventListener("keyup", (e) => { if (e.code === "ArrowUp" || e.code === "KeyW") input.up = false; if (e.code === "ArrowDown" || e.code === "KeyS") input.down = false; if (e.code === "ArrowLeft" || e.code === "KeyA") input.left = false; if (e.code === "ArrowRight" || e.code === "KeyD") input.right = false; }); const setupBtn = (id, key) => { const btn = document.getElementById(id); if(!btn) return; btn.addEventListener("pointerdown", (e) => { e.preventDefault(); if (key === 'fire') shoot(); else input[key] = true; }); const stop = (e) => { if (key !== 'fire') input[key] = false; }; btn.addEventListener("pointerup", stop); btn.addEventListener("pointerleave", stop); }; ["up", "down", "left", "right", "fire"].forEach(k => setupBtn("btn-" + k, k)); function shoot() { if (!gameRunning || gameOver) return; const bx = player.x + player.w, by = player.y + player.h/2; if (tripleShotTime > 0) { bullets.push({ x: bx, y: by-2, vx: 10, vy: 0, color: "lime" }); bullets.push({ x: bx, y: by-2, vx: 9, vy: -3, color: "lime" }); bullets.push({ x: bx, y: by-2, vx: 9, vy: 3, color: "lime" }); } else { const color = score >= 5000 ? "cyan" : "#ff0"; bullets.push({ x: bx, y: by-2, vx: 10, vy: 0, color: color }); if (score >= 5000) bullets.push({ x: bx, y: by-12, vx: 10, vy: 0, color: "cyan" }); } } startBtn.onclick = () => { if (container.requestFullscreen) container.requestFullscreen().catch(() => {}); score = 0; level = 1; survivalFrames = 0; gameOver = false; gameRunning = true; bullets = []; enemies = []; particles = []; items = []; enemyBullets = []; boss = null; bombs = 3; nextBossScore = 10000; player.x = 50; player.y = 180; updateUI(); startBtn.style.display = "none"; rankingContainer.style.display = "none"; couponDisplay.style.display = "none"; }; function loop() { if (gameRunning && !gameOver) { survivalFrames++; level = Math.floor(survivalFrames / 1000) + 1; if (tripleShotTime > 0) tripleShotTime--; if (bombActive > 0) bombActive--; updateUI(); if (score >= nextBossScore && !boss && bossWarning.style.display === "none") { bossWarning.style.display = "block"; setTimeout(() => { bossWarning.style.display = "none"; boss = { x: 650, y: 100, w: 100, h: 200, hp: 50*level, maxHp: 50*level, speed: 2, dir: 1, shootTimer: 0 }; }, 2000); } if (input.up && player.y > 0) player.y -= player.speed; if (input.down && player.y < 370) player.y += player.speed; if (input.left && player.x > 0) player.x -= player.speed; if (input.right && player.x < 560) player.x += player.speed; bullets.forEach((b, i) => { b.x += b.vx; b.y += b.vy; if (b.x > 600) bullets.splice(i, 1); }); enemyBullets.forEach((eb, i) => { eb.x += eb.vx; eb.y += eb.vy; if (eb.x < -10 || eb.y < -10 || eb.y > 410) enemyBullets.splice(i, 1); if (eb.x < player.x+player.w && eb.x+8 > player.x && eb.y < player.y+player.h && eb.y+8 > player.y) { handleGameOver(); } }); if (boss) { if (boss.x > 480) boss.x -= 2; boss.y += boss.speed * boss.dir; if (boss.y = 200) boss.dir *= -1; boss.shootTimer++; if (boss.shootTimer > 40/level) { enemyBullets.push({ x: boss.x, y: boss.y+boss.h/2, vx: -6, vy: (player.y - (boss.y+boss.h/2))/50 }); boss.shootTimer = 0; } bullets.forEach((b, bi) => { if (b.x < boss.x + boss.w && b.x + 15 > boss.x && b.y < boss.y + boss.h && b.y + 5 > boss.y) { boss.hp--; bullets.splice(bi, 1); if (boss.hp Math.max(10, 60 - level * 5)) { const type = Math.random(); enemies.push({ x: 600, y: Math.random()*360, w: type > 0.8 ? 50 : 30, h: type > 0.8 ? 50 : 30, hp: type > 0.8 ? 2 : 1, speed: 3+level, color: type > 0.8 ? "orange" : "red", shootTimer: Math.random()*50 }); spawnTimer = 0; } } enemies.forEach((e, ei) => { e.x -= e.speed; e.shootTimer++; if (e.shootTimer > 80 && e.x < 500) { enemyBullets.push({ x: e.x, y: e.y+e.h/2, vx: -5, vy: 0 }); e.shootTimer = 0; } bullets.forEach((b, bi) => { if (b.x < e.x + e.w && b.x + 15 > e.x && b.y < e.y + e.h && b.y + 5 > e.y) { e.hp--; bullets.splice(bi, 1); if (e.hp e.x && player.y < e.y+e.h && player.y+player.h > e.y) { handleGameOver(); } }); itemSpawnTimer++; if (itemSpawnTimer > 1200) { items.push({ x: 600, y: Math.random()*360, w: 25, h: 25 }); itemSpawnTimer = 0; } items.forEach((it, i) => { it.x -= 2; if (player.x < it.x+it.w && player.x+player.w > it.x && player.y < it.y+it.h && player.y+player.h > it.y) { tripleShotTime = 600; items.splice(i, 1); } }); particles.forEach((p, i) => { p.x += p.vx; p.y += p.vy; p.life--; if(p.life 0 ? "white" : "black"; ctx.fillRect(0, 0, 600, 400); ctx.fillStyle = "#0f0"; ctx.fillRect(player.x, player.y, player.w, player.h); bullets.forEach(b => { ctx.fillStyle = b.color; ctx.fillRect(b.x, b.y, 15, 5); }); enemyBullets.forEach(eb => { ctx.fillStyle = "red"; ctx.beginPath(); ctx.arc(eb.x, eb.y, 4, 0, Math.PI*2); ctx.fill(); }); enemies.forEach(e => { ctx.fillStyle = e.color; ctx.fillRect(e.x, e.y, e.w, e.h); }); if (boss) { ctx.fillStyle = "purple"; ctx.fillRect(boss.x, boss.y, boss.w, boss.h); ctx.fillStyle = "red"; ctx.fillRect(boss.x, boss.y-10, boss.w * (boss.hp / boss.maxHp), 5); } items.forEach(it => { ctx.fillStyle = "lime"; ctx.beginPath(); ctx.arc(it.x+12, it.y+12, 12, 0, Math.PI*2); ctx.fill(); }); particles.forEach(p => { ctx.fillStyle = p.color; ctx.fillRect(p.x, p.y, 3, 3); }); requestAnimationFrame(loop); } // --- 修正:ゲームオーバー時の処理を一箇所にまとめる --- function handleGameOver() { if (gameOver) return; gameOver = true; saveScore(score); updateRankingDisplay(); if (score >= 20000) { couponDisplay.style.display = "block"; } else { rankingContainer.style.display = "block"; } startBtn.innerText = "リトライ 🔄"; startBtn.style.display = "block"; } updateRankingDisplay(); // 初期表示 loop(); })();
-
豊橋F
豊橋ルーム一周年記念イベント開催!
こちらのイベントは終了いたしました 📢 豊橋ルーム一周年イベントへのたくさんのご来店、 誠にありがとうございました ✨ 今後とも当店をよろしくお願いいたします 🙏 豊橋ルーム一周年イベント開催♪ いつもよりお安い金額でご利用頂けます 期間は9/1~9/30まで ※こちらのイベント割引は当日予約のみ適用となります! ぜひぜひご利用お待ちしております!
-
1