2016-12-02 4 views
0

私はポーカーハンドをランク​​付けするプログラムを作成しています。ランク付けする前にカードの番号の値で各手を分類して、それを簡単にしたいが、並べ替えをするのに問題がある。個々の文字列ではなく、self.deck内のすべての文字を並べ替えます。Sorted()関数は私が望むようにしていません

from random import * 
class Carddeck: 

    def __init__(self, deck=[], hand=[]): 
     self.deck=deck 
     self.hand=hand 
     numbers=['01','02','03','04','05','06','07','08','09','10','11','12'] 
     suits=['heart','spade','diamond','club'] 
     for each in numbers: 
      for every in suits: 
       deck.append(str(Card(each,every))) 

    def __repr__(self): 

     return str(self.deck) 

    def shuffle(self): 
     shuffle(self.deck) 

     return self.deck 

    def dealcards(self,n): 
     if len(str(self.deck))>n: 
      self.hand=str(self.deck[0:n]) 
      self.deck = self.deck[n:] 
     elif len(self.deck)==n: 
      self.hand=str(self.deck[0:n]) 
      deck=[] 
      self.deck=deck 
      numbers=['01','02','03','04','05','06','07','08','09','10','11','12'] 
      suits=['heart','spade','diamond','club'] 
      for each in numbers: 
       for every in suits: 
        self.deck.append(Card(each,every)) 
     else: 
      x=len(self.deck) 
      self.hand=self.deck 
      self.deck=[] 

      numbers=[1,2,3,4,5,6,7,8,9,10,11,12] 
      suits=['heart','spade','diamond','club'] 
      for each in numbers: 
       for every in suits: 
        self.deck.append(Card(each,every)) 
      y=n-x 
      self.hand+=str(self.deck[0:y]) 
      self.deck=self.deck[y-1-3:] 


class Pokerhand(Carddeck): 
    def newHand(self,hand): 
     self.dealcards(5) 

    def __repr__(self): 
     return str(self.hand) 



    def rank(self): 
     self.hand=sorted(self.hand) 
     return self.hand 


>>> x=Carddeck() 
>>> x.shuffle() 
['01 diamond', '05 heart', '03 club', '05 spade', '09 club', '02 diamond', '03 diamond', '08 diamond', '01 heart', '07 diamond', '11 diamond', '05 club', '02 club', '07 club', '10 club', '01 club', '04 club', '04 heart', '12 club', '11 club', '03 heart', '02 heart', '09 diamond', '08 heart', '06 diamond', '12 spade', '04 diamond', '07 heart', '10 diamond', '12 heart', '09 heart', '08 spade', '07 spade', '03 spade', '02 spade', '08 club', '10 heart', '01 spade', '12 diamond', '11 heart', '06 heart', '06 club', '10 spade', '09 spade', '04 spade', '05 diamond', '06 spade', '11 spade'] 

>>> y=Pokerhand() 
>>> y.newHand(x) 
>>> y 
['01 diamond', '05 heart', '03 club', '05 spade', '09 club'] 
>>> y.rank() 
[' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', "'", "'", "'", "'", "'", "'", "'", "'", "'", "'", ',', ',', ',', ',', '0', '0', '0', '0', '0', '1', '3', '5', '5', '9', '[', ']', 'a', 'a', 'a', 'b', 'b', 'c', 'c', 'd', 'd', 'd', 'e', 'e', 'h', 'i', 'l', 'l', 'm', 'n', 'o', 'p', 'r', 's', 't', 'u', 'u'] 
+0

あなたのカードを 'key'引数と比較する方法や、' Card'に '__cmp __()'を実装する方法を 'sorted()'に伝える必要があります。 –

+0

[ソートHOWTO](https://docs.python.org/3/howto/sorting.html)... ['' '__lt __()' ''メソッド(https:// docs。 python.org/3/reference/datamodel.html#object.__lt__) - '' 'ソートルーチンは、2つのオブジェクトを比較するときに__lt __()を使用することが保証されています。だから、__lt __()メソッドを定義することで、クラスに標準のソート順を追加するのは簡単です: '' '。 – wwii

+0

これは、カードに文字列を使用しない理由の1つです。それらを(2c、2d、2h、2s、3c、3d ... Ks、Ac、Ad、Ah、As)を表す0から51までの整数で表すだけです。そうすれば、自然数を並べ替えて比較することができます。 –

答えて

1

sorted文字列のリストをソートします。文字列をsortedに渡すと、その文字列は1文字の文字列のリストに変換され、次にソートされます。プログラム内のhandは実際には文字列であり、文字列のリストではありません:self.hand=str(self.deck[0:n])です。

if len(str(self.deck))>n: 
    self.hand=str(self.deck[0:n]) 
    self.deck = self.deck[n:] 

だからあなたがリストの 文字列表現に手を設定終わる:

0

は何が起こっているのは、あなたのPokerHandクラス、あなたのdealcards方法では、あなたが持っているということです。その文字列表現を並べ替えると、表示されている結果が得られます。この結果、個々の文字が辞書編集的に並べ替えられます。 hand属性を文字列にするのは意味がありません。

関連する問題