Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 16, 2012 05:54:56

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Игра в карты

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)

Офлайн

#2 Апрель 16, 2012 22:52:13

beelze
Зарегистрирован: 2012-04-11
Сообщения: 104
Репутация: +  3  -
Профиль   Отправить e-mail  

Игра в карты

{'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)

Офлайн

#3 Апрель 17, 2012 18:56:57

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

Игра в карты

beelze, согласен с вами и с FishHook, но все-таки начать нужно с понимания стандартных структур данных, а судя по вопросам ТС, это пока как раз то, что нужно. А потом можно и абстрактные фабрики фабрик фабрик проектировать

Офлайн

#4 Апрель 17, 2012 21:26:37

beelze
Зарегистрирован: 2012-04-11
Сообщения: 104
Репутация: +  3  -
Профиль   Отправить e-mail  

Игра в карты

…полагаю - не суждено поиграть нам в эти карты

Офлайн

#5 Апрель 18, 2012 10:26:29

pit_toner
Зарегистрирован: 2012-04-15
Сообщения: 12
Репутация: +  0  -
Профиль   Отправить e-mail  

Игра в карты

Спокойствие карты скоро будут, но я пока не понимаю ООП)
Поэтому сначала хочу делать логику функциями, потом можно будет попробовать решить эту же задачу методами ООП.

Офлайн

#6 Апрель 18, 2012 11:09:12

beelze
Зарегистрирован: 2012-04-11
Сообщения: 104
Репутация: +  3  -
Профиль   Отправить e-mail  

Игра в карты

Я все же бы посоветовал сначала изучить азы ООП (ваистену там ничего сложного) и решать задачу наиболее уместными методами, нежели забивать шурупы молотком

Офлайн

#7 Апрель 18, 2012 15:42:42

pit_toner
Зарегистрирован: 2012-04-15
Сообщения: 12
Репутация: +  0  -
Профиль   Отправить e-mail  

Игра в карты

>>>

Отредактировано pit_toner (Апрель 18, 2012 15:45:12)

Прикреплённый файлы:
attachment crash50.png (51,5 KБ)

Офлайн

#8 Апрель 18, 2012 15:42:57

pit_toner
Зарегистрирован: 2012-04-15
Сообщения: 12
Репутация: +  0  -
Профиль   Отправить e-mail  

Игра в карты

Ок, пока я не изучил ООП, предлагаю позабивать несколько шурупов))

#! 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

Код не вполне рабочий, почему-то крашится
Помогите понять, где закралась ошибка.

Прикреплённый файлы:
attachment crash50.png (51,5 KБ)

Офлайн

#9 Апрель 18, 2012 16:02:50

beelze
Зарегистрирован: 2012-04-11
Сообщения: 104
Репутация: +  3  -
Профиль   Отправить e-mail  

Игра в карты

сдался на 5ой минуте разглядывания сего мегакода
позабавило отпределение ф-ий в цикле. Также - «Передает победителю карту проигравшего» - передает или все же копирует, на забирая ничего у лузера?

Все же напишите пусть и без ООП, но не так по-зверски все перемешав - мозг активно противится разбираться в коде Хотя бы четко определите функционал функций и уберите их из цикла для начала

Офлайн

#10 Апрель 18, 2012 17:52:05

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Игра в карты

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)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version