Найти - Пользователи
Полная версия: Игра в карты
Начало » Python для новичков » Игра в карты
1 2 3
FishHook
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
   
beelze
{'Dama pik':12} это конечно негодно, ('5 pik', 5) тоже не то..
логичнее конечно сделать класс с атрибутами например suit и rank, в нем же и реализовать методы сравнения - __cmp__ или даже «rich comparison» и прочие полезные (например __str__). Возможно - сравнивать даже на основе вычисления «веса» карты или сравнительных «весов» 2х карт внешней ф-ей для того, чтобы можно было на основе этого класса (или даже factory) реализовывать и другие игрологики… создание колоды на основе 2х списков возможных значений aтрибутов suit и rank - тривиально с помощью например itertools.product. Что о5 же годно для разных игр, требующих разных колод.
upd: FishHook, не заметил поста Вашего и практически продублировал ненамеренно
reclosedev
beelze, согласен с вами и с FishHook, но все-таки начать нужно с понимания стандартных структур данных, а судя по вопросам ТС, это пока как раз то, что нужно. А потом можно и абстрактные фабрики фабрик фабрик проектировать
beelze
…полагаю - не суждено поиграть нам в эти карты
pit_toner
Спокойствие карты скоро будут, но я пока не понимаю ООП)
Поэтому сначала хочу делать логику функциями, потом можно будет попробовать решить эту же задачу методами ООП.
beelze
Я все же бы посоветовал сначала изучить азы ООП (ваистену там ничего сложного) и решать задачу наиболее уместными методами, нежели забивать шурупы молотком
pit_toner
>>>
pit_toner
Ок, пока я не изучил ООП, предлагаю позабивать несколько шурупов))

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

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

Все же напишите пусть и без ООП, но не так по-зверски все перемешав - мозг активно противится разбираться в коде Хотя бы четко определите функционал функций и уберите их из цикла для начала
FishHook
pit_toner
if len(userCards1) == 0:
        d = False
    elif len(userCards2) == 0:
        d = False
    else:
        pass
Да! О, да! Я щас просто кончу!!!
if not userCards1 or not userCards2:
     d = False
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB