私はPythonでサイコロゲームシミュレーターを書いています。1〜6の整数を含むリストを使用してロールを表します。だから私はこのようなロールを持っているかもしれません:
[1,2,1,4,5,1]
ロールにスコアリングの組み合わせが含まれているかどうかを判断する必要があります。たとえば、3種類、4種類、2セットの3、ストレートなどです。
これを行う簡単なPythonの方法はありますか?私はいくつかのアプローチを試しましたが、それらはすべて厄介であることが判明しました。
私はPythonでサイコロゲームシミュレーターを書いています。1〜6の整数を含むリストを使用してロールを表します。だから私はこのようなロールを持っているかもしれません:
[1,2,1,4,5,1]
ロールにスコアリングの組み合わせが含まれているかどうかを判断する必要があります。たとえば、3種類、4種類、2セットの3、ストレートなどです。
これを行う簡単なPythonの方法はありますか?私はいくつかのアプローチを試しましたが、それらはすべて厄介であることが判明しました。
value: count
さまざまなパターンの存在をテストして、辞書に再編成します。
私は以前にこのようなコードを書きました (ただし、ポーカー用のカードを使用)。ゲームのすべてのルールをエンコードするには、ある程度のコードのスプロール化が避けられません。たとえば、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.
一般に、似たようなルールを特定し、それらの種類のルールに役立つコードを抽象化し、ルールごとに数行だけを記述できる必要があります。一部のルールは完全に一意であり、コードを他のルールと共有できない場合があります。それはちょうどクッキーが崩れる方法です.
これを行うには、次の 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