2014-07-10 40 views
1

我的代码,要求用户使用“或”时,如果他们想要一个4,6或12面的骰子被卷起并发生了什么,如果他们不把在4,6或12,他们应该再次被问及直到他们输入正确。它只是一直说一切都无效。这里是我当前的代码:不太清楚在Python

number = int(input("Would you like to use a 4, 6 or 12 sided die\n")) 
while number != 4 or number != 6 or number != 12: 
    print("Invalid response") 
    int(input("Would you like to use a 4, 6 or 12 sided die?\n")) 
if number == 4: 
    import random 
    random4 = random.randint(1, 4) 
    print("Your 4 sided die rolled a" ,random4) 

elif number == 6: 
    import random 
    random6 = random.randint(1, 6) 
    print("Your 6 sided die rolled a" ,random6) 

elif number == 12: 
    import random 
    random12 = random.randint(1, 12) 
    print("Your 12 sided die rolled a" ,random12) 
+0

你的if不是while块的一部分。 – munk

+0

7个答案在5分钟内就会显示你需要RTFM。 – devnull

+0

想一想;如果你问数字是不是4 **或**数字不是6 **或**数字不是12,那么如果数字是4,则满足这三个条件中的两个。 –

回答

0

下面是一个保留原始结构的编辑。作为初学者,不要犹豫,像你一样写简单,直接的代码。你的主要努力应该是让程序运行。你总是可以回头用你学到的最新概念重构/重写代码。这就是在所有技能水平上完成的。

在这种情况下,使用while True:消除复合OR语句。您可以分别使用==或!=来使用OR或AND。另外,在使用while循环时,应该使用传递值(即允许进入循环的值)初始化循环外部的checked - value - number。

number = 0 
while number != 4: 
    #do stuff 
    number = someNewValue 

使用复合和/或条件时需要了解的几件事情是短路和运算符优先级。

import random 
while True: # loops until break 
    number = int(input("Would you like to use a 4, 6 or 12 sided die?\n")) 
    if number == 4: 
     import random 
     random4 = random.randint(1, 4) 
     print("Your 4 sided die rolled a" ,random4) 
     break 
    elif number == 6: 
     import random 
     random6 = random.randint(1, 6) 
     print("Your 6 sided die rolled a" ,random6) 
     break 
    elif number == 12: 
     import random 
     random12 = random.randint(1, 12) 
     print("Your 12 sided die rolled a" ,random12) 
     break 

一旦工作,应该应用其他帖子的几个想法。其他想法是使这个功能,并使模具大小列表变量。

最终代码可能看起来像这样。

from random import randrange 

DIE_CHOICES = {4, 6, 12} 

def roll(choices): 
    while True: 
     try: 
      choice = int(input('Would you like to use a 4, 6 or 12 sided die?\n')) 
     except ValueError: 
      continue 
     if roll in choices: 
      return choice, 1 + randrange(choice) 
     else: 
      print 'Please pick a legal die size.\n' 

print 'Your {} sided die rolled a {}.'.format(roll(DIE_CHOICES)) 

这使得事情更通用一些,并消除重复/冗余代码。

2

为了简化您的病情,试试这个:

while number not in (4, 6, 12): 
... 

你的条件是不正确的,不管是什么,你的支票的人会是真的。

0

你需要了解如何or工作:尽快

while number != 4 or number != 6 or number != 12: 

作为条件之一为真:

您的代码就会出来这个循环。假设你输入6,第一个条件,number != 4仍然是真的,所以控制永远不会评估number != 6

您需要使用and

3

你的逻辑流程有点不合适。你要求的是while循环之外的数字,所以这个数字永远不会被更新,并且一直保持评估原始值。您需要将变量number设置为新输入呼叫的结果。

while number != 4 or number != 6 or number != 12: 
    number = int(input("Would you like to use a 4, 6 or 12 sided die\n")) 

编辑: 触及另一个原因,这是行不通的很正确,以及其他的一些反应。在说这些事情无效之前,你需要检查所有这些事情是否属实,并不是说它们中的任何一个都是真实的。一个数字不能同时是4,6和12。因此,使用and或更好:

while number not in [4, 6, 12]: 
0

您需要使用,而不是或。 你的第一行说:“检查用户是否没有滚动4;然后检查他们是否没有滚动6,然后检查他们是否没有滚动12”,除了它正在单独做所有这些。因此,滚动4将不会是6而不是12;你需要使用和你在哪里使用或在第一行

0

你需要使用and而不是or。让我们一起来看看会发生什么。

while number != 4 or number != 6 or number != 12: 

首先,您输入4。该程序一步一步地走下去。

number != 4 

这是错误的,因为数字实际上是4。下一页:

number != 6 

这原来是真的,因为我们给4,而不是6。这意味着该程序会直接进入下一行代码,并要求再次进行滚动。如果你想要“这些都不是真的”那种情况,你需要使用and而不是or

0

布什米尔斯建议你可以使用and。这是另一种方法。

from random import randrange 
number = -1 

while (number not in (4,6,12)): 
    try: 
    number = int(input("Would you like to use a 4, 6 or 12 sided die\n")) 
    except ValueError: 
    continue 

print("Your {} sided died rolled a {}.".format(number,1+randrange(number)))