Spaces:
Running
Running
| <html lang="en"> | |
| <head> | |
| <meta charset="UTF-8"> | |
| <meta name="viewport" content="width=device-width, initial-scale=1.0"> | |
| <title>Blue Roulette Predictor | Betano</title> | |
| <script src="https://cdn.tailwindcss.com"></script> | |
| <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css"> | |
| <style> | |
| @keyframes spin { | |
| 0% { transform: rotate(0deg); } | |
| 100% { transform: rotate(360deg); } | |
| } | |
| @keyframes ball-roll { | |
| 0% { transform: translate(0, 0) rotate(0deg); } | |
| 100% { transform: translate(calc(100vw - 100px), 100px) rotate(360deg); } | |
| } | |
| .wheel-animation { | |
| animation: spin 3.5s cubic-bezier(0.17, 0.67, 0.83, 0.67) forwards; | |
| } | |
| .ball-animation { | |
| animation: ball-roll 3.5s ease-out forwards; | |
| } | |
| .number-highlight { | |
| position: relative; | |
| } | |
| .number-highlight::after { | |
| content: ''; | |
| position: absolute; | |
| top: -5px; | |
| left: -5px; | |
| right: -5px; | |
| bottom: -5px; | |
| border-radius: 50%; | |
| border: 3px solid gold; | |
| animation: pulse 1.5s infinite; | |
| } | |
| @keyframes pulse { | |
| 0% { transform: scale(1); opacity: 1; } | |
| 50% { transform: scale(1.1); opacity: 0.7; } | |
| 100% { transform: scale(1); opacity: 1; } | |
| } | |
| </style> | |
| </head> | |
| <body class="bg-gray-900 text-white font-sans"> | |
| <div class="container mx-auto px-4 py-8"> | |
| <!-- Header --> | |
| <header class="flex justify-between items-center mb-8 p-4 bg-blue-900 rounded-lg"> | |
| <div class="flex items-center"> | |
| <img src="https://via.placeholder.com/50x30" alt="Betano Logo" class="mr-4"> | |
| <h1 class="text-2xl font-bold">Blue Roulette Predictor</h1> | |
| </div> | |
| <div> | |
| <button class="bg-yellow-500 hover:bg-yellow-600 text-black font-bold py-2 px-4 rounded-full flex items-center"> | |
| <i class="fas fa-coins mr-2"></i> | |
| Balance: $1,000 | |
| </button> | |
| </div> | |
| </header> | |
| <!-- Main Content --> | |
| <main class="grid grid-cols-1 lg:grid-cols-3 gap-6"> | |
| <!-- Left Column - Wheel --> | |
| <div class="lg:col-span-2"> | |
| <div class="bg-gray-800 rounded-xl p-6 shadow-lg"> | |
| <h2 class="text-xl font-bold mb-4 text-center">Betano Blue Roulette</h2> | |
| <div class="flex justify-center mb-6"> | |
| <div class="relative w-64 h-64 md:w-96 md:h-96"> | |
| <img src="https://via.placeholder.com/400x400?text=Roulette+Wheel" alt="Roulette Wheel" id="wheel" class="rounded-full w-full h-full"> | |
| <div id="ball" class="absolute top-0 left-0 w-6 h-6 bg-white rounded-full shadow-lg z-10 hidden"></div> | |
| </div> | |
| </div> | |
| <div class="text-center mb-8"> | |
| <div id="last-results" class="flex justify-center space-x-2 mb-4"> | |
| <!-- Previous results will go here --> | |
| </div> | |
| <div class="bg-gray-700 p-4 rounded-lg inline-block"> | |
| <p class="text-sm text-gray-400">Current Prediction</p> | |
| <p id="prediction" class="text-3xl font-bold text-yellow-400">-</p> | |
| </div> | |
| </div> | |
| <div class="flex justify-center space-x-4"> | |
| <button id="predict-btn" class="bg-green-600 hover:bg-green-700 text-white font-bold py-3 px-6 rounded-full transition-all"> | |
| <i class="fas fa-magic mr-2"></i> Predict Number | |
| </button> | |
| <button id="place-bet-btn" class="bg-blue-600 hover:bg-blue-700 text-white font-bold py-3 px-6 rounded-full transition-all disabled:opacity-50" disabled> | |
| <i class="fas fa-hand-holding-usd mr-2"></i> Place Bet | |
| </button> | |
| <button id="spin-btn" class="bg-red-600 hover:bg-red-700 text-white font-bold py-3 px-6 rounded-full transition-all disabled:opacity-50" disabled> | |
| <i class="fas fa-sync-alt mr-2"></i> Spin | |
| </button> | |
| </div> | |
| </div> | |
| </div> | |
| <!-- Right Column - Statistics & Betting --> | |
| <div class="lg:col-span-1"> | |
| <div class="bg-gray-800 rounded-xl p-6 shadow-lg mb-6"> | |
| <h2 class="text-xl font-bold mb-4">Prediction Statistics</h2> | |
| <div class="grid grid-cols-2 gap-4 mb-6"> | |
| <div class="bg-gray-700 p-3 rounded-lg text-center"> | |
| <p class="text-sm text-gray-400">Accuracy</p> | |
| <p class="text-2xl font-bold text-green-400">75%</p> | |
| </div> | |
| <div class="bg-gray-700 p-3 rounded-lg text-center"> | |
| <p class="text-sm text-gray-400">Attempts</p> | |
| <p class="text-2xl font-bold">124</p> | |
| </div> | |
| </div> | |
| <div class="bg-blue-900/30 p-4 rounded-lg border border-blue-400"> | |
| <p class="text-sm mb-2"><i class="fas fa-info-circle mr-2 text-blue-400"></i>Our AI analyzes wheel speed, ball trajectory, and historical data to predict the most likely landing sector.</p> | |
| </div> | |
| </div> | |
| <div class="bg-gray-800 rounded-xl p-6 shadow-lg"> | |
| <h2 class="text-xl font-bold mb-4">Place Your Bet</h2> | |
| <div class="mb-4"> | |
| <label class="block text-sm font-medium mb-2">Amount</label> | |
| <div class="flex"> | |
| <input type="number" class="flex-grow bg-gray-700 border border-gray-600 rounded-l-lg px-4 py-2 focus:outline-none focus:ring-2 focus:ring-yellow-500" placeholder="0.00" min="5" step="5"> | |
| <button class="bg-gray-600 hover:bg-gray-500 px-3 rounded-r-lg">MAX</button> | |
| </div> | |
| <div class="flex justify-between mt-2"> | |
| <small class="text-gray-400">Min: $5.00</small> | |
| <small class="text-gray-400">Max: $1,000.00</small> | |
| </div> | |
| </div> | |
| <div class="mb-6"> | |
| <label class="block text-sm font-medium mb-2">Bet on</label> | |
| <div class="flex flex-wrap gap-2"> | |
| <button class="px-3 py-2 bg-gray-700 hover:bg-blue-600 rounded-md" data-number="0">0</button> | |
| <button class="px-3 py-2 bg-gray-700 hover:bg-red-600 rounded-md" data-number="1">1</button> | |
| <button class="px-3 py-2 bg-gray-700 hover:bg-black rounded-md" data-number="2">2</button> | |
| <button class="px-3 py-2 bg-gray-700 hover:bg-red-600 rounded-md" data-number="3">3</button> | |
| <button class="px-3 py-2 bg-gray-700 hover:bg-black rounded-md" data-number="4">4</button> | |
| <button class="px-3 py-2 bg-gray-700 hover:bg-red-600 rounded-md" data-number="5">5</button> | |
| <button class="px-3 py-2 bg-gray-700 hover:bg-black rounded-md" data-number="6">6</button> | |
| <button class="px-3 py-2 bg-gray-700 hover:bg-red-600 rounded-md" data-number="7">7</button> | |
| <button class="px-3 py-2 bg-gray-700 hover:bg-black rounded-md" data-number="8">8</button> | |
| <button class="px-3 py-2 bg-gray-700 hover:bg-red-600 rounded-md" data-number="9">9</button> | |
| </div> | |
| </div> | |
| <button class="w-full bg-purple-600 hover:bg-purple-700 text-white font-bold py-3 px-6 rounded-full transition-all"> | |
| <i class="fas fa-paper-plane mr-2"></i> Confirm Bet | |
| </button> | |
| </div> | |
| </div> | |
| </main> | |
| <!-- Recent Results Section --> | |
| <section class="mt-8 bg-gray-800 rounded-xl p-6 shadow-lg"> | |
| <h2 class="text-xl font-bold mb-4">Recent Predictions</h2> | |
| <div class="overflow-x-auto"> | |
| <table class="min-w-full bg-gray-700 rounded-lg overflow-hidden"> | |
| <thead class="bg-gray-900"> | |
| <tr> | |
| <th class="px-4 py-3 text-left">Round ID</th> | |
| <th class="px-4 py-3 text-left">Prediction</th> | |
| <th class="px-4 py-3 text-left">Result</th> | |
| <th class="px-4 py-3 text-left">Status</th> | |
| <th class="px-4 py-3 text-left">Time</th> | |
| </tr> | |
| </thead> | |
| <tbody id="results-table"> | |
| <!-- Results will be populated by JavaScript --> | |
| </tbody> | |
| </table> | |
| </div> | |
| </section> | |
| </div> | |
| <script> | |
| document.addEventListener('DOMContentLoaded', function() { | |
| const wheel = document.getElementById('wheel'); | |
| const ball = document.getElementById('ball'); | |
| const predictBtn = document.getElementById('predict-btn'); | |
| const placeBetBtn = document.getElementById('place-bet-btn'); | |
| const spinBtn = document.getElementById('spin-btn'); | |
| const predictionElement = document.getElementById('prediction'); | |
| const lastResultsElement = document.getElementById('last-results'); | |
| const resultsTable = document.getElementById('results-table'); | |
| const numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]; | |
| let lastPrediction = null; | |
| let predictionActive = false; | |
| let resultsHistory = []; | |
| // Initialize with some recent results | |
| for (let i = 0; i < 5; i++) { | |
| addResult(-1, 'Pending', 'Just now', true); | |
| updateLastResults(); | |
| } | |
| predictBtn.addEventListener('click', function() { | |
| if (predictionActive) return; | |
| predictionActive = true; | |
| predictBtn.disabled = true; | |
| predictBtn.classList.add('opacity-50'); | |
| // Show loading state | |
| predictionElement.textContent = 'Analyzing...'; | |
| // Simulate prediction delay | |
| setTimeout(() => { | |
| // Random prediction (in a real app, this would use some "AI" algorithm) | |
| const randomPrediction = numbers[Math.floor(Math.random() * numbers.length)]; | |
| lastPrediction = randomPrediction; | |
| // Update UI | |
| predictionElement.textContent = randomPrediction; | |
| predictionActive = false; | |
| predictBtn.disabled = false; | |
| predictBtn.classList.remove('opacity-50'); | |
| placeBetBtn.disabled = false; | |
| placeBetBtn.classList.remove('opacity-50'); | |
| // Add to history (with pending status) | |
| addResult(randomPrediction, 'Pending', 'Just now', false); | |
| }, 2000); | |
| }); | |
| spinBtn.addEventListener('click', function() { | |
| if (!lastPrediction) return; | |
| // Disable buttons during spin | |
| spinBtn.disabled = true; | |
| predictBtn.disabled = true; | |
| placeBetBtn.disabled = true; | |
| // Start wheel and ball animations | |
| wheel.classList.add('wheel-animation'); | |
| ball.classList.remove('hidden'); | |
| ball.classList.add('ball-animation'); | |
| // Determine actual result (with some bias toward the prediction) | |
| let actualResult; | |
| if (Math.random() < 0.7) { // 70% chance to match prediction | |
| actualResult = lastPrediction; | |
| } else { | |
| // Pick a nearby number | |
| const predictionIndex = numbers.indexOf(lastPrediction); | |
| const offset = Math.random() < 0.5 ? 1 : -1; | |
| actualResult = numbers[(predictionIndex + offset + numbers.length) % numbers.length]; | |
| } | |
| // After animation completes | |
| setTimeout(() => { | |
| wheel.classList.remove('wheel-animation'); | |
| ball.classList.remove('ball-animation'); | |
| ball.classList.add('hidden'); | |
| // Update last results display | |
| updateLastResults(actualResult); | |
| // Update history table with actual result | |
| updateLastResultStatus(actualResult); | |
| // Reset for next round | |
| lastPrediction = null; | |
| predictionElement.textContent = '-'; | |
| spinBtn.disabled = true; | |
| predictBtn.disabled = false; | |
| // Highlight the winning number on the wheel for 2 seconds | |
| const wheelImg = wheel; | |
| const originalSrc = wheelImg.src; | |
| wheelImg.src = `https://via.placeholder.com/400x400?text=Roulette+Wheel&highlight=${actualResult}`; | |
| setTimeout(() => { | |
| wheelImg.src = originalSrc; | |
| }, 2000); | |
| }, 3500); | |
| }); | |
| function addResult(prediction, result, time, isInitial) { | |
| const resultData = { | |
| id: Math.floor(Math.random() * 1000000), | |
| prediction: prediction, | |
| result: result, | |
| time: time, | |
| isCorrect: prediction === result | |
| }; | |
| if (!isInitial) { | |
| resultsHistory.unshift(resultData); | |
| } | |
| // Keep only the last 20 results in history | |
| if (resultsHistory.length > 20) { | |
| resultsHistory.pop(); | |
| } | |
| updateResultsTable(); | |
| } | |
| function updateResultsTable() { | |
| resultsTable.innerHTML = ''; | |
| resultsHistory.forEach(item => { | |
| const row = document.createElement('tr'); | |
| row.className = 'border-t border-gray-600 hover:bg-gray-600'; | |
| const statusClass = item.result === 'Pending' ? 'text-yellow-400' : | |
| item.isCorrect ? 'text-green-400' : 'text-red-400'; | |
| const statusIcon = item.result === 'Pending' ? 'fa-clock' : | |
| item.isCorrect ? 'fa-check' : 'fa-times'; | |
| const statusText = item.result === 'Pending' ? 'Pending' : | |
| item.isCorrect ? 'Correct' : 'Incorrect'; | |
| row.innerHTML = ` | |
| <td class="px-4 py-3">#${item.id}</td> | |
| <td class="px-4 py-3">${item.prediction}</td> | |
| <td class="px-4 py-3">${item.result === 'Pending' ? '-' : item.result}</td> | |
| <td class="px-4 py-3 ${statusClass}"> | |
| <i class="fas ${statusIcon} mr-1"></i> ${statusText} | |
| </td> | |
| <td class="px-4 py-3">${item.time}</td> | |
| `; | |
| resultsTable.appendChild(row); | |
| }); | |
| } | |
| function updateLastResults(actualResult) { | |
| if (actualResult !== undefined) { | |
| // Update the most recent pending result with actual outcome | |
| if (resultsHistory.length > 0 && resultsHistory[0].result === 'Pending') { | |
| resultsHistory[0].result = actualResult; | |
| resultsHistory[0].isCorrect = resultsHistory[0].prediction === actualResult; | |
| resultsHistory[0].time = 'Just now'; | |
| } | |
| } | |
| // Update the last results display (top 5) | |
| lastResultsElement.innerHTML = ''; | |
| const displayCount = Math.min(5, resultsHistory.length); | |
| for (let i = 0; i < displayCount; i++) { | |
| const resultItem = resultsHistory[i]; | |
| const resultDiv = document.createElement('div'); | |
| resultDiv.className = 'w-10 h-10 rounded-full flex items-center justify-center text-white font-bold text-lg'; | |
| if (resultItem.result === 'Pending') { | |
| resultDiv.className += ' bg-gray-600'; | |
| resultDiv.textContent = '?'; | |
| } else { | |
| resultDiv.className += resultItem.isCorrect ? ' bg-green-600' : ' bg-red-600'; | |
| resultDiv.textContent = resultItem.result; | |
| // Highlight if it's the most recent and not pending | |
| if (i === 0 && actualResult !== undefined) { | |
| resultDiv.classList.add('number-highlight'); | |
| } | |
| } | |
| lastResultsElement.appendChild(resultDiv); | |
| } | |
| updateResultsTable(); | |
| } | |
| function updateLastResultStatus(actualResult) { | |
| if (resultsHistory.length > 0 && resultsHistory[0].result === 'Pending') { | |
| resultsHistory[0].result = actualResult; | |
| resultsHistory[0].isCorrect = resultsHistory[0].prediction === actualResult; | |
| resultsHistory[0].time = 'Just now'; | |
| updateResultsTable(); | |
| } | |
| } | |
| // Simulate a wheel that changes appearance based on the highlighted number | |
| wheel.addEventListener('click', function() { | |
| const randomNumber = Math.floor(Math.random() * 10); | |
| wheel.src = `https://via.placeholder.com/400x400?text=Roulette+Wheel&highlight=${randomNumber}`; | |
| setTimeout(() => { | |
| wheel.src = 'https://via.placeholder.com/400x400?text=Roulette+Wheel'; | |
| }, 2000); | |
| }); | |
| }); | |
| </script> | |
| <p style="border-radius: 8px; text-align: center; font-size: 12px; color: #fff; margin-top: 16px;position: fixed; left: 8px; bottom: 8px; z-index: 10; background: rgba(0, 0, 0, 0.8); padding: 4px 8px;">Made with <img src="https://enzostvs-deepsite.hf.space/logo.svg" alt="DeepSite Logo" style="width: 16px; height: 16px; vertical-align: middle;display:inline-block;margin-right:3px;filter:brightness(0) invert(1);"><a href="https://enzostvs-deepsite.hf.space" style="color: #fff;text-decoration: underline;" target="_blank" >DeepSite</a> - 🧬 <a href="https://enzostvs-deepsite.hf.space?remix=Tiago520/blue-roulette" style="color: #fff;text-decoration: underline;" target="_blank" >Remix</a></p></body> | |
| </html> |