Я собираюсь сделать карточную игру и в данный момент работаю над ее началом. Что меня смущает, так это сортировка карт в руке по их рангу, затем по масти и в значительной степени по тому, как сократить количество повторений. На данный момент я, вероятно, мог бы сделать цикл for для организации карточек, а затем иметь 52 разных if для каждой возможности, но мне было интересно, проще ли это сделать, и много других повторяющихся задач. Спасибо :D Я поставлю код ниже:

from random import shuffle

class deckOfCards:
  def __init__(self):
    self.rank = ['2','3','4','5','6','7','8','9','T','J','Q','K','A']
    self.suit = ['C', 'S', 'H', 'D']
    self.deck = [r+s for r in self.rank for s in self.suit]
    shuffle(self.deck)

  def setValue(self, deck):
    cnt = 1
    self.value = {}
    for i in self.deck:
      self.value[i] = cnt
      cnt += 1

class Deal:
     def __init__(self, deck, position):
         self.hand = deck[position::4]  #divides the deck into 4 hands
         hand = self.hand
     def value(self, key):  # Gives each card that the player has a value
       newHand = {}
       for i in self.hand:
         if i in key:
           newHand[i] = key[i]
       return newHand

deck = deckOfCards()

player1 = Deal(deck.deck, 0)  #######################################
player2 = Deal(deck.deck, 1)  # Example of repetition that I wanted #
player3 = Deal(deck.deck, 2)  # to get rid of if possible           #
player4 = Deal(deck.deck, 3)  #######################################

РЕДАКТИРОВАТЬ: я думаю, что это очень хорошо работает для сортировки карточек, но я все еще не понимаю, как устранить некоторые повторения. Спасибо за всю помощь :D

def sortHand(player):
hand = player.hand
for i in hand:
  for i in hand:
    index = player1.hand.index(i)
    if index != 12:
      if deck.value[i] > deck.value[hand[index+1]]:
        hand.insert(index+1, hand.pop(index))
4
GnarGnar 15 Дек 2011 в 01:15

1 ответ

Я бы, наверное, немного упростил:

from random import shuffle

class Hand(list):
  pass

class Deck(object):

  rank = '23456789TJQKA'
  suit = 'CSHD'

  def deal(self, n):
    deck = [r+s for r in Deck.rank for s in Deck.suit]
    shuffle(deck)
    return [Hand(sorted(deck[i::n], key=Deck.cmpkey)) for i in xrange(n)]

  @staticmethod
  def cmpkey(card):
    return Deck.rank.index(card[0]), Deck.suit.index(card[1])

print Deck().deal(4)

При таком расположении результатом deal() является список из четырех рук. Каждая рука сортируется по рангу, а затем по масти.

(Я не полностью понял логику «значения», поэтому исключил ее из своего примера.)

5
NPE 15 Дек 2011 в 02:10
Значение определяется стоимостью каждой карты, в игре, которую я делаю, 3C стоит меньше, чем 5D. В конце концов, когда я закончу игру, один игрок сыграет карту, а затем следующий игрок должен сыграть карту, которая стоит больше (имеет более высокую ценность), чем эта. Спасибо за ответ, очень полезно :D
 – 
GnarGnar
15 Дек 2011 в 03:18