我有两个while循环,它们在我的代码上占用了大量空间。我想知道是否有人知道如何合并它们,以使我的代码更整洁,更小,因为我什至不知道从哪里开始。我环顾四周,找不到如何合并两个几乎相同的循环。希望有人帮助我。我发现了一个与此非常类似的问题,但对我来说,答案对我而言没有意义,因为代码无法正常工作,因此我尝试对其进行修复。这是代码。
for i in range(5):
while True:
print(" ")
input("Press enter to roll player 1 ")
print("Rolling dice!")
roll1=random.randint(1,6)
roll2=random.randint(1,6)
print(roll1)
print(roll2)
total=(roll1 + roll2)
print("Your total is:" ,total)
score1=score1 +total
if roll1 is roll2:
if total in even:
score1=score1 +10
print(score1)
print("You rolled a double. Roll again.")
continue
elif total in odd:
score1-score1 -5
print(score1)
print("You rolled a double. Roll again.")
continue
elif total in even:
score1=score1 +10
print(score1)
break
elif total in odd:
score1=score1 -5
print(score1)
break
if score1<0:
print("Player 1, you went under 0. Game over.")
break
while True:
print(" ")
input("Press enter to roll player 2 ")
print("Rolling dice!")
roll1=random.randint(1,6)
roll2=random.randint(1,6)
print(roll1)
print(roll2)
total=(roll1 + roll2)
print("Your total is:" ,total)
score2=score2 +total
if roll1 is roll2:
if total in even:
score2=score2 +10
print(score2)
print("You rolled a double. Roll again.")
continue
elif total in odd:
score2=score2 -5
print(score2)
print("You rolled a double. Roll again.")
continue
elif total in even:
score2=score2 +10
print(score2)
break
elif total in odd:
score2=score2 -5
print(score2)
break
if score2<0:
print("Player 2, you went under 0. Game over.")
break
如您所见,除了玩家1和玩家2以及得分1达到得分2以外,它们实际上是相同的。如何简化此代码?
答案 0 :(得分:2)
为该循环创建定义
def roller(player_num):
while True:
print(" ")
input("Press enter to roll player %s " % str(player_num))
print("Rolling dice!")
roll1=random.randint(1,6)
roll2=random.randint(1,6)
print(roll1)
print(roll2)
total=(roll1 + roll2)
print("Your total is:" ,total)
score1=score1 +total
if roll1 is roll2:
if total in even:
score1=score1 +10
print(score1)
print("You rolled a double. Roll again.")
continue
elif total in odd:
score1-score1 -5
print(score1)
print("You rolled a double. Roll again.")
continue
elif total in even:
score1=score1 +10
print(score1)
break
elif total in odd:
score1=score1 -5
print(score1)
break
if score1<0:
print("Player %s, you went under 0. Game over." %s str(player_num)
break
roller(1)
roller(2)
我不确定为什么要使用break语句,因为这样一来就会打断循环,但是在这里,您已经定义了代码,并且每个用户都在使用它
答案 1 :(得分:0)
为避免重复相同的代码,您可以做的一件事就是定义一个函数,该函数接收玩家的人数并相应地修改该玩家的得分,例如updateScore()
或changeScore()
。参数是玩家人数(1或2)以及您要更改多少点。
答案 2 :(得分:0)
那个大的while
循环对于播放器1和播放器2几乎是相同的,因此您应该使其成为一个函数并将播放器的名称(或编号)作为参数传递。
但是还有更多:即使在函数内部,也有很多冗余。例如,您检查配对和非配对情况下的掷骰是否均等,并且可以使用三元... if ... else ...
表达式进一步压缩该部分。另外,请注意,您的代码中还有其他一些问题,例如您似乎从未初始化过score1
和score2
,并且score1-score1 -5
中有一个错字。此外,even
是什么,所有偶数的列表?相反,您可以使用total % 2 == 0
检查total
是否为偶数。
此外,您的if score < 0:
支票不在循环中。如果这样做是故意的,那么break
就没有意义了,因为它只会跳出外部for
循环,这可能不是故意的。另外,对于分数不是< 0
的情况,您可以添加一些输出。
将所有这些放在一起,该函数可能看起来像这样:
def roll(player):
score = 0
while True:
input("\nPress enter to roll, %s" % player)
roll1 = random.randint(1,6)
roll2 = random.randint(1,6)
print("Rolling dice!", roll1, roll2)
total = roll1 + roll2
score += total
score += 10 if total % 2 == 0 else -5
print("Your total is:", score)
if roll1 == roll2:
print("You rolled a double. Roll again.")
else:
break
if score < 0:
print("%s, you went under 0. Game over." % player)
else:
print("%s, your final score is %d." % (player, score))
现在,只需调用该函数两次即可:
for _ in range(5):
roll("Player 1")
roll("Player 2")