0

これは豚のサイコロ ゲームで、2 つの戦略を使用し、目標は 63 ポイントを獲得することです。

だから私は関数を手に入れましたplay_games(n_games, strategy_a, strategy_b).(コードの一番下を見てください) この関数はn_gamesをプレイする必要があり、このプレイヤーAはstrategy_aを使用し、プレイヤーBはstrategy_bを使用する必要があります(両方の引数は文字列です)。そして、関数はキー「A」、「B」、「D」を持つ辞書を返す必要があります。値は、A と B が勝った回数と引き分けだった回数を示します。

2日間試しましたが、何も思いつきません。本当にこれを学びたいです。

これは私がこれまでに得たものです:

from random import randint

def one_round(total, strategy):
    round = 0
    while True:
        value = randint(1,6)
        round = round + value
        if Value == 1:
            round = 0
            break
        if round + total >= 63:
            break
        if strategy == 'Sum13':
            if round >= 13:
                break
        if strategy == 'Sum6':
            if round >= 6:
                break

    return round


def one_game(strategy_a, strategy_b):
    total_a = 0
    total_b = 0
    while True:
        round_a = one_round(total_a, strategy_a)
        round_b = one_round(total_b, strategy_b)
        total_a += round_a
        total_b += round_b
        while total_a >= 63 or total_b >=63:
            break
    if total_a >= 63:
        return 'A'
    elif total_b >= 63:
        return 'B'
    elif total_a == total_b:
        return 'D'

def play_games(n_games, strategy_a, strategy_b):
    n_games = 100
    for i in range(n_games):
4

3 に答える 3

1

今すぐ動作するはずです:

#I made one change in your original part.

from random import randint

def one_round(total, strategy):
    round = 0
    while True:
        value = randint(1,6)
        round = round + value
        if value == 1:
            round = 0
            break
        if round + total >= 63:
            break
        if strategy == 'Sum13':
            if round >= 13:
                break
        if strategy == 'Sum6':
            if round >= 6:
                break

    return round


def one_game(strategy_a, strategy_b):
    total_a = 0
    total_b = 0
    while True:
        round_a = one_round(total_a, strategy_a)
        round_b = one_round(total_b, strategy_b)
        total_a += round_a
        total_b += round_b
        if total_a >= 63 or total_b >=63: # while to if here
            break
    if total_a >= 63:
        return 'A'
    elif total_b >= 63:
        return 'B'
    elif total_a == total_b:
        return 'D'

#The additional Part

from collections import defaultdict

def play_games(n_games, strategy_a, strategy_b):
    dicto = defaultdict(int)
    for i in xrange(n_games):
        dicto[one_game(strategy_a, strategy_b)] += 1
    return dicto

結果:

>>> play_games(1000,'sum6','sum13')
defaultdict(<type 'int'>, {'A': 495, 'B': 505})

ゲームの設計上、「D」が発生することはないと思います。

于 2012-04-26T22:44:21.323 に答える
0

これまでの内容に基づいて一般的な手順の概要を説明するために、 play_games の最初の行で、次のような形で dict を定義します。

resultsDict = {A:0, B:0, D:0}

play_games の最後の行はもちろん

return resultsDict

for ループでは、次のようになります。

resultsDict(one_game(stratA, stratB)) += 1 #increase the count for the victor or draw

現在、play_games ets n_games の最初の行ですが、その値を渡す場合、あまり意味がありません。渡さずにローカル値として定義するか、渡された値を使用します。2 番目はおそらくより一般的で優れた戦略ですが、クラスによって異なります。

もちろん、n_games、strategy_a、strategy_b に適切な値を指定して、実際に play_games をどこかで呼び出す必要があります。これが別の場所から呼び出されるライブラリであることが意図されていない限り、その場合は「別の場所」がそれを呼び出す必要があります。両方を行う方法は、このスクリプトが直接実行される場合に play_games への条件付き呼び出しを追加することです。これにより、インポートされた場合に自動的に呼び出しが行われなくなります。これは次のようになります。

if __name__ == "__main__":
     play_games(1000, 'Sum13', 'Sum6')

私が気づいたことの 1 つは、関数にコメントもドキュメント文字列もないことです。原則として、私は読み書きのできるプログラミング スタイルを好み、コメントが多すぎるよりも少なすぎることを好みます。これは宿題なので、それが重要かどうかは採点の仕方次第です。

編集:現在、非常に具体的な Sum13 および Sum6 戦略の代わりに、戦略のホールド値を取得するだけでセットアップを作成できることがわかりました。これにより、用途が広がり、同時にコードが短くなります。

于 2012-04-26T22:28:38.480 に答える
0

簡単な方法:

results = {}
for i in range(n_games):
    winner = one_game(...)
    if not winner in results:
        results[winner] = 0
    results[winner] += 1

エレガントな方法:

collections.Counter(one_game(...) for _ in range(n_games))

もう 1 つのエレガントではない (ただしより用途の広い) 方法:

results = collections.defaultdict(lambda:0)
for i in range(n_games):
    winner = one_game(...)
    results[winner] += 1
于 2012-04-26T22:28:47.447 に答える