2014-06-27 4 views
3
import random 

def usertype(): 
    randletter = random.choice('qwer') 
    userinput = raw_input('Press '+str(randletter)) 
    if userinput == randletter: 
     return 'Correct' 
    else: 
     return 'Incorrect' 

def usertypetest(x,y,result): 
    while x <= 9: 
     result = usertype() 
    if result == 'Correct': 
     x = x+1 
     y = y+5 
    else: 
     x = x+1 
     y = y-2 
    return str(y)+'is your score' 

print usertypetest(0,0,usertype) 

Вот мой код. Я хочу, чтобы он попросил пользователя нажать кнопку, случайно выбранную из набора (Q, W, E, R), затем напечатать либо правильную, либо неправильную, в зависимости от того, какую кнопку они нажимают. Я хочу, чтобы это произошло 10 раз. После десяти попыток он напечатает свой результат: 5 для каждого «Исправить» и -2 для «Неправильно». Вместо этого я получаю это.Программа, застрявшая во время цикла, не печатается

Press e(e) 
Press e(e) 
Press w(e) 
Press q(e) 
Press q(e) 
Press q(e) 
Press r(e) 
Press e(e) 
Press w(e) 
Press q(e) 
Press e(e) 
Press e(e) 
Press e(e) 
Press e(e) 
Press q(e) 
Press w(e) 
Press r(e) 
Press w(e) 
Press r(e) 
Press w(e) 
Press r(e) 
Press r(e) 

Независимо от того, что я вхожу, он не возвращает ни «Правильный», ни «Неверный». Он также продолжается уже 10 лет и не показывает их оценку. Очевидно, проблема я не вижу.

Мой ввод находится в скобках.

Для уточнения, это то, что я хочу:

Press q(q) 
Correct 
Press e(q) 
Incorrect 
Press w(w) 
Correct 
Press q(q) 
Correct 
Press e(eq) 
Incorrect 
Press e(e) 
Correct 
Press q(q) 
Correct 
Press q(r) 
Incorrect 
Press w(w) 
Correct 
Press r(r) 
Correct 
29 is your score 
+2

у вас есть ошибка отступа – Fabricator

ответ

3

В Python отступы очень важно.

В этом коде x для цикла while никогда не изменяется, как if блок находится на том же уровне отступа как петли while. Таким образом, только петлевой инструкция result = usertype()

while x <= 9: 
    result = usertype() 
if result == 'Correct': 
    x = x+1 
    y = y+5 

Два дополнительных критика:

Вы приращением x в двух местах, когда это нужно только сделать один раз.

while x <= 9: 
    result = usertype() 
    if result == 'Correct': 
     y = y+5 
    else: 
     y = y-2 
    x += 1 

Кроме того, поскольку вы зацикливание фиксированного числа раз, почему бы не игнорировать приращения x и использовать цикл, например, так:

for x in range(10): 
    result = usertype() 
    if result == 'Correct': 
     y = y+5 
    else: 
     y = y-2 
+1

Несмотря на ссылки на 9, первоначальный цикл фактически итерирует 10 раз, поэтому для замены требуется 'range (10)'. Но использование 'range()' определенно более разумно. –

+0

Whooops. [Ошибка Fencepost] (http://en.wikipedia.org/wiki/Off-by-one_error#Fencepost_error) –

2

Вы должны поместить if result == 'Correct': блок под петли while x <= 9:, где вы получите пользовательский ввод, так что он получает оценку каждый раз. И вы можете добавить print(result), чтобы получить правильный/неправильный обратной связи, как в вашем примере:

def usertypetest(x,y,result): 
    while x <= 9: 
     result = usertype() 
     if result == 'Correct': 
      x = x+1 
      y = y+5 
     else: 
      x = x+1 
      y = y-2 
     print(result) 
    return str(y)+'is your score' 
0

Просто поместите if блок под петлей while. Проблема решена.

Попробуйте с этим кодом:

import random 

def usertype(): 
    randletter = random.choice('qwer') 
    userinput = raw_input('Press '+str(randletter)) 
    if userinput == randletter: 
     return 'Correct' 
    else: 
     return 'Incorrect' 

def usertypetest(x,y,result): 
    while x <= 9: 
     result = usertype() 
     if result == 'Correct': 
      x = x+1 
      y = y+5 
     else: 
      x = x+1 
      y = y-2 
    return str(y)+'is your score' 

print usertypetest(0,0,usertype) 
1

Ваша главная проблема заключалась в том, что вы имели, если/еще блок в неправильном объеме. Вам нужно было находиться под блоком while. Это гарантирует, что он проверяет, вводит ли пользователь правильный ввод при каждом запуске usertype().

import random 

moves = 0 
score = 0 

def usertype(): 
    randletter = random.choice('qwer') 
    userinput = raw_input('Press '+str(randletter)) 
    if userinput == randletter: 
     return True 
    else: 
     return False 

def usertypetest(moves, score): 
    while moves < 10: 
     result = usertype() 
     moves = moves + 1 
     if result: 
      score = score + 5 
     else: 
      score = score - 2 
    return str(score) + ' is your score' 

print usertypetest(moves, score) 
1

Кроме того, вы не печатаете значение результата переменной.После оценки результатов, добавьте следующее:

печать результат

0

Есть несколько проблем.

  1. Вам необходимо напечатать «правильный» перед возвратом пользователя.
  2. Вам не нужно указывать «результат» в usertypetest.
  3. Положите, если ... еще внутри цикла в usertypetest.
  4. Измените свой последний отпечаток.

Вот правильный код.

import random 

def usertype(): 
    randletter = random.choice('qwer') 
    userinput = raw_input('Press '+str(randletter)) 
    if userinput == randletter: 
     print 'Correct' 
     return 'Correct' 
    else: 
     print 'Incorrect' 
     return 'Incorrect' 

def usertypetest(x,y): 
    while x <= 9: 
     result = usertype() 
     if result == 'Correct': 
      x = x+1 
      y = y+5 
     else: 
      x = x+1 
      y = y-2 
    return str(y)+'is your score' 

print usertypetest(0,0) 
1

Помимо проблемы с отступом, которую идентифицировали другие люди, код не является особенно идиоматическим Python. usertypetest() функция может быть:

def usertypetest(x,y,result): 
    for x in range(10): 
     if usertype() == 'Correct': 
      y = y + 5 
     else: 
      y = y - 2 
    return '%d is your score' % y 

Там могут быть лучшие способы сделать это, но это немного проще, и немного больше Pythonic.

Я также наблюдаю, что я не вижу круглых скобок вокруг ввода, который, как утверждает пример, видит.

Если вы хотите, чтобы увидеть вердикт по каждой букве, то вам необходимо сохранить отдачу от usertype() после всего:

def usertypetest(x,y,result): 
    for x in range(10): 
     result = usertype() 
     print result 
     if result == 'Correct': 
      y = y + 5 
     else: 
      y = y - 2 
    return '%d is your score' % y 
+0

Спасибо, что показал мне, как его упростить. Хотя первый ответчик создал функциональный код, вы получаете +1 для упрощения. Также я просто поставил круглые скобки для идентификации ввода, они не были в фактическом выходе. – Bretsky

Смежные вопросы