Spaces:
Sleeping
Sleeping
| let balance = 0; | |
| let flipsLeft = 1000; | |
| let currentCoin = 0; | |
| let isGenerating = false; | |
| function updateInfo() { | |
| document.getElementById("balance").textContent = balance.toFixed(2); | |
| document.getElementById("flips-left").textContent = flipsLeft; | |
| } | |
| function flipCoin() { | |
| if (flipsLeft > 0 && !isGenerating) { | |
| fetch("/flip", { | |
| method: "POST", | |
| headers: { | |
| "Content-Type": "application/json", | |
| }, | |
| body: JSON.stringify({ coin_index: currentCoin }), | |
| }) | |
| .then((response) => response.json()) | |
| .then((data) => { | |
| if (data.error) { | |
| alert(data.error); | |
| } else { | |
| const coin = document.getElementById("coin"); | |
| coin.textContent = data.result; | |
| balance = data.balance; | |
| flipsLeft = data.flips_left; | |
| updateInfo(); | |
| // Reset coin appearance after a short delay | |
| setTimeout(() => { | |
| coin.textContent = ""; | |
| }, 500); | |
| if (flipsLeft === 0) { | |
| showGameOver(); | |
| } | |
| } | |
| }); | |
| } | |
| } | |
| function buyCoin(index) { | |
| if (!isGenerating && index !== currentCoin) { | |
| fetch("/buy", { | |
| method: "POST", | |
| headers: { | |
| "Content-Type": "application/json", | |
| }, | |
| body: JSON.stringify({ index: index }), | |
| }) | |
| .then((response) => response.json()) | |
| .then((data) => { | |
| if (data.success) { | |
| balance = data.balance; | |
| currentCoin = data.current_coin; | |
| document.getElementById("coin").style.backgroundColor = coins[currentCoin].color; | |
| updateInfo(); | |
| updateSelectedCoin(); | |
| } else { | |
| alert("Not enough money to buy this coin or you already own it!"); | |
| } | |
| }); | |
| } | |
| } | |
| function generateCoin() { | |
| if (!isGenerating && balance >= 4) { | |
| isGenerating = true; | |
| document.getElementById("loading-overlay").style.display = "flex"; | |
| fetch("/generate_coin", { | |
| method: "POST", | |
| }) | |
| .then((response) => response.json()) | |
| .then((data) => { | |
| if (data.success) { | |
| coins.push(data.coin); | |
| const shop = document.getElementById("shop"); | |
| const newCoin = createShopItem(data.coin, coins.length - 1); | |
| shop.appendChild(newCoin); | |
| balance = data.balance; | |
| updateInfo(); | |
| } else { | |
| alert("Failed to generate new coin: " + data.error); | |
| balance = data.balance; | |
| updateInfo(); | |
| } | |
| }) | |
| .finally(() => { | |
| isGenerating = false; | |
| document.getElementById("loading-overlay").style.display = "none"; | |
| }); | |
| } else if (balance < 4) { | |
| alert("Not enough balance to generate a coin"); | |
| } | |
| } | |
| function createShopItem(coin, index) { | |
| const shopItem = document.createElement("div"); | |
| shopItem.className = "shop-item"; | |
| shopItem.dataset.index = index; | |
| const shopCoin = document.createElement("div"); | |
| shopCoin.className = "shop-coin"; | |
| shopCoin.style.backgroundColor = coin.color; | |
| const coinPrice = document.createElement("span"); | |
| coinPrice.className = "coin-price"; | |
| coinPrice.textContent = `$${coin.price.toFixed(2)}`; | |
| const coinName = document.createElement("div"); | |
| coinName.className = "coin-name"; | |
| coinName.textContent = coin.name; | |
| const coinTooltip = document.createElement("div"); | |
| coinTooltip.className = "coin-tooltip"; | |
| coinTooltip.innerHTML = ` | |
| <strong>${coin.name}</strong><br> | |
| Cost: $${coin.price.toFixed(2)}<br> | |
| Value: $${coin.value.toFixed(2)}<br> | |
| Win rate: ${(coin.winrate * 100).toFixed(2)}%<br> | |
| Bonus: $${coin.bonus.toFixed(2)} | |
| `; | |
| shopCoin.appendChild(coinPrice); | |
| shopItem.appendChild(shopCoin); | |
| shopItem.appendChild(coinName); | |
| shopItem.appendChild(coinTooltip); | |
| shopItem.onclick = () => buyCoin(index); | |
| return shopItem; | |
| } | |
| function updateSelectedCoin() { | |
| const shopItems = document.querySelectorAll('.shop-item'); | |
| shopItems.forEach((item, index) => { | |
| if (index === currentCoin) { | |
| item.classList.add('selected'); | |
| } else { | |
| item.classList.remove('selected'); | |
| } | |
| }); | |
| } | |
| function showGameOver() { | |
| const modal = document.getElementById("game-over"); | |
| const finalScore = document.getElementById("final-score"); | |
| finalScore.textContent = balance.toFixed(2); | |
| modal.style.display = "block"; | |
| } | |
| function submitScore() { | |
| const initials = document.getElementById("initials").value.toUpperCase(); | |
| if (initials.length > 0) { | |
| fetch("/game_over", { | |
| method: "POST", | |
| headers: { | |
| "Content-Type": "application/json", | |
| }, | |
| body: JSON.stringify({ initials: initials }), | |
| }) | |
| .then((response) => response.json()) | |
| .then((data) => { | |
| if (data.success) { | |
| location.reload(); // Reload the page to start a new game and show updated leaderboard | |
| } | |
| }); | |
| } else { | |
| alert("Please enter your initials"); | |
| } | |
| } | |
| function resetGame() { | |
| fetch("/reset_game", { | |
| method: "POST", | |
| }) | |
| .then((response) => response.json()) | |
| .then((data) => { | |
| if (data.success) { | |
| balance = 0; | |
| flipsLeft = 1000; | |
| currentCoin = 0; | |
| updateInfo(); | |
| document.getElementById("coin").style.backgroundColor = coins[0].color; | |
| document.getElementById("game-over").style.display = "none"; | |
| updateSelectedCoin(); | |
| } | |
| }); | |
| } | |
| document.addEventListener("DOMContentLoaded", () => { | |
| updateInfo(); | |
| document.getElementById("coin").onclick = flipCoin; | |
| document.getElementById("generate-coin").onclick = generateCoin; | |
| document.getElementById("submit-score").onclick = submitScore; | |
| document.getElementById("play-again").onclick = resetGame; | |
| document.getElementById("coin").style.backgroundColor = coins[0].color; | |
| updateSelectedCoin(); | |
| }); |