Форум сайта python.su
568
pit_tonerПо-моему твоя задача - это как раз тот случай, когда ООП прямо таки просится в код.
Ну удаление карт из колоды вроде как здесь не принципиально, главное чтобы одинаковые карты не достались, а также были у каждого разные. Про кортеж оч.интересный вариант.
# -*- coding:utf-8 -*- import random class CardAttrs: SUITS={ "BUBI":0, "CHERVI":1, "TREFI":2, "PIKI":3} VALUES={ "TWO":2, "THREE":3, "FOUR":4, "FIVE":5, "SIX":6, "SEVEN":7, "EIGHT":8, "NINE":9, "TEN":10, "JACK":11, "QUEEN":12, "KING":13, "ACE":14} class Card(object): def __init__(self, suit, value): self.suit=suit self.value=value def __repr__(self): return "%s:%s" %(self.value, self.suit) class Deck(object): def __init__(self): self.__deck=[] for i in CardAttrs.SUITS: for j in CardAttrs.VALUES: self.__deck.append(Card(i,j)) self.mix() def mix(self): random.shuffle(self.__deck) def pop_card(self,count=1): l=[self.__deck.pop() for i in range(count)] return l def __len__(self): return len(self.__deck) class UserDeck(object): def __init__(self, card_pack): self.deck=card_pack def __repr__(self): return str(self.deck) deck=Deck() print len(deck) user1=UserDeck(deck.pop_card(5)) user2=UserDeck(deck.pop_card(5)) print len(deck) print user1 print user2
Отредактировано FishHook (Апрель 16, 2012 06:00:44)
Офлайн
3
{'Dama pik':12} это конечно негодно, ('5 pik', 5) тоже не то..
логичнее конечно сделать класс с атрибутами например suit и rank, в нем же и реализовать методы сравнения - __cmp__ или даже «rich comparison» и прочие полезные (например __str__). Возможно - сравнивать даже на основе вычисления «веса» карты или сравнительных «весов» 2х карт внешней ф-ей для того, чтобы можно было на основе этого класса (или даже factory) реализовывать и другие игрологики… создание колоды на основе 2х списков возможных значений aтрибутов suit и rank - тривиально с помощью например itertools.product. Что о5 же годно для разных игр, требующих разных колод.
upd: FishHook, не заметил поста Вашего и практически продублировал ненамеренно
Отредактировано beelze (Апрель 16, 2012 22:55:02)
Офлайн
173
beelze, согласен с вами и с FishHook, но все-таки начать нужно с понимания стандартных структур данных, а судя по вопросам ТС, это пока как раз то, что нужно. А потом можно и абстрактные фабрики фабрик фабрик проектировать 
Офлайн
3
…полагаю - не суждено поиграть нам в эти карты 
Офлайн
0
Спокойствие карты скоро будут, но я пока не понимаю ООП)
Поэтому сначала хочу делать логику функциями, потом можно будет попробовать решить эту же задачу методами ООП.
Офлайн
3
Я все же бы посоветовал сначала изучить азы ООП (ваистену там ничего сложного) и решать задачу наиболее уместными методами, нежели забивать шурупы молотком 
Офлайн
0
Офлайн
0
Ок, пока я не изучил ООП, предлагаю позабивать несколько шурупов))
#! coding: utf-8 import random cardList = [('5 pik', 5), ('6 pik', 6), ('7 pik', 7), ('8 pik', 8), ('9 pik', 9), ('10 pik', 10), ('Valet_pik', 11), ('Dama_pik', 12), ('King_pik', 13), ('Tuz_pik', 14) ] userCards1 = random.sample(cardList, 5) userCards2 = [card for card in cardList if card not in userCards1] user1 = 'user1' user2 = 'user2' balance = 'balance' d = True while d: # цикл до тех пор пока у одного из юзеров карты не кончатся if len(userCards1) == 0: d = False elif len(userCards2) == 0: d = False else: pass def gameRound(): # Берет по 1 случайной карте у каждого игрока и обределяет какая из них больше sampleCard1 = random.sample(userCards1,1) sampleCard2 = random.sample(userCards2,1) cardValue1 = sampleCard1[0][1] cardValue2 = sampleCard2[0][1] if cardValue1 > cardValue2: roundWon = user1 elif cardValue1 < cardValue2: roundWon = user2 else: roundWon = balance return roundWon, sampleCard1, sampleCard2 roundSummary = gameRound() # запускаем roundWon = roundSummary[0] sampleCard1 = roundSummary[1] sampleCard2 = roundSummary[2] def givemeCard(roundWon, sampleCard1, sampleCard2): # Передает победителю карту проигравшего if roundWon is user1: userCards1.append(sampleCard2) print '1 winner gets %s' % roundSummary[1] elif roundWon is user2: userCards2.append(sampleCard1) print '2 winnner gets %s' % roundSummary[2] else: pass givemeCard(roundWon, roundSummary[1], roundSummary[2]) print '#'*100 print 'U1 now have: %s summary ' % userCards1, len(userCards1) print 'U2 now have: %s summary ' % userCards2, len(userCards2) print '#'*100
Прикреплённый файлы:
crash50.png (51,5 KБ)
Офлайн
3
сдался на 5ой минуте разглядывания сего мегакода 
позабавило отпределение ф-ий в цикле. Также - «Передает победителю карту проигравшего» - передает или все же копирует, на забирая ничего у лузера?
Все же напишите пусть и без ООП, но не так по-зверски все перемешав - мозг активно противится разбираться в коде
Хотя бы четко определите функционал функций и уберите их из цикла для начала
Офлайн
568
pit_tonerДа! О, да! Я щас просто кончу!!!if len(userCards1) == 0: d = False elif len(userCards2) == 0: d = False else: pass
if not userCards1 or not userCards2: d = False
Отредактировано FishHook (Апрель 18, 2012 17:52:54)
Офлайн