کلاس Old Maid Game چیست ؟
کلاس Old Maid Game چیست ؟
حـال مـا مـیتـوانیم ذهنمـان را متوجـه خـود بـازي کنـیم. OldMaidGame زیرکلاسـی از CardGame است با متد جدیدي به نام play که لیسـتی از بازیکنـان را بـهعنـوان پـارامتر دریافـت میکند. از آنجا که __init __از CardGame ارثبري شده، شیء OldMaidGame جدیـد شـامل یک دست کارت جدید برخورده است:
class OldMaidGame(CardGame):
def play(self, names):
# remove Queen of Clubs
self.deck.removeCard(Card(0,12))
# make a hand for each player
self.hands = []for name in names:
f.hands.append(OldMaidHand(name))
# deal the cards
self.deck.deal(self.hands)
print “———- Cards have been dealt”
self.printHands()
# remove initial matches
matches = self.removeAllMatches()
print “———- Matches discarded, play begins”
self.printHands()
# play until all 50 cards are matched
turn = 0
numHands = len(self.hands)
while matches < 25:
matches = matches + self.playOneTurn(turn)
turn = (turn + 1) % numHands
print “———- Game is Over”
self.printHands()
برخی از گامهاي بازي در متدها تفکیک شدهاند. removeAllMatches لیست دسـتهـا را
پیمایش میکند و removeMatches را روي هر کدام احضار مینماید:
class OldMaidGame(CardGame):
…
def removeAllMatches(self):
count = 0
for hand in self.hands:
count = count + hand.removeMatches()
return count
تمرین 16-1 :یک printHands را بنویسید که hands.self را پیمایش میکند و هـر دست را چاپ مینماید. count یک انباشتگر است که تعـداد جفـتهـا در هـر دسـت را جمـع مـیزنـد و مجمـوع را برمیگرداند. هنگامی که تعداد کل جفتها به بیست و پنج رسید، پنجاه کارت از دستهـا حـذف شـده کـه یعنی تنها یک کارت باقی مانده و بازي تمام است. متغیر turn پیگیري نوبت بازیکنان را بر عهده دارد. این متغیر از 0 شروع مـیشـود و هـر بـار یک واحد افزایش مییابد. هنگـامی کـه بـه numHand رسـید، عملگـر بـاقیمانـده آن را دوبـاره بـه 0 برمیگرداند. متد playOneTurn یک پارامتر میگیرد که مشخص میکند نوبت چه کسـی اسـت. مقـدار بازگشتی تعداد جفتهاي تشکیل یافته در طول این دور است:
class OldMaidGame(CardGame):
…
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
اگر دست بازیکنی خالی شد، آن بازیکن از دور بازي خارج است، بنابراین عملی انجام نمیدهـد و 0 را برمیگرداند. در غیر اینصورت یک دور بازي عبارت است از یافتن اولین بـازیکن سـمت چـپ داراي کـارت، گرفتن یک کارت از دست مجاور و بررسی جفتها. قبل از بازگشت، کارتهاي درون دست برخوردهاند، به طوريکه کارت انتخابی بازیکن بعدي اتفاقی است. متد findNeighbor با بازیکن مجاور سمت چپ شروع میکند و در یک مسیر حلقـوي تـا زمانی که بازیکن داراي کارتی را بیابید، ادامه میدهد:
class OldMaidGame(CardGame):
…
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
اگر findNeighbor یک دور کامل چرخید و هیچ کارتی پیدا نکرد None را برمیگرداند و موجب رخداد یک خطا میشود، مگر اینکه درون برنامه باشیم. خوشبختانه میتـوانیم برنامـه را طـوري ارتقاء دهیم که این اتفاق هرگز رخ ندهد (تا زمانی که پایان بازي به درستی شناسایی شود). ما متد printHand را حذف کردهایم. شما میتوانید خودتان آن را بنویسید. خروجی زیر صورتی از یک بازي نـاقص اسـت کـه در آن تنهـا پـانزده کـارت فوقـانی (10هـا و
کارتهاي بالاتر) بین سه بازیکن تقسیم شده است. با این دسته ورق کوچک بازي به جاي اینک پس از بیست و پنج جفت تمام شود بعد از هفت جفت پایان مییابد:
>> import cards
>>> game = cards.OldMaidGame()
>>> game.play([“Allen”,”Jeff”,”Chris”])
———- Cards have been dealt
Hand Allen contains
King of Hearts
Jack of Clubs
Queen of Spades
King of Spades
10 of Diamonds
Hand Jeff contains
Queen of Hearts
Jack of Spades
Jack of Hearts
King of Diamonds
Queen of Diamonds
Hand Chris contains
Jack of Diamonds
King of Clubs
10 of Spades
10 of Hearts
10 of Clubs
Hand Jeff: Queen of Hearts matches Queen of Diamonds
Hand Chris: 10 of Spades matches 10 of Clubs
———- Matches discarded, play begins
Hand Allen contains
King of Hearts
Jack of Clubs
Queen of Spades
King of Spades
10 of Diamonds
Hand Jeff contains
Jack of Spades
Jack of Hearts
King of Diamonds
Hand Chris contains
Jack of Diamonds
King of Clubs
10 of Hearts
Hand Allen picked King of Diamonds
Hand Allen: King of Hearts matches King of Diamonds
Hand Jeff picked 10 of Hearts
Hand Chris picked Jack of Clubs
Hand Allen picked Jack of Hearts
Hand Jeff picked Jack of Diamonds
Hand Chris picked Queen of Spades
Hand Allen picked Jack of Diamonds
Hand Allen: Jack of Hearts matches Jack of Diamonds
Hand Jeff picked King of Clubs
Hand Chris picked King of Spades
Hand Allen picked 10 of Hearts
Hand Allen: 10 of Diamonds matches 10 of Hearts
Hand Jeff picked Queen of Spades
Hand Chris picked Jack of Spades
Hand Chris: Jack of Clubs matches Jack of Spades
Hand Jeff picked King of Spades
Hand Jeff: King of Clubs matches King of Spades
———- Game is Over
Hand Allen is empty
Hand Jeff contains
Queen of Spades
Hand Chris is empty
بنابراین Jeff می دارد.
برای اموزش های ویدیویی زبان پایتون به بستر ویدیو های اموزشی بروید