14. Python ile blackjack oyunu yap.
Python ile Blackjack Oyunu Geliştirme: Adım Adım Rehber
nnBlackjack, dünyanın en popüler casino oyunlarından biridir. Hem şansa hem de stratejiye dayalı olması, onu hem eğlenceli hem de heyecan verici kılar. Bu makalede, Python programlama dilini kullanarak basit bir Blackjack oyunu geliştireceğiz. Bu rehber, Python'a yeni başlayanlar için bile kolayca takip edilebilir olacak şekilde tasarlanmıştır.
nnGereksinimler
nn- n
- Python 3 (tercihen en son sürümü) n
- Temel Python bilgisi (değişkenler, döngüler, koşullu ifadeler, fonksiyonlar) n
Oyunun Temel Kuralları
nnBlackjack'in temel amacı, eldeki kartların toplam değerinin 21'e en yakın, ancak 21'i geçmeyen bir değere ulaşmaktır. Oyuncular ve krupiye kart çekerler. Krupiyenin amacı da aynıdır: 21'e en yakın olmak. Kartların değerleri aşağıdaki gibidir:
nn- n
- 2-10 arasındaki kartlar, üzerlerindeki sayısal değere sahiptir. n
- Vale, Kız ve Papaz (J, Q, K) kartları 10 değerindedir. n
- As (A) kartı, duruma göre 1 veya 11 değerinde olabilir. n
Oyunun başında, oyuncu ve krupiye ikişer kart alır. Oyuncunun kartlarından biri kapalıdır. Oyuncu, kartlarının toplam değerine bakarak ya yeni kart çeker ('hit') ya da elindeki kartlarla yetinir ('stand'). 21'i aşarsa ('bust'), kaybeder. Krupiye, belirli bir değere (genellikle 17) ulaşana kadar kart çekmeye devam eder. Krupiye de 21'i aşarsa, oyuncu kazanır. Eğer krupiye 17 veya daha yüksek bir değere ulaşırsa, elindeki kartların değeri oyuncunun kartlarından yüksekse kazanır, düşükse kaybeder, eşitse ('push') oyuncu parasını geri alır.
nnAdım 1: Kart Destesi Oluşturma
nnİlk olarak, bir kart destesi oluşturmamız gerekiyor. Python'da bunu bir liste kullanarak yapabiliriz. Her kartı, değerini ve sembolünü içeren bir tuple olarak temsil edeceğiz.
nnnimport randomnnsuits = ('Kupa', 'Karo', 'Maça', 'Sinek')nranks = ('İki', 'Üç', 'Dört', 'Beş', 'Altı', 'Yedi', 'Sekiz', 'Dokuz', 'On', 'Vale', 'Kız', 'Papaz', 'As')nvalues = {'İki':2, 'Üç':3, 'Dört':4, 'Beş':5, 'Altı':6, 'Yedi':7, 'Sekiz':8, 'Dokuz':9, 'On':10, 'Vale':10,n 'Kız':10, 'Papaz':10, 'As':11}nnclass Card:n n def __init__(self,suit,rank):n self.suit = suitn self.rank = rankn self.value = values[rank]n n def __str__(self):n return self.rank + ' ' + 'of' + ' ' + self.suitnnclass Deck:n n def __init__(self):n self.deck = [] # Boş bir deste ile başlan for suit in suits:n for rank in ranks:n self.deck.append(Card(suit,rank))n n def __str__(self):n deck_comp = '' # Boş bir string ile başlan for card in self.deck:n deck_comp += '\n '+card.__str__() # Her bir Card nesnesini stringe eklen return 'The deck has:' + deck_compnn def shuffle(self):n random.shuffle(self.deck)n n def deal(self):n single_card = self.deck.pop()n return single_cardnnclass Hand:n def __init__(self):n self.cards = [] # Kartları tutmak için boş bir liste ile başlan self.value = 0 # Başlangıç değeri sıfırn self.aces = 0 # As sayısını takip etmek için bir özellik eklen n def add_card(self,card):n self.cards.append(card)n self.value += card.valuen if card.rank == 'As':n self.aces += 1 # As bulursak, ace eklen n def adjust_for_ace(self):n while self.value > 21 and self.aces:n self.value -= 10n self.aces -= 1nnclass Chips:n n def __init__(self, total=100):n self.total = total # Bu, oyuncuya sağlanacak varsayılan değeri ayarlayabilirn self.bet = 0n n def win_bet(self):n self.total += self.betn n def lose_bet(self):n self.total -= self.betn
nnAdım 2: Oyun Fonksiyonlarını Tanımlama
nnŞimdi, oyunun temel fonksiyonlarını tanımlayalım:
nn- n
- take_bet(): Oyuncudan bahis alacak. n
- hit(): Oyuncuya kart çektirecek. n
- stand(): Oyuncunun kart çekmeyi bırakmasını sağlayacak. n
- show_some(): Krupiyenin bir kartını gizleyerek, oyuncunun ve krupiyenin kartlarını gösterecek. n
- show_all(): Oyuncunun ve krupiyenin tüm kartlarını gösterecek. n
- player_busts(): Oyuncunun 21'i aşması durumunda ne olacağını belirleyecek. n
- player_wins(): Oyuncunun kazanması durumunda ne olacağını belirleyecek. n
- dealer_busts(): Krupiyenin 21'i aşması durumunda ne olacağını belirleyecek. n
- dealer_wins(): Krupiyenin kazanması durumunda ne olacağını belirleyecek. n
- push(): Beraberlik durumunda ne olacağını belirleyecek. n
ndef take_bet(chips):n n while True:n try:n chips.bet = int(input('Lütfen bahis miktarınızı girin: ')) # Oyuncudan bahis miktarını isten except ValueError:n print('Üzgünüm, bir tamsayı girmelisiniz!')n else:n if chips.bet > chips.total:n print("Üzgünüm, bahsiniz bakiyenizi aşamaz! Bakiyeniz: {}".format(chips.total))n else:n breaknn# Kart çekme fonksiyonundef hit(deck,hand):n n hand.add_card(deck.deal())n hand.adjust_for_ace()nn# Oyuncunun hit veya stand yapmasını sağlayan fonksiyonndef hit_or_stand(deck,hand):n global playing # Bu değişkeni kontrol etmek için global bir değişken kullanacağızn n while True:n x = input("Vurmak mı yoksa durmak mı istersiniz? 'v' veya 'd' girin ")n n if x[0].lower() == 'v':n hit(deck,hand) # hit() fonksiyonunn elif x[0].lower() == 'd':n print("Oyuncu duruyor. Krupiye oynuyor.")n playing = Falsenn else:n print("Üzgünüm, lütfen tekrar deneyin.")n continuen breaknn# Kartları gösterme fonksiyonlarındef show_some(player,dealer):n print("\nKrupiyenin Eli:")n print(" ")n print('',dealer.cards[1]) n print("\nOyuncunun Eli:", *player.cards, sep='\n ')nndef show_all(player,dealer):n print("\nKrupiyenin Eli:", *dealer.cards, sep='\n ')n print("Krupiyenin Eli =",dealer.value)n print("\nOyuncunun Eli:", *player.cards, sep='\n ')n print("Oyuncunun Eli =",player.value)nn# Oyun sonu senaryolarındef player_busts(player,dealer,chips):n print("Oyuncu Patladı!")n chips.lose_bet()nndef player_wins(player,dealer,chips):n print("Oyuncu Kazandı!")n chips.win_bet()nndef dealer_busts(player,dealer,chips):n print("Krupiye Patladı! Oyuncu Kazandı!")n chips.win_bet()n ndef dealer_wins(player,dealer,chips):n print("Krupiye Kazandı!")n chips.lose_bet()n ndef push(player,dealer):n print("Krupiye ve oyuncu berabere! Berabere kaldı.")n
nnAdım 3: Oyun Döngüsünü Oluşturma
nnŞimdi, oyunun ana döngüsünü oluşturalım. Bu döngü, oyuncunun bahis yapmasını, kart çekmesini, krupiyenin oynamasını ve kazananı belirlemesini sağlayacak.
nnn# Oyun oynama!nplaying = Truennwhile True:n # Oyunun başlangıcında bir mesaj yazdırınn print('Blackjack oynamaya hoş geldiniz! Krupiye 17'ye vuracak şekilde ayarlandı. As'lar 1 veya 11 olarak sayılır.')n n # Bir deste oluşturun ve karıştırınn deck = Deck()n deck.shuffle()n n # Oyuncuya ve krupiyeye ikişer kart dağıtınn player_hand = Hand()n player_hand.add_card(deck.deal())n player_hand.add_card(deck.deal())n n dealer_hand = Hand()n dealer_hand.add_card(deck.deal())n dealer_hand.add_card(deck.deal())n n # Oyuncunun fişlerini ayarlayınn player_chips = Chips()n n # Oyuncudan bahis miktarını isteyinn take_bet(player_chips)n n # Kartları gösterin, ancak krupiyenin bir kartını gizli tutunn show_some(player_hand,dealer_hand)n n while playing: # hit_or_stand fonksiyonundan kontrol edilen playing değişkenini hatırlayınn n # Oyuncudan Vurmak veya Durmak isteyinn hit_or_stand(deck,player_hand)n n # Kartları gösterin (ancak krupiyenin bir kartını gizli tutun)n show_some(player_hand,dealer_hand)n n # Oyuncu 21'i aşarsa, oyuncu patlar ve oyunu bitirirn if player_hand.value > 21:n player_busts(player_hand,dealer_hand,player_chips)n breaknn # Oyuncu patlamadıysa, krupiye 17'ye ulaşana kadar oynayınn if player_hand.value <= 21:n n while dealer_hand.value 21:n dealer_busts(player_hand,dealer_hand,player_chips)nn elif dealer_hand.value > player_hand.value:n dealer_wins(player_hand,dealer_hand,player_chips)nn elif dealer_hand.value < player_hand.value:n player_wins(player_hand,dealer_hand,player_chips)nn else:n push(player_hand,dealer_hand)nn # Oyuncuya kazançlarını/kayıplarını bildirinn print("\nOyuncunun toplam fişleri ",player_chips.total)n n # Yeni bir oyun oynamak isteyip istemediğini sorunn new_game = input("Başka bir el oynamak ister misiniz? 'e' veya 'h' girin ")n n if new_game[0].lower()=='e':n playing=Truen continuen else:n print("Oynadığınız için teşekkürler!")n breakn
nnSonuç
nnBu makalede, Python kullanarak basit bir Blackjack oyunu geliştirdik. Bu rehber, Python'a yeni başlayanlar için bile kolayca takip edilebilir olacak şekilde tasarlandı. Bu kodu daha da geliştirebilir, farklı zorluk seviyeleri ekleyebilir veya grafik arayüzü ile daha kullanıcı dostu bir hale getirebilirsiniz. Unutmayın, programlama pratik yaparak öğrenilir!
nnEk Öneriler
nn- n
- Oyunun kurallarını daha karmaşık hale getirebilirsiniz (örneğin, 'split' veya 'double down' seçenekleri ekleyebilirsiniz). n
- Oyuncunun bahis miktarını takip etmek için bir sistem oluşturabilirsiniz. n
- Oyunu daha kullanıcı dostu hale getirmek için bir grafik arayüzü (GUI) kullanabilirsiniz (örneğin, Tkinter veya Pygame ile). n
- Oyuncunun istatistiklerini (kazanma oranı, kaybedilme oranı vb.) takip edebilirsiniz. n