بازی با کارت
به دوره آموزش پایتون خوش آمدید. برای رفتن به اولین جلسه این دوره، اینجا کلیک کنید. جلسه قبل درمورد تابع سازنده در پایتون صحبت کردیم. همیشه برای یادگیری شی گرایی، بهترین روش انجام یک پروژه عملی بوده است. از این رو میخواهیم ادامه این مبحث را پروژه محور ادامه دهیم. پروژه ای که در نظر گرفته شده بازی با کارت است که از قوانین زیر پیروی میکند:
ﯾﮏ دﺳﺘﻪ ورق ﺷﺎﻣﻞ ﭘﻨﺠﺎه و دو ﮐﺎرت اﺳﺖ. اﯾﻦ ﮐﺎرتﻫﺎ ﺑﻪ ﭼﻬﺎرﮔﺮوه ﺳﯿﺰدهﺗﺎﯾﯽ ﺑﺎ ﭼﻬﺎر ﺧﺎل ﻣﺘﻔﺎوت ﺗﻘﺴﯿﻢ ﺷﺪه اﻧﺪ. در ﺑﺮﺧﯽ از ﺑﺎزیﻫﺎ ارزش ﻫﺮ ﺧﺎل ﻧﺴﺒﺖ ﺑﻪ دﯾﮕﺮ ﺧﺎلﻫﺎ ﻣﺘﻔﺎوت است. ﻣﺜﻼً ﺑـﻪ اﯾﻦ ﺻﻮرت:
Clubs < Diamonds < Hearts < Spades
ﻫﺮ دﺳﺘﮥ ﺳﯿﺰدهﺗﺎﯾﯽ ﺑﻪ اﯾﻦ ﺗﺮﺗﯿﺐ است:
Ace, 2, 3, 4, 5, 6, 7, 8, 9, 10, Jack, Queen, King
ﺑﺴﺘﻪ ﺑﻪ ﻧﻮع ﺑﺎزی ﻣﻤﮑﻦ اﺳﺖ اﻣﺘﯿﺎز Ace از King ﺑﯿﺸﺘﺮ یا از ۲ ﮐﻤﺘﺮ ﺑﺎشد.
پس لازم است ابتدا به کامپیوتر بفهمانیم که کارت چیست چه روابطی بین آن هاست، و بعد از آن میتوانیم بازی هایی را برنامه ریزی کنیم.
همانطور که قبلا گفته شد همیشه از جزیی ترین قسمت یک شی شروع میکنیم. قبل از اینکه هرگونه دسته کارت یا قوانین بازی ای داشته باشیم باید بدانیم که یک کارت چیست.
پس از کلاس کارت شروع میکنیم که دو خصوصیت دارد:
- رتبه کارت
- خال کارت
که به ترتیب آن ها را rank و suit مینامیم.
مشکلی که وجود دارد این است که اگر برای یازدهمین کارت از کلمه “Jack” استفاده کنیم، آنوقت هنگام مقایسه کردن کارت ها به اشکال بر میخوریم. این نکته درمورد خال ها هم اتفاق می افتد. راه حلی که باید از آن استفاده کنیم این است که رتبه ها و خال ها را به رمز گذاری کنیم و به طور قراردادی بگوییم که هر خال یا رتبه معادل یک عدد است:
Clubs ۰
Diamonds ۱
Hearts ۲
Spades ۳
Jack ۱۱
Queen ۱۲
King ۱۳
کلاس Card را مینویسیم، باید توجه کنیم که برای نام گذاری کلاس ها با حروف بزرگ شروع کنیم، این کار خوش خطی برنامه نویس را میرساند.
class Card: def __init__(self, suit=0, rank=0): self.suit = suit self.rank = rank
وقتی قرار نیست از وراثت استفاده کنیم میتوانیم در تعریف کلاس از پرانتز استفاده نکنیم. این کلاس دو ورودی میگیرد که مقدار پیش فرض آن ها صفر است.
حالا از این کلاس یک شی میسازیم:
card = Card(0,3)
این کارت ( ۳ از Clubs ) میباشد، انتظار داریم وقتی این شی را پرینت میکنیم برای ما چاپ شود : Three of Clubs
اما هنگام پرینت، این اتفاق می افتد:
print(card) # <__main__.Card object at 0x038BB9A0>
راه حل این مشکل را در قسمت بعدی مورد بررسی قرار میدهیم.