1

私は非常に単純なルーレット シミュレーターを書いています。赤/黒の賭け (基本的には表か裏のゲームのようなもの) のみに焦点を当てています。

私が抱えている問題は、変数が関数間で呼び出されることです。

これがコードです(他の問題もあると思いますが、今のところこれに焦点を当てています):

import random

# Defines initial amounts of money and losses
money = 50
losses = 0

# Starts the sim
def roulette_sim():
    print "How much do you want to bet?"
    bet = int(raw_input("> "))   
    if bet > money:
        bet_too_much()
    else:
        red_or_black()


# Prevents one from betting more money than one has
def bet_too_much():
    print "You do not have all that money. Please bet again." 
    raw_input("Press ENTER to continue> ")
    roulette_sim()

# Asks user to select red or black, starts the sim, modifies money/losses
def red_or_black():
    print "OK, you bet %r" %  (bet)
    print "Red or black?"
    answer = raw_input("> ")
    number = random.randint(1, 2)
    if number == 1 and answer == "red":
        print "You win!"
        money += bet
        print "You now have %r money" % (money)
        print "Your losses are %r" % (losses)
        replay()
    elif number == 2 and answer == "black":
        print "You win!"
        money += bet
        print "You now have %r money" % (money)
        print "Your losses are %r" % (losses)
        replay()
    else:
        print "You lost!"
        money -= bet
        losses += bet
        print "You now have %r money" % (money)
        print "Your losses are %r" % (losses)
        replay()

# Asks user whether he/she wants to play again
def replay():
    print "Do you want to play again?"
    play_again = raw_input("y/n> ")
    if play_again == "y":
        roulette_sim()
    else:
        print "OK, bye loser!"


roulette_sim()

これは をNameError: global name 'bet' is not defined使用することで回避できますが、それglobalに頼りたくないのです。roulette_simを使用する以外に、他の関数でユーザーが割り当てた値を使用して、この変数を呼び出すにはどうすればよいglobalですか?

money同じ問題が変数にも当てはまると思います。

私は現在、Pythonの非常に基本的な知識を持っているので、間違いがあれば申し訳ありません.

ありがとう

4

3 に答える 3

4

クラスを使用します。

import random

class RouletteSim(object):
    def __init__(self):
        # Defines initial amounts of money and losses
        self.money = 50
        self.losses = 0

    # Starts the sim
    def roulette_sim(self):
        print "How much do you want to bet?"
        bet = int(raw_input("> "))
        if bet > self.money:
            self.bet_too_much()
        else:
            self.red_or_black(bet)

    # Prevents one from betting more money than one has
    def bet_too_much(self):
        print "You do not have all that money. Please bet again."
        raw_input("Press ENTER to continue> ")
        self.roulette_sim()

    # Asks user to select red or black, starts the sim, modifies money/losses
    def red_or_black(self, bet):
        print "OK, you bet %r" %  (bet)
        print "Red or black?"
        answer = raw_input("> ")
        number = random.randint(1, 2)
        if number == 1 and answer == "red":
            print "You win!"
            self.money += bet
            print "You now have %r money" % (self.money)
            print "Your losses are %r" % (self.losses)
            self.replay()
        elif number == 2 and answer == "black":
            print "You win!"
            self.money += bet
            print "You now have %r money" % (self.money)
            print "Your losses are %r" % (self.losses)
            self.replay()
        else:
            print "You lost!"
            self.money -= bet
            self.losses += bet
            print "You now have %r money" % (self.money)
            print "Your losses are %r" % (self.losses)
            self.replay()

    # Asks user whether he/she wants to play again
    def replay(self):
        print "Do you want to play again?"
        play_again = raw_input("y/n> ")
        if play_again == "y":
            self.roulette_sim()
        else:
            print "OK, bye loser!"

RouletteSim().roulette_sim()
于 2013-09-04T17:12:01.227 に答える
2

値を引数として関数に渡し、関数が更新された値を返すようにすることができます。次に例を示します。

def roulette_sim(money, losses):
    print "How much do you want to bet?"
    bet = int(raw_input("> "))   
    if bet > money:
        return bet_too_much(money, losses)
    else:
        eturn red_or_black(money, losses, bet)

グローバル変数と変数red_or_blackを変更する代わりに、失われた金額を更新された値で呼び出します。moneylossesreplayroulette_sim

または、単にすべてをクラスに入れてself.moneyself.lossesself.bet「グローバル」として使用することもできます。

ただし、これらの関数の設計全体がひどいことに気付くかもしれません。それらは複雑な関係を持ち、再帰を使用しますRuntimError: Maximum recursion depth exceeded

代わりにループを使用するようにコード全体をリファクタリングできます。アイデアを与えるだけです:

import random



def get_bet():
    bet = float('+inf')
    while bet > money:
        print("How much do you want to bet?")
        bet = int(raw_input("> "))
        if bet > money:
            bet_too_much()
    return bet

def bet_too_much():
    print("you do not have all the money. Please bet again.")
    raw_input("Press ENTER to continue")


def roulette_sim():
    money = 50
    losses = 0
    while True:
        bet = get_bet()
        won = red_or_black(bet)
        money += won
        losses -= won

注:プレイヤーがベットする別のゲームを書きたいとします。あなたのデザインを使用して、この新しいゲームで機能を再利用するのは本当にハックです。

上記の設計では、関数を自由に再利用しget_bet()てプレーヤーに賭けなどを依頼できます。これは、関数を再帰サイクルと密結合する代わりにループを使用するもう 1 つの理由を与えるためです。

于 2013-09-04T17:14:15.177 に答える