【问题标题】:blackjack game: for loops 'not in' vs 'in'二十一点游戏:for 循环“不在”与“在”
【发布时间】:2016-06-27 02:01:41
【问题描述】:

在进行二十一点游戏模拟时,我在使用 for 循环时遇到了一些麻烦。函数new_game 模拟正在发的四张牌,而new_card 确保没有牌在游戏中重复。我创建了函数new game 的两个变体,想知道它们有何不同。

在版本 1 中,存在函数只返回 3 张卡片的情况,而版本 2 似乎按预期工作。

版本 1:

def new_game():
game=[];
for x in range(4):
    n=new_card();
    if n not in game:
        game+=[n];
    else:
        new_game();
    print(game);
return game

版本 2:

def new_game():
game=[];
for x in range(4):
    n=new_card();
    if n in game:
        new_game();
        print(game);
    else:
        game+=[n];
return game

【问题讨论】:

  • 这里是函数new_card供您参考。 def new_card(): s=['s','c','d','h']; n=list(range(1,14)); return [random.choice(s),random.choice(n)];
  • 不明白为什么new_card() 无法生成唯一卡时会递归调用new_game()。我认为代码应该调用new_card(),直到为循环迭代生成一个唯一的。你怎么看?
  • 好的,感谢您指出这一点。我的意思是说new_game 检查重复的卡片。当找到重复的卡片时,该功能重新开始。看起来new_game() 有效,但您认为调用new_card() 会更有效吗?
  • 是的,考虑一下如果您在列表中有 3 张卡片,并且您获得的第四张卡片已经出现在列表中,那么最好只搜索一张新卡片而不是重新开始。
  • 这与您遇到的问题无关,但我想我会注意到 Python 语句末尾不需要分号。它们是允许的,主要是因为您偶尔想在一行中放置多个简单语句(通常用于从命令行使用python -c 运行的单行脚本),但是当您不使用它们时使用它们并不是一种好的风格需要。

标签: python for-loop


【解决方案1】:

致电new_game 不是解决此项目的最佳方式。您可以尝试多种方法,我正在展示其中一种。而不是一个常数 for 循环尝试检查列表的长度,直到它达到所需的长度。

def new_game():
    game=[];
    while len(game)!=4:
        n = new_card()
        while(n in game):
            n = new_card()
        else:
            game.append(n)
    return game

print new_game()

我不确定这是否是一个好的设计,但它仍然有效,您可以修改它。

编辑

感谢 Blckknght 提出此建议。

def new_game():
    game=[]
    while len(game)!=4:
        n = new_card()
        if n not in game:
            game.append(n)
    return game

print new_game()

【讨论】:

  • 我想你想在内部循环中使用n = new_card()。否则,如果第一个选择是重复的,您将永远运行,因为 n 不会改变。
  • 我不明白你。第一个选择怎么可能是重复的,game 列表最初是空的。虽然我已经修改了。请看你认为是否正确。谢谢指出。
  • “第一选择”是指外部while 循环中的n = new_card() 行(与内部循环中的选择相反)。它只会发生在外循环的后续通道之一上。不过,实际上,由于您已将提问者的 for 外循环更改为 while,因此您实际上根本不需要内循环。您可以只使用一个循环并执行 if n not in game: game.append(n) 而没有 else 块。
  • 感谢您的关注。使用两个 while 循环,我太愚蠢了
猜你喜欢
  • 2015-08-16
  • 2015-06-18
  • 2013-10-01
  • 2023-03-21
  • 2020-05-18
  • 1970-01-01
  • 2012-09-21
  • 1970-01-01
  • 2013-12-27
相关资源
最近更新 更多