• 16-07-2024, 12:09:36
    #1
    Arkadaslar elimde Class yapisinda yazilmis bir BlackJack oyunu var. Bir noktanin nasil calistigini anlayamadim. ChatCPT'den yardim aldim ama hala kavrayamadim. Yardimlarinizi bekliyorum.

    Full KOD:
    Kod guzel gozuksun diye php tagi ile atiyorum.

    import random
    
    
    class Card:
        """Deck'e eklenen kartlari objeye cevirmek icin
        Card Class'ini olusturduk."""
    
        def __init__(self, suit, rank):
            self.suit = suit
            self.rank = rank
    
        def __str__(self):
            return f"{self.rank['rank']} of {self.suit}"
    
    
    class Deck:
        def __init__(self):
            self.cards = []
            suits = ["spades", "clubs", "hearts", "diamonds"]
            ranks = [
                {"rank": "A", "value": 11},
                {"rank": "2", "value": 2},
                {"rank": "3", "value": 3},
                {"rank": "4", "value": 4},
                {"rank": "5", "value": 5},
                {"rank": "6", "value": 6},
                {"rank": "7", "value": 7},
                {"rank": "8", "value": 8},
                {"rank": "9", "value": 9},
                {"rank": "10", "value": 10},
                {"rank": "J", "value": 10},
                {"rank": "Q", "value": 10},
                {"rank": "K", "value": 10},
            ]
            for suit in suits:
                for rank in ranks:
                    self.cards.append(Card(suit, rank))
    
        def shuffle(self):
            if len(self.cards) > 1:
                random.shuffle(self.cards)
    
        def deal(self, number):
            cards_dealt = []
            for x in range(number):
                if len(self.cards) > 0:  # Kart varsa cekecek!
                    card = self.cards.pop()
                    cards_dealt.append(card)
            return cards_dealt
    
    
    class Hand:
        def __init__(self, dealer=False):
            self.cards = []
            self.value = 0
            self.dealer = dealer
            # Dealer = False -> Player/Oyuncu eli.
            # Dealer = True  -> PC/Bilgisayar eli.
    
        def add_card(self, card_list):
            # Ele kart ekleme. Disardan arguman aliyor.
            # Deck Class'indaki Deal ile eklenecek.
            self.cards.extend(card_list)
    
        def calculate_value(self):
            self.value = 0
            has_ace = False  # Ace YOK!
    
            for card in self.cards:
                card_value = int(card.rank["value"])
                self.value += card_value
                if card.rank["rank"] == "A":
                    has_ace = True  # Elde A varsa Ace VAR!
    
            if has_ace and self.value > 21:
                # Hem Ace varsa hem el 21'den buyukse Ace 1 say!
                self.value -= 10
    
        def get_value(self):
            # Hesaplamayi yaptirip, Value'yi Return ettik.
            self.calculate_value()
            return self.value
    
        def is_blackjack(self):
            return self.get_value() == 21
    
        def display(self, show_all_dealer_cards=False):
            print(f"""{"Dealer's" if self.dealer else "Your"} hand:""")
            # Dealer = False -> Player/Oyuncu eli.
            # Dealer = True  -> PC/Bilgisayar eli.
            for index, card in enumerate(self.cards):
                if (
                    index == 0  # Ilk kart ise ve
                    and self.dealer  # PC/Bilgisayar eli,
                    and not show_all_dealer_cards
                    and not self.is_blackjack()
                ):
                    print("hidden")  # Dealer ilk karti gizleme!
                else:
                    print(card)  # Player veya PC kartlari goster!
    
            if not self.dealer:
                # Player/Oyuncu eli ise kart degerleri toplamini goster!
                print("Value:", self.get_value())
    
    
    class Game:
        def play(self):
            game_number = 0
            games_to_play = 0
    
            while games_to_play <= 0:
                try:
                    games_to_play = int(input("How many games do you want to play? "))
                except:
                    print("You must enter a number.")
    
            while game_number < games_to_play:
                game_number += 1
    
                deck = Deck()
                deck.shuffle()
    
                player_hand = Hand()
                dealer_hand = Hand(dealer=True)
    
                for i in range(2):
                    player_hand.add_card(deck.deal(1))
                    dealer_hand.add_card(deck.deal(1))
    
                print()
                print("*" * 30)
                print(f"Game {game_number} of {games_to_play}")
                print("*" * 30)
                player_hand.display()
                dealer_hand.display()
    
                if self.check_winner(player_hand, dealer_hand):
                    continue
    
                choice = ""
                while player_hand.get_value() < 21 and choice not in ["s", "stand"]:
                    choice = input("Please choose 'Hit' or 'Stand': ").lower()
                    print()
                    while choice not in ["h", "s", "hit", "stand"]:
                        choice = input("Please enter 'Hit' or 'Stand' (or H/S) ").lower()
                        print()
                    if choice in ["hit", "h"]:
                        player_hand.add_card(deck.deal(1))
                        player_hand.display()
    
                if self.check_winner(player_hand, dealer_hand):
                    continue
    
                player_hand_value = player_hand.get_value()
                dealer_hand_value = dealer_hand.get_value()
    
                while dealer_hand_value < 17:
                    dealer_hand.add_card(deck.deal(1))
                    dealer_hand_value = dealer_hand.get_value()
    
                dealer_hand.display(show_all_dealer_cards=True)
    
                if self.check_winner(player_hand, dealer_hand):
                    continue
    
                print("Final Results")
                print("Your hand:", player_hand_value)
                print("Dealer's hand:", dealer_hand_value)
    
                self.check_winner(player_hand, dealer_hand, True)
    
            print("\nThanks for playing!")
    
        def check_winner(self, player_hand, dealer_hand, game_over=False):
            if not game_over:
                if player_hand.get_value() > 21:
                    print("You busted. Dealer wins! 😭")
                    return True
                elif dealer_hand.get_value() > 21:
                    print("Dealer busted. You win! 😀")
                    return True
                elif dealer_hand.is_blackjack() and player_hand.is_blackjack():
                    print("Both players have blackjack! Tie! 😑")
                    return True
                elif player_hand.is_blackjack():
                    print("You have blackjack. You win! 😀")
                    return True
                elif dealer_hand.is_blackjack():
                    print("Dealer has blackjack. Dealer wins! 😭")
                    return True
            else:
                if player_hand.get_value() > dealer_hand.get_value():
                    print("You win! 😀")
                elif player_hand.get_value() == dealer_hand.get_value():
                    print("Tie! 😑")
                else:
                    print("Dealer wins. 😭")
                return True
            return False
    
    
    g = Game()
    g.play()
    Tam kavrayamadigim Kod blogu

       def display(self, show_all_dealer_cards=False):
            print(f"""{"Dealer's" if self.dealer else "Your"} hand:""")
            # Dealer = False -> Player/Oyuncu eli.
            # Dealer = True  -> PC/Bilgisayar eli.
            for index, card in enumerate(self.cards):
                if (
                    index == 0  # Ilk kart ise ve
                    and self.dealer  # PC/Bilgisayar eli,
                    and not show_all_dealer_cards
                    and not self.is_blackjack()
                ):
                    print("hidden")  # Dealer ilk karti gizleme!
                else:
                    print(card)  # Player veya PC kartlari goster!
    
            if not self.dealer:
                # Player/Oyuncu eli ise kart degerleri toplamini goster!
                print("Value:", self.get_value())

    Simdi bu oyunda karti ilk ceken dealer yani bilgisayarsa ilk kagidi sakla seklinde kod yazilmis.
    Parametre verilmediginde show_all_dealer_cards=False'dir.

    Anlamadigim konu,
    ilk kagitsa > index == 0
    el dealer yani dagitici pcde ise > self.dealer
    Blackjack gerceklesmemisse > self.is_blackjack()
    Peki ama anlamadigim satir bu : not show_all_dealer_cards Bu kod show_all_dealer_cards=False anlamina mi gelir True anlamina mi gelir?


    Peki neden soruyorum?

    Basit bir fonksiyon dusunelim

    def test(x):
        ### aslinda x=5 deme! ###
        print(x+10)
    
    test(5)
    Normalde parametreye bir deger gonderdimizde aslinda fonk icinde bu x = 5 demek.


    PEKI

       def display(self, show_all_dealer_cards=False):
            print(f"""{"Dealer's" if self.dealer else "Your"} hand:""")
            # Dealer = False -> Player/Oyuncu eli.
            # Dealer = True  -> PC/Bilgisayar eli.
            for index, card in enumerate(self.cards):
                if (
                    index == 0  # Ilk kart ise ve
                    and self.dealer  # PC/Bilgisayar eli,
                    and not show_all_dealer_cards
                    and not self.is_blackjack()
                ):
                    print("hidden")  # Dealer ilk karti gizleme!
                else:
                    print(card)  # Player veya PC kartlari goster!
    
            if not self.dealer:
                # Player/Oyuncu eli ise kart degerleri toplamini goster!
                print("Value:", self.get_value())
    Bu kod blogunda show_all_dealer_cards=False ise, block icindede show_all_dealer_cards=False demek degilmidir? Peki boyleyse not show_all_dealer_cards TRUE dondurmesi gerekmez mi? True ise sacma olmuyor mu? yani ilk kart aciksa dagitici dealer ise ve tum kartlar aciksa anlamina gelir cunku. Kafa karisikligimi giderirseniz sevinirim.

    Tesekkur ettim.
  • 17-07-2024, 10:47:44
    #2
    Konu basitmis arkadaslar. not show_all_dealer_cards True donduruyor ve if blogunda bu kisim True olmadan zaten kartlar gizlenmiyor. Burada amac aslinda not show_all_dealer_cards'nin True dondurmesiyle aslinda kartin acilmasini saglamak. Acilan kartida print(card) degilde print("hidden") seklinde gizlemeye calisiyoruz. Bu ornek gercekten muhtesem biraz kapsamli bir ornek. Freecodecamp'ten almistim.