-3

Pythonでブラックジャックゲームを作成しています。関数がループするときに、終了の money 変数を関数の先頭に移動するにはどうすればよいですか?

print "Welcome to BlackJack"

def run():

    import random
    from random import choice
    import sys
    money = 500

変数「money」は、プレイの勝敗に応じて変化します。プレイが再びプレイを選択したときに、終了変数が開始変数になるようにします。

    raw_input("Press <ENTER> To Begin")
    print "You have $",money,"in your bank."
    bet = raw_input("How much would you like to bet?")

    b = int(bet)

    cards = [1,2,3,4,5,6,7,8,9,10,10,10,10]*4

    c1 = choice(cards)
    cards.remove(c1) 

    c2 = choice(cards)
    cards.remove(c2)

    psum = c1 + c2

    print "You were dealt a",c1,"and a",c2,"for a sum of",psum,
    print "\n"
    hs = " "

    while psum < 21 and "s" not in hs:
        hs = raw_input("Hit or Stand (h or s): ").lower()
        if "h" in hs:
            c3 = choice(cards)
            cards.remove(c3)
            psum = psum + c3
            print "You were dealt a",c3,"for a sum of",psum,
            print "\n"
        elif "s" in hs:
            print "Your final sum is",psum,

    print "\n"

    if psum > 21:
        print "Bust!" "\n" "You lose." "\n"
        money = money - b
        print "You now have $",money,"in your bank."
    elif psum == 21:
        print "You got a BlackJack!" "\n" "You win!" "\n"
        money = money + b
        print "You now have $",money,"in your bank."   
    else:
        print "Dealer's turn"

    if psum < 21:   
        c4 = choice(cards)
        cards.remove(c4) 

        c5 = choice(cards)
        cards.remove(c5)

        dsum = c4 + c5

        while dsum < 17:
            c6 = choice(cards)
            cards.remove(c6)
            dsum = dsum + c6

        if dsum > 21:
            print "Dealer's final sum is",dsum,"\n"
            print "Dealer bust! You win!" "\n"
            money = money + b
            print "You now have $",money,"in your bank."
        elif dsum < psum:
            print "Dealer's final sum is",dsum,"\n"
            print "You win!" "\n"
            money = money + b
            print "You now have $",money,"in your bank."
        elif dsum == psum:
            print "Dealer's final sum is",dsum,"\n" 
            print "Draw." "\n"
            print "You have $",money,"in your bank."
        else:
            print "Dealer's sum is",dsum,"\n"
            print "You lose." "\n"
            money = money - b
            print "You now have $",money,"in your bank."


    yn = raw_input("Would you like to play again? (y or n): ")

    if "y" in yn:
        print "\n" * 5
        run()
    else:
        print "\n" "Your total winnings is $",money,
        sys.exit()          

run()      
4

3 に答える 3

2

run()プレーヤーが再度プレイすることを選択するたびに呼び出すのではなく、プレーヤーが「いいえ」を選択すると中断するループにすべてのコードを配置する必要があります。このようにして、money変数はその値を保持し続けます。

編集:そのコードを別のメソッドに移動し、毎回変数をdeal_a_hand()渡すことは(クリーンで保守可能なコードに関しては)間違いなく有利ですが(その場合はメソッドが必要になる場合があります)、呼び出す方がよいでしょう。不必要な再帰を使用するよりも、mainメソッドのループから取得します。一般に、プログラムをより効率的にしたり、記述しやすくしたりしない限り、メソッドがそれ自体を呼び出すことは望ましくありません。その場合でも、再帰がどの程度深くなるかを考慮する必要があります。moneyreturn money

于 2013-01-17T15:31:52.547 に答える
1

runこれが最も簡単なのは、 :に引数を追加することです。

def run(money):

行を削除し、ループのように最初money = 500に呼び出します。runrun(money)run(500)

「別のラウンドをプレイする」ロジックを削除することをお勧めしrunます

def run_single_hand(money):
    # <code to run hand, change value of money>
    return money

def play_hands():
     starting_money = 500
     money = starting_money
     money = run_single_hand(money)
     while True:
         # <code to ask if they would like to play again
         if again:
             run_single_hand(money)
         else:
             print 'thank you, you made a profit of %d' % money - starting_money
             break

これにより、再帰の問題が回避され(最初に提案した方法で実行すると、スタック上でN回の呼び出しが発生runします)、コードを適切に因数分解できます。

たとえば、これを変更してポーカーを交換することができますrun_single_hand。これはこの例では些細なことのように見えますが、より複雑なプロジェクトには適したコードパターンです。

于 2013-01-17T15:32:20.490 に答える
0

次のように関数を定義します。

def run(startingFunds = None):

    <brilliant code>

    money = 500 if startingFunds is None else startingFunds

    <brilliant code>

    if "y" in yn:
        print "\n" * 5
        run(money)

考え直して、iamnotmaynardが提案することを実行し、その周りにwhileループを配置しますが、それでも関数の引数としてstartingFundsを使用します。

(PS:彼はチェックを受けます:))

于 2013-01-17T15:31:15.877 に答える