2

私はPythonでサイコロゲームシミュレーターを書いています。1〜6の整数を含むリストを使用してロールを表します。だから私はこのようなロールを持っているかもしれません:

[1,2,1,4,5,1]

ロールにスコアリングの組み合わせが含まれているかどうかを判断する必要があります。たとえば、3種類、4種類、2セットの3、ストレートなどです。

これを行う簡単なPythonの方法はありますか?私はいくつかのアプローチを試しましたが、それらはすべて厄介であることが判明しました。

4

3 に答える 3

4

value: countさまざまなパターンの存在をテストして、辞書に再編成します。

于 2010-10-07T00:40:49.960 に答える
2

私は以前にこのようなコードを書きました (ただし、ポーカー用のカードを使用)。ゲームのすべてのルールをエンコードするには、ある程度のコードのスプロール化が避けられません。たとえば、n-of-a-kind を探すコードは、ストレートを探すコードとはまったく異なります。

まず、n-of-a-kind について考えてみましょう。他の人が示唆しているように、dict各要素の数を含むを作成します。それで:

counts = sorted(d.values())
if counts[-1] == 4:
   return four_of_a_kind
if counts[-1] and counts[-2] == 3:
   return two_sets_of_three
# etc.

ストレートをチェックするには、別のアプローチが必要です。n-of-a-kind をチェックするときは、カウントを取得して値を無視する必要があります。次に、値を調べてカウントを無視する必要があります。

ranks = set(rolls)
if len(ranks) == 6: # all six values are present
    return long_straight
# etc.

一般に、似たようなルールを特定し、それらの種類のルールに役立つコードを抽象化し、ルールごとに数行だけを記述できる必要があります。一部のルールは完全に一意であり、コードを他のルールと共有できない場合があります。それはちょうどクッキーが崩れる方法です.

于 2010-10-07T02:43:14.903 に答える
1

これを行うには、次の 2 つの方法があります。

def getCounts(L):
    d = {}
    for i in range(1, 7):
        d[i] = L.count(i)
    return d # d is the dictionary which contains the occurrences of all possible dice values
             # and has a 0 if it doesn't occur in th roll

これは Ignacio Vazquez-Abrams と dkamins にインスパイアされたものです

def getCounts(L):
    d = {}
    for i in set(L):
        d[i] = L.count(i)
    return d # d is the dictionary which contains the occurrences of 
             # all and only the values in the roll
于 2010-10-07T02:26:16.197 に答える