İskambil Kağıtları. Bir İskambil kağıdı



Benzer belgeler
PYTHON PROGRAMLAMA DİLİ

Aşağıdaki programı inceleyip ekrana ne yazacağını söyleyebilir misiniz?

2 PYTHON A GIRIŞ 13 PyCharm İle Python Projesi Oluşturma 15 Projenin Çalıştırılması 18 İlk Python Programımız 19 Açıklama Satırları 21

Aynı tipten çok sayıda değişken topluluğudur. X Y Score1 Score2 (0) (1) (2)...

Yukarıdaki kod aksi belirtilmediği sürece sürekli çalışır. Yani ekrana sürekli Bilgisayar çıldırdı! yazısı gelir. Ancak;

Bilgisayar Teknolojileri Bölümü Bilgisayar Programcılığı Programı. Öğr. Gör. Cansu AYVAZ GÜVEN

1 NEDEN PROGRAMLAMA ÖĞRENMELIYIZ?

Görsel Programlama - I Uygulamalı Ödevi

ile Python gibi kod yazma

1 RUBY HAKINDA 1 Ruby nin Gelişim Hikayesi 1 Neden Ruby? 1 Neden Bu Kadar Popüler? 2

Çoktan Seçmeli Değerlendirme Soruları Akış Şemaları İle Algoritma Geliştirme Örnekleri Giriş 39 1.Gündelik Hayattan Algoritma Örnekleri 39 2.Say

2 ALGORİTMA VE AKIŞ DİYAGRAMLARI

ALGORİTMA VE PROGRAMLAMA II

Telefon Rehberi Uygulaması

YAPILAR (STRUCTURES)

Chain of Responsibility Tasarım Şablonu KurumsalJava.com

BİLG Dr. Mustafa T. Babagil 1

BMÜ-101 ALGORİTMA VE PROGRAMLAMAYA GİRİŞ LABORATUARI

ALGORİTMA VE PROGRAMLAMA I

Metotlar. d e f metot_adı [ ( [ arg [= d e f a u l t ] ]... [, arg [, &expr ] ] ) ] deyim ( l e r ) end

Temel Bilgisayar Programlama Final Sınavı Çalışma Notları

Google Search API ile ajax arama

Genel Programlama II

Örnek 4: Örnek Özyinelemeli fonksiyon örneği Bölüm 9. C++ programlama dilinde Nesne ve sınıf

Bolum 9. Konu Başlıkları

C Dersleri Bölüm 3 : Program akışı

Veri Yapıları Laboratuvarı

Internet Programming II. Elbistan Meslek Yüksek Okulu Bahar Yarıyılı

LABORATUVAR ÇALIŞMASI 1 - Python a Giriş

Değişkenler. Geçerli değişken isimleri : baslamazamani, ad_soyad, x5 Geçersiz değişken isimleri : 3x, while

5.HAFTA. Sınıf ve Nesne Kavramı, Metot Oluşturma, Kurucu Metot, this Deyimi

Karabük Üniversitesi, Mühendislik Fakültesi... WEB TEKNOLOJİLERİ

AST415 Astronomide Sayısal Çözümleme - I. 7. Grafik Çizimi

Decorator Tasarım Şablonu

NESNE TABANLI PROGRAMLAMA-1 DERS UYGULAMALARI (22 EYLÜL - 14 KASIM

BMÜ-111 Algoritma ve Programlama. Bölüm 5. Tek Boyutlu Diziler

while(), do-while(), for() M.İLKUÇAR 2010 MAKU-MYO

DÖNGÜLER (LOOPS) while(), do-while(), for(), foreach()

Değişkenler, içerisinde tek bir değer tutabilen yapılardır. Örneğin haftanın günlerini değişkenlerde tutmak istersek, her bir gün adı için bir

DİZİLER-KATARLAR ALGORİTMA VE PROGRAMLAMA II

Uzaktan Eğitim Uygulama ve Araştırma Merkezi

TMMOB Harita ve Kadastro Mühendisleri Odası 12. Türkiye Harita Bilimsel ve Teknik Kurultayı Mayıs 2009, Ankara

Mantıksal Kontrol ve Döngü Komutları

Pythonda değişkenlerin türlerini tanımlamaya gerek yoktur

Python Programlama Dili

Dizi elemanları yukarıdaki gibi tek tek tanımlanabileceği gibi matematiksel ifadelerdeki diziler gibi de tanımlanabilir.

Yazılım Nedir? 2. Yazılımın Tarihçesi 3. Yazılım Grupları 4 Sistem Yazılımları 4 Kullanıcı Yazılımları 5. Yazılımın Önemi 6

ArrayList Uygulamaları

Diziler. Yrd.Doç.Dr.Bülent ÇOBANOĞLU

Uzaktan Eğitim Uygulama ve Araştırma Merkezi

BTP 207 İNTERNET PROGRAMCILIĞI I. Ders 9

Python Programlama Dili

Sınav Dağılım & IMKB Endeks

Öğr. Gör. Serkan AKSU 1

Bu amaçla, if ve switch gibi karar verme deyimleri, for, while, do..while gibi döngü deyimleri kullanılır.

ALGORİTMA VE PROGRAMLAMA I

5. HAFTA KBT204 İNTERNET PROGRAMCILIĞI II. Öğr.Gör. Hakan YILMAZ.

BÖLÜM 4 KONTROL DEYİMLERİ

GENETİK ALGORİTMA GEZGİN SATICI ÖDEVİ

KISIM I: TEMEL KONULAR 1

Genel görüntüsü yandaki gibi olması planalanan oyunun kodu e.py bağlantısından indirilebilir. Basitçe bir text ed

Öğr. Gör. Cansu AYVAZ GÜVEN VERİTABANI-II. Değişken Tanımlama Ve Akış Kontrol Deyimleri

Bil101 Bilgisayar Yazılımı I. M. Erdem ÇORAPÇIOĞLU Bilgisayar Yüksek Mühendisi

ALGORİTMA VE PROGRAMLAMA I DERS NOTU#8

Bölüm 6. Karma. Olcay Taner Yıldız. O. T. Yıldız, C && Java ile Veri Yapılarına Giriş, Boğaziçi Üniversitesi Yayınevi, / 31

Proje 1. Arayüz Tasarımı

Diziler (Arrays) Çok Boyutlu Diziler

Operatörlerin Aşırı Yüklenmesi

Python GELECEK. Barış Metin Linux Sistemleri. Python Programlama Dili

İNÖNÜ ÜNİVERSİTESİ MÜHENDİSLİK FAKÜLTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ 2. SINIF 1. DÖNEM VERİ YAPILARI DERSİ LABORATUAR ÖDEVİ

Döngü (Loop) Deyimleri / Veri Belirleyicileri / Matematiksel Fonksiyonlar

Öğr. Gör. Cansu AYVAZ GÜVEN VERİTABANI-II. Değişken Tanımlama Ve Akış Kontrol Deyimleri

YAZILIM VE PROGRAMLAMA DİLİ. Donanım ve yazılım nedir? Yazılım nedir? Yazılım çeşitleri nelerdir? Programlama dili nedir

KONTROL YAPILARI JAVADA UC TURLU KONTROL YAPISI VARDIR BUNLAR İF ELSE İF ELSE İF SWİTCH YAPILARIDIR. IF ELSE YAPISI if (deger) { }else {

Dr. Fatih AY Tel: fatihay@fatihay.net

FORMÜLLER VE FONKSİYONLAR

4- Turbo Pascal Bilgisayar Programlamada Kullanılan Şart Yapıları

PHP, nesne-yönelimli (object-oriented) bir dil olduğu için, nesne oluşturma imkânına ve bunların kullanılmasını sağlayan metodlara da sahiptir.

Uzaktan Eğitim Uygulama ve Araştırma Merkezi

=~ Metodu 92 Karakter Sınıfları 94 sub ve gsub metotları 101 Hızlı Tekrar 102 Kontrol Noktası 103 Düello 106 Sonraki Bölümde 109

İÇİNDEKİLER BİRİNCİ BÖLÜM BİLGİSAYARDA BELGE AÇMAK VE TEMEL İŞLEMLER YAPMAK

Bir dizinin boyutları sabittir ve kullanılmadan önce belirlenmelidir. Dizi boyutunu belirlemek için başka bir değişkende kullanabilirsiniz.

Hafta 12 Karakter Tutan Diziler

HSancak Nesne Tabanlı Programlama I Ders Notları

Operator Aşırı Yükleme (Operator OverLoading)

1 JAVASCRIPT NEDİR? 1

How to ASP Language. Elbistan Meslek Yüksek Okulu Bahar Yarıyılı. Öğr. Gör. Murat KEÇECĠOĞLU. 29 Eki. 1 Kas. 2013

Burada a değişkeninin türü integer olarak verildi. Peki biz bu ifadeyi tırnak içerisinde yazarsak ne olur?

VERİ YAPILARI LİSTELER. Yrd. Doç. Dr. Murat GÖK Bilgisayar Mühendisliği Bölümü YALOVA ÜNİVERSİTESİ

AOSB 2017 EĞİTİM PROGRAMI

Dizi nin Önemi. Telefon rehberindeki numaralar, haftanın günleri gibi v.b.

Ders 4: Diziler (Arrays( Arrays) barisgokce.com

BİLGİSAYAR BİLİMİ DERSİ (KUR 1) PYTHON PROGRAMLAMA DİLİ ÇALIŞMA KÂĞIDI - 1

C Programlama Dilininin Basit Yapıları

İNTERNET TABANLI PROGRAMLAMA- 3.ders

BASİT C PROGRAMLARI Öğr.Gör.Dr. Mahmut YALÇIN

Java da Soyutlama ( Abstraction ) ve Çok-biçimlilik ( Polymorphism )

ANA SINIF TÜRETİLEN BİRİNCİ SINIF TÜRETİLEN İKİNCİ SINIF

Uygulamalar 4 IsMissing Fonksiyonlar ve Alt Programlar Prosedür Parametreleri Public Function f(x,y,optional t, Optional k) End Function 1.

Transkript:

Nesne Grupları ve Miras (Inheritance) Kavramı E.Fatih YETKİN İskambil Kağıtları Hatırlatma, bir iskambil destesinde 4 tipten olmak üzere 52 adet kağıt vardır: Maça Kupa Karo Sinek Deste Nesnesi: Bir İskambil kağıdı Bir deste iskambil kağıdını göstermek üzere bir Python nesnesi tasarlayalım. Bunu için öncelikle herşeyi sayısal olarak kodlayalım. Maça 3 Papaz 13 Kupa 2 Kız 12 Karo 1 Vale 11 Sinek 0 class Card: def init (self, tip=0, deger=0): self.tip = tip self.deger = deger Örnekler: Kartı yazdırmak Card nesnesini kullanarak örneğin sinek üçlüsü; >>>from card import >>>Card(0,3) olacaktır. Sözkonusu sinek üçlüsünü yarattıktan sonra ekrana yazdırmak istersek bunun için ilk kullanılabilecek yol bir katar listesi kullanmak olacaktır. Bunun için biraz önce yaratmış olduğumuz Card sınıfına yeni bir fonksiyon ekleyelim. 1

Kartı Ekrana Yazdırmak Narf in nedeni class Card: tiplist = [ Maça", Kupa", Karo", "Sinek"] degerlist = ["narf", "As", "2", "3", "4", "5", "6", "7", 8", "9", "10", Vale", Kız", Papaz"] #init metodunu daha önce yazmıştık def str (self): return (self.tiplist[self.tip] + self.degerlist[self.deger]) tiplist te kullanılmış olan ilk eleman narf ın anlamı dizinin 0. elemanını hiçbir zaman kullanmamaktır. str içerisindeki tiplist ve degerlist adında iki adet listeyi sayısal değerleri gerçek değerlere dönüştürmek için kullanmaktayız. Örnekler Yöntemin Sorunları >>> card1 = Card(1, 11) >>> print card1 Karo Vale >>> card2 = Card(1, 3) >>> print card2 Karo Üç >>> print card2.suitlist[1] Karo Herhangi bir kartın adını değiştirmemiz listedeki aynı tipteki diğer 12 kartı da etkileyecektir. Örneğin Karo Valeyi Baklava Vale haline getirmeye kalkışacak olursak, diğer tüm karolar da baklava haline gelir. Örnek >>> card1.tiplist[1] = Baklava >>> print card1 Baklava Vale Kartları Karşılaştırmak Kartları karşılaştırabilmek için diğer tipteki verileri karşılaştırmakta kullanılan <, >, == gibi operatörleri aşırı yüklememiz gerekmektedir. Bu işlem için cmp fonksiyonu nesne tanımı içinde kullanılmalıdır. 2

cmp fonksiyonu Sorun def cmp (self, other): # tipleri kontrol if self.suit > other.suit: return 1 if self.suit < other.suit: return -1 # tipler aynı ise değerlere bak if self.rank > other.rank: return 1 if self.rank < other.rank: return -1 # değerler de aynı ise bir sorun var... return 0 Ancak kart oyunlarının hemen hemen tümünde As en büyük kağıttır. Bunu çözmek üzere cmp fonksiyonunu değiştirelim. Deste oluşturmak Desteyi yazdırmak Tek tek kartları tanımlayacak bir sınıf oluşturmuş durumdayız. Bu sınıftan yararlanarak bir adet kağıt destesi oluşturalım Bunun en kolay yolu içiçe for döngüleri kullanmak olacaktır. Oluşturmuş olduğumuz desteyi yazdırmak için iki farklı fonksiyon oluşturalım. Bunlardan ilki kendi oluşturduğumuz bir fonksiyon olsun ve çağrılırken deste.printdesteşeklinde çağrılsın İkincisi ise Python un print fonksiyonunu aşırı yükleyecek bir fonksiyon olsun Desteyi Karıştırmak Desteyi Karıştırmak İyi karışmış bir destede herhangi bir kart herhangi bir konumda yeralabilir. Bunu sağlamak için random modülünde bulunan randrange() fonksiyonunu kullanacağız. Randrange(a,b) fonksiyonu, a<=x<b aralığında rastgele tamsayı değerler üretir. def shuffle(self): import random ncards = len(self.cards) for i in range(ncards): j = random.randrange(i, ncards) self.cards[i], self.cards[j] = self.cards[j], self.cards[i] 3

Desteyi Karıştırmak Kağıt atmak Aynı fonksiyonu ikili atama yapmadan deneyelim. Bir iskambil oyununda önemli olabilecek bir başka yöntem de seçilen bir kağıdı desteden çıkartmak olabilir. Verilen kart destede ise desteden çıkartıp 1 değerini aksi halde 0 değerini döndürecek bir fonksiyon yazalım. Kağıt Atmak Kağıt Atmak def removecard(self, card): if card in self.cards: self.cards.remove(card) return 1 else: return 0 Fonksiyondaki if kontrolü içinde bulunan in operatörü sağ yanında bulunan eleman normal bir değişkense standart karşılaştırma operatörlerini kullanır. Ancak bir nesne ile çalışılıyorsa nesnenin cmp metoduna göre hareket eder. Desteden Kağıt Çekmek Desteden Kağıt Çekmek Deste içerisindeki kağıtları bir liste içinde tutmakta idik. Bu nedenle liste veritipine ait olan pop() metodu destenin en üstündeki kağıdı çekmek için kullnabiliriz. def popcard(self): return self.cards.pop() def isempty(self): return (len(self.cards) == 0) 4

Miras Kavramı Miras Kavramı Miras varolan bir sınıfı kullanarak yeni bir sınıf elde edilmesi olarak tanımlanabilir. En önemli getirisi, daha önceden yaratmış olduğumuz sınıfların niteliklerini bozmadan saklama imkanı vermesidir. Yeni yaratılan sınıf daha önceki sınıfın özelliklerine sahip olur. Metaforu genişletecek olursak miras bırakan sınıf aile(parent) sınıf iken mirası edinen sınıf çocuk(child) sınıf olmaktadır. Bir El Hazırlayalım Bir El Hazırlayalım Hazırlamış olduğumuz deste (Deck) ve kağıt (Card) nesnelerini kullanarak herhangi bir oyunda kağıtların dağıtılması işlemini nasıl yapabileceğimizi tasarlayalım. Hazırlayacağımız El sınıfı daha önce hazırladığımız Deck sınıfının bir alt sınıfı olacaktır. Bu nedenle yeni sınıfımızın tüm deste özelliklerini içermesini bekleriz. Ayrıca oynanan oyuna özel bazı nitelikler de eklememiz gerekebilir. Alt sınıfı tanımlamak Alt sınıfı tanımlamak Alt Sınıf tanımlarken aile sınıfın adı parantez içerisinde yazılır. Örneğin; class Hand(Deck): pass Bu tanımlama ile oluşan yeni Hand sınıfının Deck sınıfına ait tüm özellikleri miras almasını sağlamış olduk. Hand sınıfı için uygun yeni bir yapılandırıcı hazırlayalım. 5

Yapılandırıcı class Hand(Deck): def init (self, name=""): self.cards = [] self.name = name Ele kağıt ekleme Tüm kağıt oyunlarında oyuncunun elindeki kağıdı atması ve yeni kağıt alması esastır. Deck nesnesinde zaten kağıt atma özelliği vardı dolayısıyla Hand nesnesi bu fonksiyonu Deck ten miras almış durumda ancak kağıt çekme fonksiyonunu eklemek durumundayız. Kağıt çekme fonksiyonu def addcard(self,card) : self.cards.append(card) Kağıtları Dağıtalım Şimdi elimizde bir deste (Deck) ve bir el (Hand) nesneleri oluştu. Oyunu oynayabilmek için Destedeki kağıtları oyunun kuralına göre ellere dağıtmamız gerekmekte Kağıtları Dağıtalım Yazacağımız fonksiyonun birçok farklı oyun için kullanılabilir olması için mümkün olan en genel halde yazmamız gerekmektedir. Fonksiyon iki parametre almalıdır. Birincisi, dağıtılacak olan elleri içeren bir liste ve ikincisi de toplam dağıtılacak kart sayısı class Deck:... def deal(self, hands, ncards=999): nhands = len(hands) for i in range(ncards): if self.isempty(): break# kagitlar bitti mi card = self.popcard() # en ustten kagit cek hand = hands[i % nhands]# siradakini bul hand.addcard(card) # siradaki ele kagit ekle 6

Kağıtları Dağıtalım str mirası Fonksiyonun kullanımı >>> deck = Deck() >>> deck.shuffle() >>> hand = Hand("frank") >>> deck.deal([hand], 5) >>> print hand Hand frank contains 2 of Spades 3 of Spades 4 of Spades Ace of Hearts 9 of Clubs Yazdırma işlemini yaparken Deck nesnesinin str metodunu küçük bir değişiklikle kullanmış olduk. Bu değişiklik; def str (self): s = "Hand " + self.name if self.isempty(): s = s + " is empty\n" else: s = s + " contains\n" return s + Deck. str (self) CardGame sınıfı Papaz Kaçtı Şimdi de tüm kağıt oyunlarında kullanılabilecek genel bir sınıf yaratalım. Bu sınıfta ilk yapılacak şey bir deste kağıt oluşturmak ve kağıtları karıştırmak olacaktır. class CardGame: def init (self): self.deck = Deck() self.deck.shuffle() Oyundaki papazlardan birisi çıkartılır Daha sonra herkese eller dağıtılır Aynı renkte olan kağıtlar atılır Sonuçta tek olduğu için papaz kalıncaya dek oyuncular birbirlerinden kağıt çekerler. papazkacti sınıfı papazkacti sinifi Oynayacağımız oyunda kullanacağımız papazkacti sınıfı, Hand sınıfının bir altsınıfı olacaktır ve Hand sınıfındaki fonksiyonlara ek olarak eslestir fonksiyonuna sahip olacaktır. Bu fonksiyon aynı renkteki birbirine eş olan kağıtları oyuncunun elinden atmasını sağlar. class papazkacti(hand): def removematches(self): count = 0 originalcards = self.cards[:] for card in originalcards: match = Card(3 - card.suit, card.rank) if match in self.cards: self.cards.remove(card) self.cards.remove(match) print "Hand %s: %s matches %s" % (self.name,card,match) count = count + 1 return count 7

Sınıfı Deneyelim Oyuna ait sinifi yaratalim >>> game = CardGame() >>> hand = papazkacti("frank") >>> game.deck.deal([hand], 13) >>> print hand hand.removematches() Hand frank: 7 of Spades matches 7 of Clubs Hand frank: 8 of Spades matches 8 of Clubs Hand frank: 10 of Diamonds matches 10 of Hearts class papazkactigame(cardgame): def play(self, names): # Maça Papazı atalım self.deck.removecard(card(0,12)) # herbir oyuncu icin elleri hazirlayalim self.hands = [] for name in names : self.hands.append(papazkacti(name)) # kartlari dagitalim self.deck.deal(self.hands) print "---------- Kartlar Dagitildi" self.printhands() # baslangictaki eşlmeleri atalim matches = self.removeallmatches() print "---------- Esler atildi oyun baslar..." self.printhands() Oyuna ait sinifi yaratalim İki ek sınıf # 50 kartin tumu eslesene dek devam edilir turn = 0 numhands = len(self.hands) while matches < 25: matches = matches + self.playoneturn(turn) turn = (turn + 1) % numhands print "---------- Oyun bitti" self.printhands() def removeallmatches(self): count = 0 for hand in self.hands: count = count + hand.removematches() return count def playoneturn(self, i): if self.hands[i].isempty(): return 0 neighbor = self.findneighbor(i) pickedcard = self.hands[neighbor].popcard() self.hands[i].addcard(pickedcard) print "Hand", self.hands[i].name, "picked", pickedcard count = self.hands[i].removematches() self.hands[i].shuffle() return count İki ek sınıf def findneighbor(self, i): numhands = len(self.hands) for next in range(1,numhands): neighbor = (i + next) % numhands if not self.hands[neighbor].isempty(): return neighbor Deneme >>> import cards >>> game = cards.oldmaidgame() >>> game.play(["allen","jeff","chris"]) 8