0

このサイコロ ゲームを Python で作成しましたが、inputdice 関数で構文エラーが発生します。以下はサイコロゲーム全体です。実行すると、ゲームは 10 ラウンドを経て、ラウンド 10 の後、またはユーザーがお金を使い果たしたときに停止する必要があります。助言がありますか?

from random import *

def dice1():
    print("+-----+")
    print("|     |")
    print("|  *  |")
    print("|     |")
    print("+-----+")

def dice2():
    print("+-----+")
    print("|*    |")
    print("|     |")
    print("|    *|")
    print("+-----+")

def dice3():
    print("+-----+")
    print("|*    |")
    print("|  *  |")
    print("|    *|")
    print("+-----+")

def dice4():
    print("+-----+")
    print("| * * |")
    print("|     |")
    print("| * * |")
    print("+-----+")

def dice5():
    print("+-----+")
    print("|*   *|")
    print("|  *  |")
    print("|*   *|")
    print("+-----+")

def dice6():
    print("+-----+")
    print("|*   *|")
    print("|*   *|")
    print("|*   *|")
    print("+-----+")

def drawdice(d):
    if d==1:
        dice1()
    elif d==2:
        dice2()
    elif d==3:
        dice3()
    elif d==4:
        dice4()
    elif d==5:
        dice5()
    elif d==6:
        dice6()
    print()

def inputdie():
    dice=input(eval("Enter the number you want to bet on --> "))
    while dice<1 or dice>6:
        print("Sorry, that is not a good number.")
        dice=input(eval("Try again. Enter the number you want to bet on --> "))
    return dice

def inputbet(s):
    bet=input(eval("What is your bet?"))
    while bet>s or bet<=0:
        if bet>s:
            print("Sorry, you can't bet more than you have")
            bet=input(eval("What is your bet?"))
        elif bet<=0:
            print("Sorry, you can't bet 0 or less than 0")
            bet=input(eval("What is your bet?"))
    return bet

def countmatches(numbet,r1,r2,r3):
    n=0
    if numbet==r1:
        n+=1
    if numbet==r2:
        n+=1
    if number==r3:
        n+=1
    return n


def payoff(c,betam):
    payoff=0
    if c==1:
        print("a match")
        payoff=betam
    elif c==2:
        print("a double match!")
        payoff=betam*5
    elif c==3:
        print("a triple match!")
        payoff=betam*10
    else:
        payoff=betam*(-1)
    return payoff


def main():
    dollars=1000
    rounds=1
    roll=0
    single=0
    double=0
    triple=0
    misses=0
    flag=True
    print("Play the game of Three Dice!!")
    print("You have", dollars, "dollars to bet with.")
    while dollars>0 and rounds<11 and flag==True:
        print("Round", rounds)
        dicebet=inputdie()
        stake=inputbet(dollars)
        for roll in randrange(1,7):
            roll1=roll
        for roll in randrange(1,7):
            roll2=roll
        for roll in randrange(1,7):
            roll3=roll
        drawdice(roll1)
        drawdice(roll2)
        drawdice(roll3)
        matches=countmatches(dicebet,roll1,roll2,roll3)
        dollarswon=payoff(matches,stake)
        if matches==1:
            single+=1
        elif matches==2:
            double+=1
        elif matches==3:
            triple+=1
        elif matches==0:
            misses+=1
        if dollarswon>0:
            print("You got a match!")
            print("You won $", dollarswon, sep='')
            dollars=dollars+dollarswon
            print("Your stake is $", dollars, sep='')
        else:
            print("You lost your bet! $", stake, sep='')
            dollars=dollarswon+dollars
        rounds+=1
    if rounds==10:
        print("*******Singles", single, "Doubles", double, "Triples", triple, "Misses", misses)
        answer=input("Want to play some more? (y or n)")
        if answer=="y":
            main()
        else:
            print("Have a good day")

main()

どんな助けでも大歓迎です。ありがとう!

4

3 に答える 3

3

近似エラーは、eval()有効な Python 構文である式を期待することです。
"Enter the number you want to bet on -->"または、このプログラムの他の文字列のいずれかが有効な Python 式ではないため、実行時に構文エラーが生成されます。

プログラムのより広い問題は、それeval()が必要ではなく、避けるべきであるということです。

特に初心者にとっての経験則は、「eval() は悪」であり、「決して」使用すべきではないということです。「 never
」が引用符で囲まれていることに 注意してください。これは、eval() が非常に役立つユース ケースが [非常に] 少ないことを示唆しています。 なぜそのような「危険な味方」であるかの理由は、実行時に [通常はユーザー提供の] 任意の python 式を導入し、そのような式が無効な構文 (大したことではない) またはさらに悪い可能性がある可能性が高いためです。呼び出されると、ホスト上であらゆる種類の悪いことを実行する、かなり有害な、または場合によっては悪意のあるコードが含まれます...
eval()

つまり、input() メソッドから取得した入力を処理するために eval() はまったく必要ありません。
次のようなパターンを使用することを意図していた可能性があると思います:
myVar = eval(input("Enter some value for myVar variable"))
(つまり、eval と入力を逆の順序で)実際には、eval() には文字列引数が必要なため、 これ
はまだ機能しません。 ) はここでは保証されません。
myVar = eval(str(input("Enter some value for myVar variable")))

もう 1 つの推測は、eval()input() からの戻り値が文字列型であると予想したために使用したことであり、eval() はこれをプログラム ロジックで使用するために整数に変換します...
raw_input()文字列を返すメソッドであり、それはユーザーが引用符やその他の無効な値を使用せずにテキストを入力したときに実行時エラーが発生しないようにするために使用する必要があるのはもっともらしいです。ユーザーに整数値を入力させる一般的なイディオムは、次のようなものです。

int_in = None
while int_in == None:
   str_in = raw_input('some text telling which data is expected')
   try:
       int_in = int(str_in)
   except ValueError:
       # optional output of some message to user
       int_in = None

通常、この種のロジックは、簡単に再利用できるようにメソッドに入れます。

お役に立てれば。あなたは Python を使って実践的なことをしているようです。コードを学ぶのに勝る方法はありません。時折ドキュメントを見直したり、関連する本を読んだりしています。良い本のプラグイン: Alex Martelli による Python Cookbook

于 2012-10-26T03:41:27.667 に答える
3

まず、Python 3 を使用していることを確認します。

import sys
print(sys.version)

次のようなものが表示されるはずです3.2.1 (...)

その理由は、Python 2 と Python 3 にはいくつかの重要な違いがあり、特にPython 3 では期待どおりにしか動作しないためです (一方、Python 2では代わりにinput()使用する必要があります)。raw_input()

本/チュートリアルに従っている場合は、同様のバージョンの Python を使用していることを確認してください。

次に、いくつかの場所でinputとの順序を逆にしましたeval

dice=input(eval("Enter the number you want to bet on --> "))

そのはず:

dice=eval(input("Enter the number you want to bet on --> "))

..input(...)のような文字列を返すため、この文字列"123"で呼び出したいとevalします。あなたの現在のコードは正しくない呼び出しeval("Enter the number..")をしていました。

とは言っても、使用する必要はほとんどないはずです。使用evalには多くの問題があり、Python ではほとんど必要ありません。代わりに、数値を含む文字列を取得して整数に変換したいので、次を使用しますint

dice=int(input("Enter the number you want to bet on --> "))

これにより、 の問題が発生しにくくなるだけでなく、eval無効な値を入力したときのエラー メッセージが改善されます。

于 2012-10-26T04:59:22.337 に答える
1

コードに加えた変更:

  • 削除されましたeval()
  • タイプミスを修正しました (numbet ではなく数字)
  • for roll in randrange(1,7): roll1=rollブロックをちょうどに変更しましたroll1=randrange(1,7)
  • if rounds==10:最後のループの後にラウンドが11になるため、a)不要でb)無効であるため、チェックを削除しました
  • 文字列への y/n 回答の解析

from random import *

def dice1():
    print("+-----+")
    print("|     |")
    print("|  *  |")
    print("|     |")
    print("+-----+")

def dice2():
    print("+-----+")
    print("|*    |")
    print("|     |")
    print("|    *|")
    print("+-----+")

def dice3():
    print("+-----+")
    print("|*    |")
    print("|  *  |")
    print("|    *|")
    print("+-----+")

def dice4():
    print("+-----+")
    print("| * * |")
    print("|     |")
    print("| * * |")
    print("+-----+")

def dice5():
    print("+-----+")
    print("|*   *|")
    print("|  *  |")
    print("|*   *|")
    print("+-----+")

def dice6():
    print("+-----+")
    print("|*   *|")
    print("|*   *|")
    print("|*   *|")
    print("+-----+")

def drawdice(d):
    if d==1:
        dice1()
    elif d==2:
        dice2()
    elif d==3:
        dice3()
    elif d==4:
        dice4()
    elif d==5:
        dice5()
    elif d==6:
        dice6()
    print()

def inputdie():
    dice=input("Enter the number you want to bet on --> ")
    while dice<1 or dice>6:
        print("Sorry, that is not a good number.")
        dice=input("Try again. Enter the number you want to bet on --> ")
    return dice

def inputbet(s):
    bet=input("What is your bet?")
    while bet>s or bet<=0:
        if bet>s:
            print("Sorry, you can't bet more than you have")
            bet=input("What is your bet?")
        elif bet<=0:
            print("Sorry, you can't bet 0 or less than 0")
            bet=input("What is your bet?")
    return bet

def countmatches(numbet,r1,r2,r3):
    n=0
    if numbet==r1:
        n+=1
    if numbet==r2:
        n+=1
    if numbet==r3:
        n+=1
    return n


def payoff(c,betam):
    payoff=0
    if c==1:
        print("a match")
        payoff=betam
    elif c==2:
        print("a double match!")
        payoff=betam*5
    elif c==3:
        print("a triple match!")
        payoff=betam*10
    else:
        payoff=betam*(-1)
    return payoff


def main():
    dollars=1000
    rounds=1
    roll=0
    single=0
    double=0
    triple=0
    misses=0
    flag=True
    print("Play the game of Three Dice!!")
    print("You have", dollars, "dollars to bet with.")
    while dollars>0 and rounds<11 and flag==True:
        print("Round", rounds)
        dicebet=inputdie()
        stake=inputbet(dollars)
        roll1=randrange(1,7)
        roll2=randrange(1,7)
        roll3=randrange(1,7)
        drawdice(roll1)
        drawdice(roll2)
        drawdice(roll3)
        matches=countmatches(dicebet,roll1,roll2,roll3)
        dollarswon=payoff(matches,stake)
        if matches==1:
            single+=1
        elif matches==2:
            double+=1
        elif matches==3:
            triple+=1
        elif matches==0:
            misses+=1
        if dollarswon>0:
            print("You got a match!")
            print("You won $", dollarswon)
            dollars=dollars+dollarswon
            print("Your stake is $", dollars)
        else:
            print("You lost your bet! $", stake)
            dollars=dollarswon+dollars
        rounds+=1

    print("*******Singles", single, "Doubles", double, "Triples", triple, "Misses", misses)
    answer=str(input("Want to play some more? (y or n)"))
    if answer=="y":
        main()
    else:
        print("Have a good day")

main()
于 2012-10-26T03:43:59.333 に答える