| let balance = 10; |
| let flipsLeft = 1000; |
| let currentCoin = 1; |
| let coins = []; |
|
|
| function updateStats() { |
| document.getElementById("balance").textContent = `$${balance.toFixed(2)}`; |
| document.getElementById("flips-left").textContent = flipsLeft; |
| } |
| function updateShop() { |
| const shop = document.getElementById("shop"); |
| shop.innerHTML = ""; |
|
|
| coins.forEach((coin) => { |
| const coinElement = document.createElement("div"); |
| coinElement.className = "shop-item"; |
| coinElement.innerHTML = ` |
| <div class="coin-icon ${coin.id === currentCoin ? "selected" : ""}" |
| style="background-color: ${coin.color};" |
| onclick="selectCoin(${coin.id})" |
| title="Win Rate: ${(coin.winrate * 100).toFixed(1)}% |
| Value: $${coin.value.toFixed(2)} |
| Price: $${coin.price}"></div> |
| <div>$${coin.price}</div> |
| `; |
| shop.appendChild(coinElement); |
| }); |
|
|
| const mintButton = document.createElement("button"); |
| mintButton.id = "mint-button"; |
| mintButton.textContent = "🎲 Mint ($4)"; |
| mintButton.onclick = mintCoin; |
| shop.appendChild(mintButton); |
| } |
|
|
| function selectCoin(id) { |
| const coin = coins.find((c) => c.id === id); |
| if (coin && balance >= coin.price) { |
| balance -= coin.price; |
| currentCoin = id; |
| updateStats(); |
| updateShop(); |
| } |
| } |
|
|
| async function flipCoin() { |
| if (flipsLeft > 0) { |
| flipsLeft--; |
| const response = await fetch("/api/flip", { |
| method: "POST", |
| headers: { |
| "Content-Type": "application/json", |
| }, |
| body: JSON.stringify({ coinId: currentCoin }), |
| }); |
| const result = await response.json(); |
|
|
| const coin = document.getElementById("coin"); |
| coin.style.transform = "rotateY(720deg)"; |
| setTimeout(() => { |
| coin.style.transform = "rotateY(0deg)"; |
| if (result.result === "heads") { |
| balance += result.value; |
| coin.textContent = "H"; |
| } else { |
| coin.textContent = "T"; |
| } |
| updateStats(); |
| }, 500); |
|
|
| if (flipsLeft === 0) { |
| setTimeout(gameOver, 1000); |
| } |
| } |
| } |
|
|
| async function mintCoin() { |
| if (balance >= 4) { |
| balance -= 4; |
| const response = await fetch("/api/mint", { method: "POST" }); |
| const newCoin = await response.json(); |
| coins.push(newCoin); |
| updateStats(); |
| updateShop(); |
| } |
| } |
|
|
| async function gameOver() { |
| const gameOverScreen = document.createElement("div"); |
| gameOverScreen.id = "game-over"; |
| gameOverScreen.innerHTML = ` |
| <h2>Game Over</h2> |
| <p>Your final balance: $${balance.toFixed(2)}</p> |
| <div id="leaderboard"></div> |
| <form id="initials-form"> |
| <input type="text" id="initials-input" maxlength="3" placeholder="Enter your initials"> |
| <button type="submit" id="submit-score">Submit Score</button> |
| </form> |
| <button id="play-again">Play Again</button> |
| `; |
| document.body.appendChild(gameOverScreen); |
|
|
| document.getElementById("initials-form").onsubmit = submitScore; |
| document.getElementById("play-again").onclick = resetGame; |
|
|
| await updateLeaderboard(); |
| } |
|
|
| async function submitScore(event) { |
| event.preventDefault(); |
| const initials = document |
| .getElementById("initials-input") |
| .value.toUpperCase(); |
| if (initials) { |
| await fetch("/api/leaderboard", { |
| method: "POST", |
| headers: { |
| "Content-Type": "application/json", |
| }, |
| body: JSON.stringify({ initials, score: balance }), |
| }); |
| await updateLeaderboard(); |
| } |
| } |
|
|
| async function updateLeaderboard() { |
| const response = await fetch("/api/leaderboard"); |
| const leaderboard = await response.json(); |
| const leaderboardElement = document.getElementById("leaderboard"); |
| leaderboardElement.innerHTML = ` |
| <h3>Leaderboard</h3> |
| <table> |
| <tr><th>Rank</th><th>Initials</th><th>Score</th></tr> |
| ${leaderboard |
| .map( |
| (entry, index) => ` |
| <tr> |
| <td>${index + 1}</td> |
| <td>${entry.initials}</td> |
| <td>$${entry.score.toFixed(2)}</td> |
| </tr> |
| `, |
| ) |
| .join("")} |
| </table> |
| `; |
| } |
| function resetGame() { |
| balance = 10; |
| flipsLeft = 1000; |
| currentCoin = 1; |
| coins = []; |
| initGame(); |
| updateStats(); |
| updateShop(); |
| document.getElementById("game-over").remove(); |
| } |
|
|
| async function initGame() { |
| const response = await fetch("/api/coins"); |
| coins = await response.json(); |
| updateStats(); |
| updateShop(); |
| document.getElementById("coin").onclick = flipCoin; |
| } |
|
|
| initGame(); |
|
|
| console.log("Game initialized successfully"); |
|
|