现在,我有一个代码看起来像这样:
def get_newdeck(choice, P1, P2, P3):
deck = []
if choice == 1:
deck = P2+P1+P3
return deck
elif choice == 2:
deck = P1+P2+P3
return deck
else:
deck = P1+P3+P2
return deck
这是一个代码的一部分,它是一个魔术的代码的一部分,它从 21 的“甲板”中猜测用户的卡片。choice
是用户输入(1、2 或 3 的整数),用于堆放卡片以前在,P1, P2, P3
是代表三堆的列表;更多关于这些桩的解释如下。
算法卡片技巧的工作原理如下:
魔术师将 21 张洗好的扑克牌正面朝上分成三堆,从左到右逐行。魔术师第一次这样做时,要求观众选择其中一张卡片并保密他们的选择。
魔术师让观众说出他们的卡片是在第一堆、第二堆还是第三堆。
3. 魔术师将卡片一叠一叠地收集起来,确保所选的一叠放在其他两叠之间。
步骤 1-3 再重复 2 次。
完成这些步骤后,所选卡片将“神奇地”位于 21 张卡片的中间。
有问题的步骤是第三步,我试图让它看起来不那么重复。
有没有办法让我的代码(如上所示)使用循环工作?仅供参考,我正在使用 Python-3.x
如果你想要它,这里是完整的代码 - 我知道它很乱,而且没有注释,但我正在尝试修复它,从“混乱”部分开始。
import random
def get_cards():
nums, suits=['Ace','2','3','4','5','6','7','8','9','10','Jack','Queen','King'], ['Hearts','Clubs','Diamonds','Spades']
cards_dealt=[]
while len(cards_dealt) < 22:
card = random.choice(nums) + " of " + random.choice(suits)
if card not in cards_dealt:
cards_dealt.append(card)
else:
continue
return cards_dealt
def get_piles(deck):
P1, P2, P3 = [], [], []
for i in range(21):
if i%3 == 0:
P1.append(deck[i])
elif i%3 == 1:
P2.append(deck[i])
else:
P3.append(deck[i])
return P1, P2, P3
#####################################
def get_newdeck(choice, P1, P2, P3):
deck = []
if choice == 1:
deck = P2+P1+P3
return deck
elif choice == 2:
deck = P1+P2+P3
return deck
else:
deck = P1+P3+P2
return deck
#####################################
def main():
deck = get_cards()
print("Choose a card and remember it")
for x in range(3):
P1, P2, P3 = get_piles(deck)
piles = {'Pile 1':P1, 'Pile 2': P2, 'Pile 3':P3}
for numpile, pile in sorted(piles.items()):
print()
print(numpile,': ')
for card in pile:
print(card)
print()
choice = 0
while choice > 3 or choice < 1:
while True:
try:
choice = int(input("Which pile is your card in? (1-3)? > "))
break
except ValueError:
print("Must be a number")
deck = get_newdeck(choice, P1, P2, P3)
print()
print('Your card is {}'.format(deck[10]))
main()
你可以这样做:
def get_newdeck(choice, P1, P2, P3):
chunks = [P1, P2, P3]
idx = choice-1
deck = chunks[(idx-1) % 3]+chunks[idx % 3]+chunks[(idx+1) % 3]
return deck
我正在接受,idx=choice-1
所以他们的选择是 0、1 或 2,这将与chunks
列表中的三块卡片很好地匹配。由于chunks[idx]
现在是他们选择的桩,并且chunks[idx-1]
和chunks[idx+1]
分别是他们选择的桩之前和之后的桩,因此您可以deck
通过将他们的桩放在其他两桩之间来创建。该%
(模运算)只是确保,如果我们去了0,1,2范围之外我们总结的结果返回到该范围。
如果你想象他们的选择是 2,这很容易形象化。那么堆只是按照 P1、P2、P3 的顺序排列。
如果用户选择第一堆,则 idx 将为 0,而在其之前的堆将为 -1。Modulo 3 this 变成 2,这是序列中的最后一堆。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句