diff --git a/ody git.js b/ody git.js
index d8df560..c63272f 100644
--- a/ody git.js
+++ b/ody git.js
@@ -1,242 +1,171 @@
-// Simple Blackjack implementation
-const SUITS = ['♠','♥','♦','♣'];
-const RANKS = ['A','2','3','4','5','6','7','8','9','10','J','Q','K'];
+ // 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');
+ // DOM
+ 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;
+ 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');
+ function makeDeck(){
+ deck = [];
+ for(const s of SUITS){
+ for(const r of RANKS){
+ deck.push({suit:s,rank:r});
+ }
+ }
}
- if (hideFirst && i === 0) {
- div.className = "card back";
- div.textContent = "🂠";
- } else {
- div.innerHTML = `
-
${card.rank}${card.suit}
- ${card.rank}${card.suit}
- `;
+ 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]];
+ }
}
- container.appendChild(div);
- });
-}
+ function cardValue(card){
+ const r = card.rank;
+ if(r==='A') return [1,11];
+ if(['J','Q','K'].includes(r)) return [10];
+ return [parseInt(r,10)];
+ }
-// Update UI
-function updateUI() {
- renderHand(playerHandEl, player, false);
- renderHand(dealerHandEl, dealer, dealerHidden);
+ function handValues(hand){
+ // returns best value <=21 or smallest if bust
+ let totals = [0];
+ for(const c of hand){
+ const vals = cardValue(c);
+ const newTotals = [];
+ for(const t of totals){
+ for(const v of vals){ newTotals.push(t+v); }
+ }
+ totals = Array.from(new Set(newTotals));
+ }
+ // separate <=21 and >21
+ const valid = totals.filter(t=>t<=21);
+ if(valid.length) return Math.max(...valid);
+ return Math.min(...totals);
+ }
- dealerValueEl.textContent = dealerHidden ? "?" : handValues(dealer);
- playerValueEl.textContent = handValues(player);
+ function renderHand(el,hand,hideFirst=false){
+ el.innerHTML='';
+ hand.forEach((c,i)=>{
+ const div = document.createElement('div');
+ div.className='card'+(c.suit==='♥'||c.suit==='♦'?' red':'');
+ if(hideFirst && i===0){ div.className='card back'; div.textContent='TERSEMBUNYI'; }
+ else{
+ const top = document.createElement('div'); top.textContent = c.rank + ' ' + c.suit; // top-left
+ const bot = document.createElement('div'); bot.style.alignSelf='flex-end'; bot.textContent = c.rank + ' ' + c.suit; // bottom-right
+ div.appendChild(top); div.appendChild(bot);
+ }
+ el.appendChild(div);
+ });
+ }
- balanceEl.textContent = balance;
- currentBetEl.textContent = currentBet;
+ function updateUI(){
+ renderHand(dealerHandEl,dealer,dealerHidden);
+ renderHand(playerHandEl,player,false);
+ dealerValueEl.textContent = dealerHidden ? '??' : 'Nilai: '+handValues(dealer);
+ playerValueEl.textContent = 'Nilai: '+handValues(player);
+ balanceEl.textContent = balance;
+ currentBetEl.textContent = currentBet;
+ }
- hitBtn.disabled = !inRound;
- standBtn.disabled = !inRound;
- doubleBtn.disabled = !inRound;
+ function startRound(){
+ if(inRound) return;
+ const bet = Number(betInput.value) || 0;
+ if(bet <=0 || bet > balance){ alert(' BANK TIDAK CUKUP! '); return; }
+ currentBet = bet; balance -= bet; inRound=true; dealerHidden=true; messageEl.textContent='';
- if (!inRound) {
- messageEl.textContent = "Pasang taruhan untuk mulai.";
- }
-}
+ makeDeck(); shuffle();
+ dealer = [deck.pop(), deck.pop()];
+ player = [deck.pop(), deck.pop()];
-// Mulai ronde
-function startRound() {
- if (inRound) return;
+ // Check for natural blackjack
+ updateUI();
+ if(handValues(player)===21){
+ dealerHidden=false; updateUI();
+ const dealerVal = handValues(dealer);
+ if(dealerVal===21){ // push
+ balance += currentBet; messageEl.textContent = 'Tie (seri). Taruhan dikembalikan.';
+ } else {
+ // player blackjack 3:2
+ const payout = Math.floor(currentBet * 2.5);
+ balance += payout; messageEl.textContent = 'Blackjack! You Win.';
+ }
+ inRound=false; currentBet=0; updateUI();
+ } else {
+ updateUI();
+ }
+ }
- const bet = Number(betInput.value);
+ function playerHit(){
+ if(!inRound) return; player.push(deck.pop()); updateUI();
+ const val = handValues(player);
+ if(val>21){ // bust
+ dealerHidden=false; messageEl.textContent='Bust! Dealer Win!'; inRound=false; currentBet=0; updateUI();
+ }
+ }
- if (bet <= 0 || bet > balance) {
- messageEl.textContent = "Taruhan tidak valid!";
- return;
- }
+ function playerStand(){
+ if(!inRound) return; dealerHidden=false; // reveal dealer
+ // dealer plays
+ while(handValues(dealer)<17){ dealer.push(deck.pop()); }
+ const pv = handValues(player); const dv = handValues(dealer);
+ if(dv>21 || pv>dv){ // player wins
+ const payout = currentBet*2; balance += payout; messageEl.textContent='You Win!';
+ } else if(pv===dv){ // push
+ balance += currentBet; messageEl.textContent='Tie (seri).';
+ } else { messageEl.textContent='Dealer Win!'; }
+ inRound=false; currentBet=0; updateUI();
+ }
- balance -= bet;
- currentBet = bet;
+ function playerDouble(){
+ if(!inRound) return;
+ if(balance < currentBet){ alert('Bank tidak cukup untuk double.'); return; }
+ // double: take exactly one card then stand
+ balance -= currentBet; currentBet = currentBet*2; player.push(deck.pop()); updateUI();
+ const val = handValues(player);
+ if(val>21){ dealerHidden=false; messageEl.textContent='Bust setelah double. Dealer Win!'; inRound=false; currentBet=0; updateUI(); return; }
+ playerStand();
+ }
- makeDeck();
- shuffle();
+ // Events
+ betBtn.addEventListener('click', startRound);
+ hitBtn.addEventListener('click', playerHit);
+ standBtn.addEventListener('click', playerStand);
+ doubleBtn.addEventListener('click', playerDouble);
+ newRoundBtn.addEventListener('click', ()=>{
+ // reset everything
+ if(inRound){ if(!confirm('Masih dalam ronde. Ingin reset?')) return; }
+ balance = 1000; currentBet=0; inRound=false; dealer=[]; player=[]; deck=[]; dealerHidden=true; messageEl.textContent='Bank di-reset.'; updateUI();
+ });
- dealer = [deck.pop(), deck.pop()];
- player = [deck.pop(), deck.pop()];
+ // keyboard shortcuts
+ window.addEventListener('keydown', e=>{
+ if(e.key==='h') playerHit();
+ if(e.key==='s') playerStand();
+ if(e.key==='d') playerDouble();
+ if(e.key==='Enter') startRound();
+ });
- 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
+ // initial UI
+ updateUI();
\ No newline at end of file