1

Pythonの学習を始めたばかりで、毎週友達からミニレッスンを受けています。今週は、簡単なスロット マシン ゲームを作ることでした。スロットマシンには 6 つのアイテムがあり、同じアイテムが 3 つ以上出現するとユーザーの勝ちです。私は以下のコードを試しました:

for i in slotScreen:
    if slotScreen.count(i) == 3:
        print('You got 3 of the same! You win!')

コードは、リストの最初の項目がスリーオブア カインドの一部である場合に機能しますが、次のように、3 つの要素のいずれもリストの最初にない場合、コードは機能しません。

slotScreen = ['lemon', 'cherry', 'lemon', 'lemon', 'pirate', 'bar']  # works

slotScreen = ['cherry', 'lemon', 'lemon', 'lemon', 'pirate', 'bar']  # not work

なぜこれが起こるのか分かりますか?

編集:より多くのコード。You win 3x メッセージが表示されるはずのときに、You Lose メッセージが表示されます。

        for i in slotScreen:
            if slotScreen.count(i) == 6:
                print('You win 10x your bet!!!')
                x = x + int(bet) * 10
                break

            elif slotScreen.count(i) == 5:
                print('You win 5x your bet!')
                x = x + int(bet) * 5
                break

            elif slotScreen.count(i) == 4:
                print('You win 4x your bet!')
                x = x + int(bet) * 4
                break

            elif slotScreen.count(i) == 3:
                print('You win 3x your bet!')
                x = x + int(bet) * 3
                break

            elif slotScreen.count(i) <= 2:
                print('Sorry you lose')
                break
4

6 に答える 6

4

プログラムは常にbreak最初のfor反復で行うため、リストの最初の要素のみを評価します。

于 2012-07-21T07:10:52.220 に答える
3

マルコ・デ・ウィットの反応は正しい。私は可能な解決策を提供すると思いました。

from collections import Counter

counter = Counter(['cherry', 'lemon', 'lemon', 'lemon', 'pirate', 'bar'])
symbol, count = counter.most_common(1)[0]

これにより、リスト内で最も一般的なシンボルのシンボル (この場合は「lemon」) とその数 (この場合は 3) が得られます (同点を扱いたい場合は、これを拡張する必要があります)。 .

于 2012-07-21T07:29:04.277 に答える
1

あなたのコードは私のために働きます: http://ideone.com/CKNZb

于 2012-07-21T06:17:41.660 に答える
0

setに変換してから比較してみてください。

def main():
    a = [1, 1]
    b = [1, 2]
    print(contains_multiple(a))  # `True`
    print(contains_multiple(b))  # `False`


def contains_multiple(x):
    """Return `True` if `x` contains multiplicates."""
    return len(x) != len(set(x))


if __name__ == '__main__':
    main()

にハッシュできないアイテムlistが含まれている場合のエラーを回避するには、次を使用します。

from collections.abc import Hashable


def contains_multiple(x):
    """Return `True` if `x` contains multiplicates."""
    return len(x) != len(unique(x))


def unique(iterable):
    """Return `list` of unique items in `iterable`."""
    if all(is_hashable(x) for x in iterable):
        return set(list(iterable))
    unique = list()
    for item in iterable:
        if item in iterable:
            continue
        unique.append(item)
    return unique


def is_hashable(x):
    """Return `True` if `x` is hashable."""
    return isinstance(x, Hashable)
于 2013-07-13T02:11:59.640 に答える
0

他の回答のいくつかは代替の実装を提供していると思いますが、現在のアルゴリズムをどのように修正できるかを確認すると役立つと思います。

    for i in slotScreen:
        if slotScreen.count(i) == 6:
            print('You win 10x your bet!!!')
            x = x + int(bet) * 10
            break

        elif slotScreen.count(i) == 5:
            print('You win 5x your bet!')
            x = x + int(bet) * 5
            break

        elif slotScreen.count(i) == 4:
            print('You win 4x your bet!')
            x = x + int(bet) * 4
            break

        elif slotScreen.count(i) == 3:
            print('You win 3x your bet!')
            x = x + int(bet) * 3
            break

        # no else clause on the if statement, because we can't tell if you've lost yet

    else:  # this else block is attached to the for, and runs if no break was hit
        print('Sorry you lose')

これは、ループelseの後に置くことができるややあいまいな句を使用します。ブロックは、ステートメントによって早期に終了されるforelseではなく、ループが完了するまで実行された場合にのみ実行されます。breakつまり、リスト内のすべての値がチェックされた後にのみ、「失う」コードが発生します。6 つの長いリストの最初の 4 つの値をチェックした場合、最後の 2 つの値にはスリーオブアカインドが見つからないため、実際にはもっと早く停止できることに注意してください。

ループをサイクルごとに 1 回だけ実行し、各/テストslotScreen.count(i)でテストできる変数に保存するなど、他にもいくつかの小さな改善を行うことができます。ifelif

于 2013-07-13T02:49:08.673 に答える
0

dict 内包表記を使用してヒストグラムを作成し、それを確認します。

>>> L = ['cherry', 'lemon', 'lemon', 'bar', 'bar', 'bar']
>>> d = {f: L.count(f) for f in set(L)}
>>> for fruit in d:
        if d[fruit] > 2:
            print("You got {} {}'s! You win!").format(d[fruit], fruit)

You got 3 bar's! You win!

このコードは今では不可解に見えるかもしれませんが、リストと辞書の内包表記を読んで理解できるようになると、はるかに使いやすく、エラーが発生しにくくなります。

これは、作成されて d と名付けられたディクショナリです。値のカウントを持つキーとして各果物があります。

>>> {f: L.count(f) for f in set(L)}
{'cherry': 1, 'lemon': 2, 'bar': 3}

Python の for ループを使用すると、リスト内の項目やその他の iterable と同じくらい簡単に辞書のキーをループできます。その後、各キーを使用してカウント値にアクセスし、テストできます。

于 2013-07-13T02:40:39.427 に答える