1

このポーカー プログラムを動作させようとしていますが、これが初めての Python プログラムです。コードは正しいように見えますが、発生する 2 つのエラーを理解するのに苦労しています。

Eclipse/PyDev の使用

> Traceback (most recent call last):
  File "C:\Documents and Settings\****\workspace\xfz\src\Unit1.py", line 98, in <module>
    print test()
 File "C:\Documents and Settings\****\workspace\xfz\src\Unit1.py", line 86, in test
    assert card_ranks(sf) == "TC 9C 8C 7C 6C"
AssertionError

コード:

def poker(hands):
    "Return the best hand: poker([hand,...]) => hand"
    return allmax(hands, key=hand_rank)

def allmax(iterable, key=None):
    "Return a list of all items equal to the max of the iterable."
    result, maxval = [], None
    key = key or (lambda x: x)
    for x in iterable:
        xval = key(x)
        if not result or xval > maxval:
            result, maxval = [x], xval
        elif xval == maxval:
            result.append(x)
    return result

def hand_rank(hand):
    ranks = card_ranks(hand)
    if straight(ranks) and flush(hand):
        return (8, max(ranks)) 
    elif kind(4, ranks):
        return (7, kind(4, ranks), kind(1, ranks)) # 99993 (7,9,3)
    elif kind(3, ranks) and kind(2, ranks):
        return (6, kind(3, ranks) and kind(2, ranks))
    elif flush(hand):
        return (5, ranks)
    elif straight(hand):
        return (4, ranks)
    elif kind(3, ranks):
        return (3, kind(3, ranks), ranks)
    elif two_pair(ranks):
        return (2, two_pair(ranks), ranks)
    elif kind(2, ranks):
        return (1, kind(2, ranks), ranks)
    else:
        return (0, ranks) 

def card_ranks(hand):
    "Return a list of the ranks, sorted with higher first."
    ranks = ['--23456789TJQKA'.index(r) for r,s in hand]
    ranks.sort(reverse=True)
    return [5, 4, 3, 2, 1] if (ranks == [14, 5, 4, 3, 2]) else ranks


def straight(ranks):
    "Return true if the ordered ranks form a 5 card straight"
    return (max(ranks)-min(ranks) == 4) and len(set(ranks)) == 5

def flush(hand):
    "Return True if all the cards have the same suit"
    suits = [s for r,s in hand]
    return len(set(suits)) == 1

def kind(n, ranks):
    for r in ranks:
        if ranks.count(r) == n: return r
    return None

def two_pair(ranks):
    pair = kind(2, ranks)
    lowpair = kind(2, list(reversed(ranks)))
    if pair and lowpair != pair:
        return (pair, lowpair)
    else:
        return None

def test():
    "Test cases for the functions in poker program"
    sf = "6C 7C 8C 9C TC".split() # Straight Flush
    fk = "9D 9H 9S 9C 7D".split() # Four of a Kind
    fh = "TD TC TH 7C 7D".split() # Full House
    tp = "5S 5D 9H 9C 6S".split()
    fkranks = card_ranks(fk)
    tpranks = card_ranks(tp)
    assert kind(4, fkranks) == 9
    assert kind(3, fkranks) == None
    assert kind(2, fkranks) == None
    assert kind(1, fkranks) == 7
    assert two_pair(fkranks) == None
    assert two_pair(tpranks) == (9, 5)
    assert card_ranks(sf) == "TC 9C 8C 7C 6C"
    assert card_ranks(fk) == "9D 9H 9S 9C 7D"
    assert card_ranks(fh) == "TD TC TH 7C 7D"
    assert poker([sf, fk, fh]) == sf
    assert poker([fk, fh]) == fk
    assert poker([fh, fh]) == fh
    assert poker([sf]) == sf
    assert poker([sf] + 99*[fh]) == sf
    assert hand_rank(sf) == (8, 10)
    assert hand_rank(fk) == (7, 9, 7)
    assert hand_rank(fh) == (6, 10, 7)

print test()
4

2 に答える 2

1
    assert card_ranks(sf) == "TC 9C 8C 7C 6C"

は False と評価されます。

    card_ranks(sf) = [10, 9, 8, 7, 6]  != "TC 9C 8C 7C 6C" 

    >>> card_ranks(sf) 
    [10, 9, 8, 7, 6]
    >>> card_ranks(fk) 
    [9, 9, 9, 9, 7]
    >>> card_ranks(fh) 
    [10, 10, 10, 7, 7]

実行する関数は test() と呼ばれ、assert でテストして、テストされたステートメントが True であることを確認します。Assert は AssertionError をスローし、それらのいずれかが False の場合、プログラムを終了します。

次の行も False です。

    >>> poker([sf, fk, fh])
    [['6C', '7C', '8C', '9C', 'TC']]
    >>> sf
    ['6C', '7C', '8C', '9C', 'TC']
    >>> poker([sf, fk, fh]) == sf
    False

ヒント: ファイルに対して find/replace を実行し、'assert' を 'print' に置き換えます。

于 2012-05-16T21:27:24.337 に答える
0

変化する:

assert card_ranks(sf) == "TC 9C 8C 7C 6C"
assert card_ranks(fk) == "9D 9H 9S 9C 7D"
assert card_ranks(fh) == "TD TC TH 7C 7D"

に:

assert card_ranks(sf) == [10, 9, 8, 7, 6]
assert card_ranks(fk) == [9, 9, 9, 9, 7]
assert card_ranks(fh) == [10, 10, 10, 7, 7]

したがって、何が問題なのかを確認する簡単な方法は、いくつかの print ステートメントを入れることです。そして基本的に、あなたがしていることを見てください。あなたの card_ranks() 関数はコメントでリストを返すと言っていますが、それでもそれを文字列と比較しています。コードを書く前にもう少し考えてください。デバッグ時の時間を節約します。

于 2012-05-16T21:33:22.177 に答える