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.