diff --git a/Form Profile.html b/Form Profile.html deleted file mode 100644 index c5caf71..0000000 --- a/Form Profile.html +++ /dev/null @@ -1,148 +0,0 @@ - - - - - - Profile Editor - - - - -

Profile Editor

- -
- - - - - - - - - - - -
- -
-

Daftar Profile

-
-
- - - - - \ No newline at end of file diff --git a/ody git.html b/ody git.html deleted file mode 100644 index e69de29..0000000 diff --git a/ody git.js b/ody git.js new file mode 100644 index 0000000..d8df560 --- /dev/null +++ b/ody git.js @@ -0,0 +1,242 @@ +// Simple Blackjack implementation +const SUITS = ['♠','♥','♦','♣']; +const RANKS = ['A','2','3','4','5','6','7','8','9','10','J','Q','K']; + +const dealerHandEl = document.getElementById('dealer-hand'); +const playerHandEl = document.getElementById('player-hand'); +const dealerValueEl = document.getElementById('dealer-value'); +const playerValueEl = document.getElementById('player-value'); +const balanceEl = document.getElementById('balance'); +const betInput = document.getElementById('bet-input'); +const betBtn = document.getElementById('bet-btn'); +const currentBetEl = document.getElementById('current-bet'); +const hitBtn = document.getElementById('hit'); +const standBtn = document.getElementById('stand'); +const doubleBtn = document.getElementById('double'); +const newRoundBtn = document.getElementById('new-round'); +const messageEl = document.getElementById('message'); + +let deck = []; +let dealer = []; +let player = []; +let dealerHidden = true; +let balance = 1000; +let currentBet = 0; +let inRound = false; + +// Membuat deck kartu +function makeDeck() { + deck = []; + for (let s of SUITS) { + for (let r of RANKS) { + deck.push({ suit: s, rank: r }); + } + } +} + +// Shuffle +function shuffle() { + for (let i = deck.length - 1; i > 0; i--) { + const j = Math.floor(Math.random() * (i + 1)); + [deck[i], deck[j]] = [deck[j], deck[i]]; + } +} + +// Nilai kartu +function cardValue(card) { + if (card.rank === 'A') return 11; + if (['J','Q','K'].includes(card.rank)) return 10; + return Number(card.rank); +} + +// Nilai total tangan +function handValues(hand) { + let total = 0; + let aceCount = 0; + + for (let c of hand) { + total += cardValue(c); + if (c.rank === 'A') aceCount++; + } + + while (total > 21 && aceCount > 0) { + total -= 10; + aceCount--; + } + + return total; +} + +// Render kartu +function renderHand(container, hand, hideFirst = false) { + container.innerHTML = ''; + + hand.forEach((card, i) => { + const div = document.createElement('div'); + div.className = 'card'; + + // warna merah ♥ ♦ + if (card.suit === '♥' || card.suit === '♦') { + div.classList.add('red'); + } + + if (hideFirst && i === 0) { + div.className = "card back"; + div.textContent = "🂠"; + } else { + div.innerHTML = ` +
${card.rank}${card.suit}
+
${card.rank}${card.suit}
+ `; + } + + container.appendChild(div); + }); +} + +// Update UI +function updateUI() { + renderHand(playerHandEl, player, false); + renderHand(dealerHandEl, dealer, dealerHidden); + + dealerValueEl.textContent = dealerHidden ? "?" : handValues(dealer); + playerValueEl.textContent = handValues(player); + + balanceEl.textContent = balance; + currentBetEl.textContent = currentBet; + + hitBtn.disabled = !inRound; + standBtn.disabled = !inRound; + doubleBtn.disabled = !inRound; + + if (!inRound) { + messageEl.textContent = "Pasang taruhan untuk mulai."; + } +} + +// Mulai ronde +function startRound() { + if (inRound) return; + + const bet = Number(betInput.value); + + if (bet <= 0 || bet > balance) { + messageEl.textContent = "Taruhan tidak valid!"; + return; + } + + balance -= bet; + currentBet = bet; + + makeDeck(); + shuffle(); + + dealer = [deck.pop(), deck.pop()]; + player = [deck.pop(), deck.pop()]; + + dealerHidden = true; + inRound = true; + + messageEl.textContent = "Permainan dimulai!"; + updateUI(); + + // Natural blackjack + if (handValues(player) === 21) { + playerStand(); + } +} + +// Player hit +function playerHit() { + if (!inRound) return; + player.push(deck.pop()); + updateUI(); + + if (handValues(player) > 21) { + dealerHidden = false; + messageEl.textContent = "Kamu bust! Dealer menang."; + inRound = false; + updateUI(); + } +} + +// Player stand +function playerStand() { + if (!inRound) return; + + dealerHidden = false; + + while (handValues(dealer) < 17) { + dealer.push(deck.pop()); + } + + const pv = handValues(player); + const dv = handValues(dealer); + + if (dv > 21 || pv > dv) { + messageEl.textContent = "Kamu menang!"; + balance += currentBet * 2; + } else if (pv === dv) { + messageEl.textContent = "Seri!"; + balance += currentBet; + } else { + messageEl.textContent = "Dealer menang!"; + } + + currentBet = 0; + inRound = false; + updateUI(); +} + +// Double down +function playerDouble() { + if (!inRound) return; + if (balance < currentBet) { + messageEl.textContent = "Saldo tidak cukup untuk double!"; + return; + } + + balance -= currentBet; + currentBet *= 2; + + player.push(deck.pop()); + updateUI(); + + if (handValues(player) > 21) { + dealerHidden = false; + messageEl.textContent = "Bust saat double! Dealer menang."; + inRound = false; + return updateUI(); + } + + playerStand(); +} + +// Reset game +newRoundBtn.addEventListener('click', () => { + balance = 1000; + currentBet = 0; + dealer = []; + player = []; + deck = []; + inRound = false; + dealerHidden = true; + messageEl.textContent = "Bank di-reset."; + updateUI(); +}); + +// Events +betBtn.addEventListener('click', startRound); +hitBtn.addEventListener('click', playerHit); +standBtn.addEventListener('click', playerStand); +doubleBtn.addEventListener('click', playerDouble); + +// Keyboard shortcut +window.addEventListener('keydown', e => { + if (e.key === 'h') playerHit(); + if (e.key === 's') playerStand(); + if (e.key === 'd') playerDouble(); + if (e.key === 'Enter') startRound(); +}); + +updateUI(); \ No newline at end of file