-2

ブラックジャック スクリプトを作成しているときに、'if'、'elif'、'else' ステートメントの使用方法について混乱をきたしました。ここでこの件に関するほとんどの投稿を見て、グーグルで検索しましたが、まだ混乱しています。. .'if' ステートメントを繰り返す代わりに 'elif' を使用すると、'elif' ステートメント (またはその 1 つ) が True と評価されたときにコードが短絡することを学びました。これは実際に私をもっと混乱させました(ただし、「elif」と短絡を使用したときに何が起こるかの概念は理解しています)。最初の 5 つの「if」ステートメントはこれを示しています。「if」の代わりに「elif」を使用していた場合、プレーヤーとディーラーの両方が 21 をヒットした場合、コードは最後の条件に到達しない可能性があります。.しかし、この後、「elif」ステートメントを使用するか、そのままにしておくことができたようです。. 。そう、私の質問は、main() の残りの部分でそれらを正しく使用したかということです。そうでない場合、どのようにしますか?どうもありがとうございました。

# current working version - - - 02/26/2013
# Notes: Nees to fix Ace problem. Ace can be 11 or 1.

import random
import os

def main():
    print "Welcome To Python Blackjack. [H] Is For A Hit, [S] Is To Stand, [Q] To       Quit.\n"
    c = ""    # Hit, Stand or Quit Variable.
    player = deal_cards()    # deal player
    dealer = deal_cards()    # deal dealer
    print "< ---- Player Hand ---->"
    print "Player Hand: ", player    
    print "Total Player Hand: ", total_hand(player)    
    print
    print "< ---- Dealer Hand ---->"
    print "Dealer Hand: ", dealer                      
    print "Total Dealer Hand: ", total_hand(dealer)
    print

    if (total_hand(player) == 21):
        print "BLACKJACK! YOU WIN!"
        message()
    if (total_hand(player) > 21):
        print "BUSTED! You Lose"
        message()
    if (total_hand(dealer) == 21):
        print "BLACKJACK! Sorry You Lose! Dealer Wins"               # must use if   statements because elif would fail to reach the tie line.
        message()
    if (total_hand(dealer) > 21):
        print "Dealer Busted! You Win!"
        message()
    if (total_hand(player) == 21) and (total_hand(dealer) == 21):    # must use if       statements because elif would fail to reach this line.
        print "Player And Dealer Tie! Game Goes To Dealer"
        message()

    while (c != "q"):   
        c = raw_input("[H]it [S]tand [Q]uit: ").lower()    
        if (c == "h"):
            hit(player)         
            print ""
            print "Your Cards Are Now: ",player                 
            print "Total For Player Is: ",total_hand(player)
            if (total_hand(player) == 21):
            print "BLACKJACK! You Win!"
            message()
            if (total_hand(player) > 21):
                print "BUSTED! Sorry, You Lose."
                message()
            if (total_hand(dealer) == 21):
                print "BLACKJACK! Sorry You Lose! Dealer Wins."
                message()
            if (total_hand(dealer) > 21):
                print "Dealer Busted! You Win!\n"
                message()
            if (total_hand(dealer) <= 17): 
                hit(dealer)
                print "\nThe Dealer Takes A Card", dealer
                print "For A Total Of: ", total_hand(dealer)
                if (total_hand(dealer) == 21):
                    print "BLACKJACK! Sorry You Lose! Dealer Wins.\n"
                    message()
                if (total_hand(dealer) > 21):
                    print "Dealer Busted! You Win!\n"
                    message()               
            elif (c == "s"):
            if (total_hand(dealer) <= 17):
                hit(dealer)
                print "The Dealer Takes A Card", dealer
                print "For A Total Of: ", total_hand(dealer)
                if (total_hand(dealer) == 21):
                    print "BLACKJACK! Dealer Wins.\n"
                    message()
                if (total_hand(dealer) > 21):
                    print "Dealer Busted! You Win!\n"
                    message()
                if (total_hand(dealer) >= total_hand(player)):
                    print "Sorry, You Lose. Dealer Wins With A Tie\n"
                    message()
                if (total_hand(player) > total_hand(dealer)):
                    print "You Win With The Best Hand!\n"
                    message()
             if (total_hand(player) > total_hand(dealer)):
                print "You Win With The Best Hand!\n"
                message()
            if (total_hand(dealer) > total_hand(player)):
                print "Sorry, You Lose. Dealer Wins\n"
                message()
        else:
            if (c == "q"):
                message()
            else:
                print "Invalid Choice. . .To Quit, Press [Q]"




def deal_cards():
    random1 = random.randint(1,11)
    random2 = random.randint(1,11)
    hand = [random1, random2]
    return hand


def hit(hand):
    newCard = random.randint(1,11)
    hand.append(newCard)
    return hand


def total_hand(hand):
    total = sum(hand)
    return total


def message():
    again = raw_input("Do You Want To Play Again? [Y] For Yes - Press Any Key To Quit:   ").lower()
    if "y" in again:
        main()
    else:
        print "Thanks For Playing"
        os._exit(1)


# main

if __name__ == '__main__':
    main()
4

6 に答える 6

2

あまり具体的でない条件の前に、より具体的な条件を置いてみてください。

たとえば、次の順序を変更した場合

if (total_hand(player) == 21):
    print "BLACKJACK! YOU WIN!"
    message()
if (total_hand(player) > 21):
    print "BUSTED! You Lose"
    message()
if (total_hand(dealer) == 21):
    print "BLACKJACK! Sorry You Lose! Dealer Wins"                
    message()
if (total_hand(dealer) > 21):
    print "Dealer Busted! You Win!"
    message()
if (total_hand(player) == 21) and (total_hand(dealer) == 21):         
    print "Player And Dealer Tie! Game Goes To Dealer"
    message()

これに

if (total_hand(player) == 21) and (total_hand(dealer) == 21):         
    print "Player And Dealer Tie! Game Goes To Dealer"
    message()
elif (total_hand(player) == 21):
    print "BLACKJACK! YOU WIN!"
    message()
elif (total_hand(dealer) == 21):
    print "BLACKJACK! Sorry You Lose! Dealer Wins"                
    message()
elif (total_hand(player) > 21):
    print "BUSTED! You Lose"
    message()
elif (total_hand(dealer) > 21):
    print "Dealer Busted! You Win!"
    message()

以前は、最後のステートメントを満たすために必要な条件が最初または 3 番目のステートメントに当てはまるため、elif を使用したステートメントのすべての条件に到達できませんでした。

于 2013-02-27T06:55:47.943 に答える
1

コードの主な問題は、最初に同点をチェックする必要があることです。そうでない場合は、宣言プレーヤーが勝者です。

ifコードでは、を使用するか、を使用するかにかかわらず、実際には違いはありませんelif。これは、message()関数が実際に戻ることはないためです。プログラムを終了するか、main()再帰的に呼び出します。これは良い設計ではありません。コードを読んでいる他message()の人は、これらのいずれかを実行するという名前の関数を期待していません。

私の提案は、ゲームが終了したかどうかをチェックし、結果を説明する文字列を返す関数を作成することです。これが私がそれをする方法です。ただし、ステートメントはとにかく関数を終了するため、ここでも、のif代わりに使用することもできます。elifreturn

def check_game_over(total_player, total_dealer):
    if total_dealer == 21:
        if total_player == 21:
            return "Player And Dealer Tie! Game Goes To Dealer"
        else:
            return "BLACKJACK! Sorry You Lose! Dealer Wins"              
    elif total_player == 21:
        return "BLACKJACK! YOU WIN!"
    elif total_player > 21:
        return "BUSTED! You Lose"
    elif total_dealer > 21:
        return "Dealer Busted! You Win!"
    else:
        return None
于 2013-02-27T06:42:58.837 に答える
1

この場合、使用elifは完全に安全です。

いくつかの条項のうちの1つだけを実行したいですか?常に使用してelifください。必ずしも関連するわけではない複数の条項が発生する可能性はありますか?を使用しifます。

違いに注意する必要がある理由の例を次に示します。

x = 0
if x < 1:
    do_something()
elif x < 2:
    do_something_else_instead()

この種のネストは、xが異なる範囲内にあるかどうかを確認するために行われることがあります。ただし、ここで使用しない場合elif

x = 0
if x < 1:
    do_something()
if x < 2:
    do_something_else_instead()

これで、これらの句が1つだけではなく、両方とも実行されます。これxは、が1より小さい場合、2つよりも小さいためです。これは、次のように適切にチェックすることで回避できる場合があります。

x = 0
if x < 1:
    do_something()
if x >= 1 and x < 2:
    do_something_else_instead()

ただし、do_something()がxも変更する場合は、xを増やして、1 <= x <2の範囲にプッシュする可能性があるため、2番目の句も実行されます。この問題を防ぐには、を使用しますelif。これは、句の1つだけが実行され、最初の句がに評価されることを保証しTrueます。

于 2013-02-27T06:44:53.307 に答える
1

一連のテストif/elif/elif/.../elif/elseは単なる一連のテストであり、1 つが成功するまで (またはすべてが失敗して が実行されるまで) 次々elseと実行されます。対照的に、一連のifs は一連の独立したテストであり、それぞれが他のテストに相談することなく実行されます。

テストの順序は重要です。以前のテストは、後のテストの前に実行されます。したがって、

def rangetest(n):
    if n >= 40:
        print "Big!"
    elif n >= 25:
        print "Medium!"
    elif n >= 10:
        print "Small!"
    else:
        print "Tiny!"

次に、残りの条件がすべて一致しても、rangetest(100)常に のみを出力します。Big!(ifの代わりにここだけを使用するとelif、 が得られBig!、すべてが出力されます)。Medium!Small!


他の回答は、プログラムでの使用について語っていif/elifます。ちょっとしたことを指摘したいだけです。

あなたのプログラムのロジックを逆にします。mainを呼び出す関数を呼び出すmessage代わりに、次のようなメイン ループmainを記述します。

def main():
    play_game()
    while 1:
        again = raw_input("Do You Want To Play Again? [Y] For Yes - Press Any Key To Quit:   ")
        if 'y' in again.lower():
            play_game()
        else:
            print "Thanks for playing!"
            return # exit main loop

次にplay_game、ゲームのメイン ロジックが含まれます。return代わりにmessage(). returnをぎこちなく「ループ」mainするのではなく、 ( を使用して) 現在のラウンドを終了するだけなので、これにより制御フローが簡素化されますmessage

于 2013-02-27T07:14:43.273 に答える
1

から呼び出す代わりに のwhile内部でループを使用するように修正すると、プログラムがより短く、より明確になることをお勧めします。mainmainmessage

構造化プログラミングは、次に何が起こるかを制御する他の方法よりも優先して、ifelifプラス ループなどの条件付き構造を使用するという、かつては議論の余地がなかったアイデアです。whileからの呼び出しmessage、代わりに、mainおよびos.exitは、構造化プログラミングとは異なる戦略を取っています。mainを介して繰り返しコールするように手配することmessageで、自分を追い詰めます。実際os.exit、そのコーナーから抜け出すための数少ない方法の 1 つです。もう 1 つは、例外をスローして、外部でキャッチすることですmain

代わりに、次のようにスケッチしてみてください。

def main():
    play()

def play():
    again = True
    while again:
        player = deal_cards()
        dealer = deal_cards()
        print ...
        ...
        game_over = False
        while not game_over
            if (total_hand(player) == 21) and (total_hand(dealer) == 21):
                print "Player And Dealer Tie! Game Goes To Dealer"
                game_over = True
                # You don't need to do anything else here.
            elif total_hand(player) == 21:
                print ...
                game_over = True
            elif total_hand(dealer) == 21:
                print ...
                game_over = True
            elif ...
                print ...
            elif ...
                ...
            else ...
                print ...

            if not game_over:
                c = raw_input("[H]it [S]tand [Q]uit: ").lower()
                if c == "q":
                    game_over = True
                elif c == "h":
                    hit(player)
                    # You don't need to do anything else here.
                else:
                    ...

        answer = raw_input("Do You Want To Play Again? [Y] For Yes - Press Any Key To Quit:   ").lower()
        again = ("y" in answer)

(専門家へのこのメモは無視してください。スタック オーバーフローにはたくさんあります。再帰、適切な末尾呼び出し、およびトランポリンを含む構造化プログラミングの楽しい代替手段について知っています。この特定の質問については、それらが次のステップではないことをお勧めします。 )

于 2013-02-27T06:45:58.707 に答える
0

いいえ、いくつかの小さなインデント ミスがあり、最後に elif ステートメントを使用できたはずです。コードは次のようになります。

def main():
    print "Welcome To Python Blackjack. [H] Is For A Hit, [S] Is To Stand, [Q] To       Quit.\n"
    c = ""    # Hit, Stand or Quit Variable.
    player = deal_cards()    # deal player
    dealer = deal_cards()    # deal dealer
    print "< ---- Player Hand ---->"
    print "Player Hand: ", player    
    print "Total Player Hand: ", total_hand(player)    
    print
    print "< ---- Dealer Hand ---->"
    print "Dealer Hand: ", dealer                      
    print "Total Dealer Hand: ", total_hand(dealer)
    print

    if (total_hand(player) == 21):
        print "BLACKJACK! YOU WIN!"
        message()
    if (total_hand(player) > 21):
        print "BUSTED! You Lose"
        message()
    if (total_hand(dealer) == 21):
        print "BLACKJACK! Sorry You Lose! Dealer Wins"               # must use if   statements because elif would fail to reach the tie line.
        message()
    if (total_hand(dealer) > 21):
        print "Dealer Busted! You Win!"
        message()
    if (total_hand(player) == 21) and (total_hand(dealer) == 21):    # must use if       statements because elif would fail to reach this line.
        print "Player And Dealer Tie! Game Goes To Dealer"
        message()

    while (c != "q"):   
        c = raw_input("[H]it [S]tand [Q]uit: ").lower()    
        if (c == "h"):
            hit(player)         
            print ""
            print "Your Cards Are Now: ",player                 
            print "Total For Player Is: ",total_hand(player)
            if (total_hand(player) == 21):
            print "BLACKJACK! You Win!"
            message()
            if (total_hand(player) > 21):
                print "BUSTED! Sorry, You Lose."
                message()
            if (total_hand(dealer) == 21):
                print "BLACKJACK! Sorry You Lose! Dealer Wins."
                message()
            if (total_hand(dealer) > 21):
                print "Dealer Busted! You Win!\n"
                message()
            if (total_hand(dealer) <= 17): 
                hit(dealer)
                print "\nThe Dealer Takes A Card", dealer
                print "For A Total Of: ", total_hand(dealer)
                if (total_hand(dealer) == 21):
                    print "BLACKJACK! Sorry You Lose! Dealer Wins.\n"
                    message()
                if (total_hand(dealer) > 21):
                    print "Dealer Busted! You Win!\n"
                    message()               
        elif (c == "s"):
            if (total_hand(dealer) <= 17):
                hit(dealer)
                print "The Dealer Takes A Card", dealer
                print "For A Total Of: ", total_hand(dealer)
                if (total_hand(dealer) == 21):
                    print "BLACKJACK! Dealer Wins.\n"
                    message()
                if (total_hand(dealer) > 21):
                    print "Dealer Busted! You Win!\n"
                    message()
                if (total_hand(dealer) >= total_hand(player)):
                    print "Sorry, You Lose. Dealer Wins With A Tie\n"
                    message()
                if (total_hand(player) > total_hand(dealer)):
                    print "You Win With The Best Hand!\n"
                    message()
             if (total_hand(player) > total_hand(dealer)):
                print "You Win With The Best Hand!\n"
                message()
            if (total_hand(dealer) > total_hand(player)):
                print "Sorry, You Lose. Dealer Wins\n"
                message()
        elif (c == "q"):
            message()
        else:
            print "Invalid Choice. . .To Quit, Press [Q]"
于 2013-02-27T06:41:01.977 に答える