2016-06-27 57 views
0

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

在版本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 
+0

这里供您参考的是'new_card'函数。 (): \t s = ['s','c','d','h']; \t n =列表(范围(1,14)); \t return [random.choice(s),random.choice(n)]; ' – st4rgut

+0

不明白为什么'new_game()'在new_card()不能生成唯一卡时递归调用。我认为代码应该调用'new_card()'直到循环迭代生成一个唯一的代码。你怎么看? –

+0

好的,谢谢你指出。我打算说'new_game'检查重复卡片。当找到重复的卡时,该功能重新开始。好像'new_game()'起作用了,但是你认为调用'new_card()'会更有效率吗? – st4rgut

回答

1

调用new_game是不是解决这个项目的最佳途径。你可以尝试多种方式,其中一种我正在展示。尝试检查列表的长度,直到它具有所需的长度,而不是循环的常量。

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() 
+0

我想你想要'n = new_card()'在内部循环中。否则,如果第一个选择是重复的,那么你将永远运行,因为'n'不会改变。 – Blckknght

+0

我不明白你的意思。第一个选择如何重复,“游戏”列表最初是空的。虽然我修改了。请看看你是否认为这是正确的。谢谢指出。 – formatkaka

+2

“first pick”是指外部'while'循环中的'n = new_card()'行(与内部循环中的pick相反)。它只会发生在外层循环的后续过程中。但实际上,因为你已经将Questioner的'for'外层循环变成了'while',所以你实际上并不需要内层循环。你可以只有一个循环,并且'如果n不在游戏中:game.append(n)'没有'else'块。 – Blckknght