【问题标题】:Simulate game of craps模拟掷骰子游戏
【发布时间】:2013-05-22 19:16:35
【问题描述】:

我正在尝试实现一个不带参数的函数craps(),它模拟一场掷骰子游戏,如果玩家赢了,则返回1,如果玩家输了,则返回0

游戏规则: 游戏从玩家投掷一对骰子开始。如果玩家总共掷出 7 或 11,则玩家获胜。如果玩家总共掷出 2,3 或 12,则玩家输了。对于所有其他掷骰值,游戏将继续进行,直到玩家再次掷出初始值(在这种情况下玩家获胜)或 7(在这种情况下玩家失败)。

我想我越来越近了,但我还没有到那里,我认为我的 while 循环还没有正常工作。这是我目前得到的代码:

def craps():
    dice = random.randrange(1,7) + random.randrange(1,7)
    if dice in (7,11):
        return 1
    if dice in (2,3,12):
        return 0
    newRoll = craps()
    while newRoll not in (7,dice):
        if newRoll == dice:
            return 1
        if newRoll == 7:
            return  0

如何修复 while 循环?我真的找不到它的问题,但我知道它是错误的或不完整的。

【问题讨论】:

    标签: python python-3.x while-loop


    【解决方案1】:

    因为这条线,你永远不会进入 while 循环:

    newRoll = craps()   
    

    这就是它所能得到的。所以它只会做 crap() 函数的顶部。您只需要使用与之前相同的滚动代码。我想你想要这样的东西:

    newRoll = random.randrange(1,7) + random.randrange(1,7)
    while newRoll not in (7,dice):
        newRoll = random.randrange(1,7) + random.randrange(1,7)        
    
    if newRoll == dice:
        return 1
    if newRoll == 7:
        return  0
    

    【讨论】:

    • 谢谢,不过有一个问题。我需要这段代码的第二份吗?:newRoll = random.randrange(1,7) + random.randrange(1,7)(while 循环中的那个)
    【解决方案2】:

    游戏规则:游戏从玩家掷出一对骰子开始。如果玩家总共掷出 7 或 11,则玩家获胜。如果玩家总共掷出 2,3 或 12,则玩家输了。对于所有其他掷骰值,游戏将继续进行,直到玩家再次掷出初始值(在这种情况下玩家获胜)或 7(在这种情况下玩家失败)。

    def rollDice(): # define a function to generate new roll
        return random.randrange(1,7) + random.randrange(1,7)
    
    def craps():
        firstRoll= rollDice()
        if firstRoll in (7,11): 
            return 1 # initial winning condition
        if firstRoll in (2,3,12):
            return 0 #initial losing condition
    
        while True:
            newRoll = rollDice()
            if newRoll == firstRoll: 
                return 1 #secondary winning condition
            if newRoll == 7: 
                return 0 #secondary losing condition
    

    那么您可以在任何时候想玩一些花旗骰时调用craps(),它的输出会是1 或0,如果它赢了或输了。

    【讨论】:

    • 这个实现看起来比其他的更好。
    • 正是我要做的;没有重复的代码,常见的任务被分成易于维护的功能。得到了我的支持,完全值得被接受。
    【解决方案3】:

    您正在递归调用 craps,但这不起作用,因为该函数返回 1 或 0。您需要将实际的骰子滚动添加到您的 while 循环中。

    newRoll = random.randrange(1,7) + random.randrange(1,7)
    while newRoll not in (7,dice):
        newRoll = random.randrange(1,7) + random.randrange(1,7)
    
    if newRoll == dice:
        return 1
    else:
        return  0
    

    【讨论】:

    • 谢谢,不过有一个问题。我需要这段代码的第二份吗?:newRoll = random.randrange(1,7) + random.randrange(1,7)(while 循环中的那个)
    • @Snarre:是的,因为你想继续滚动直到while条件成立。
    • 好的,所以第一个,在while循环之前,只帮助我们定义条件?
    • @Snarre:第一个是“初始测试”,另一个是初始测试失败的时候。你确实需要这两个,以及craps开头的第一个,因为非常第一个有不同的获胜条件(即7或11)。
    • @Snarre:在许多其他语言中,存在一个“do-while”循环,它执行一个操作并且只有 then 检查一个条件。 Python 的创建者决定他们不希望在他们的语言中出现这样的东西,所以这就是为什么必须在 while 循环周围重复掷骰子。
    猜你喜欢
    • 2011-01-19
    • 2016-02-07
    • 2013-03-07
    • 2015-12-24
    • 1970-01-01
    • 2012-02-29
    • 2018-10-19
    相关资源
    最近更新 更多