2014-12-08 3 views
-7

Это «Броненосец!» проблема, которая рассматривается в Codecademy (Python). Я хочу поставить условие, в котором количество поворотов не увеличивается в случае, когда пользователь вводит значение строки/столбца, которое повторяется или выходит за пределы. Я не могу понять, что проблема в этом коде:Codecademy Battleship! Python

from random import randint 

board = [] 

for x in range(5): 
    board.append(["O"] * 5) 

def print_board(board): 
    for row in board: 
     print " ".join(row) 

print "Let's play Battleship!" 
print_board(board) 

def random_row(board): 
    return randint(0, len(board) - 1) 

def random_col(board): 
    return randint(0, len(board[0]) - 1) 

ship_row = random_row(board) 
ship_col = random_col(board) 
print ship_row 
print ship_col 

# Everything from here on should go in your for loop! 
for turn in range(4): 
    # Be sure to indent four spaces! 
    print "Turn", turn + 1 
    guess_row = int(raw_input("Guess Row:")) 
    guess_col = int(raw_input("Guess Col:")) 

    if guess_row == ship_row and guess_col == ship_col: 
     print "Congratulations! You sunk my battleship!" 
     break 
    else: 
     if (guess_row < 0 or guess_row > 4) or (guess_col < 0 or guess_col > 4): 
      print "Oops, that's not even in the ocean." 
      print "Please try again." 
#   turn -= 1          Why doesn't this work? The "Game Over" message does not get displayed at the end of the game if such a case arises (but the game still ends!), which means the value of turn does not reach 3. But still when 'turn + 1' is printed, the value gets incremented even if such a condition is encountered. 
     elif(board[guess_row][guess_col] == "X"): 
      print "You guessed that one already." 
      print "Please try again." 
#   turn -= 1          Same as last message. 
     else: 
      print "You missed my battleship!" 
      board[guess_row][guess_col] = "X" 
     if turn == 3: 
      print "Game Over" 
     # Print (turn + 1) here! 
     print_board(board) 
+4

Хотели бы вы нам читать весь код, запустить его и проверить это для вас? –

+1

Пожалуйста, прочитайте [минимальный, полный, проверяемый пример] (http://stackoverflow.com/help/mcve). Было бы очень легко разделить все это на все необходимое. Например, см. [Этот pastebin] (http://pastebin.com/YTst1vC3). Если вы дадите нам это, вместо вашей всей программы, я готов поспорить, что ваш вопрос будет проголосован +3 вместо -5 с 2 закрытыми голосами. – abarnert

ответ

1

В коде есть только очень небольшая ошибка, из чего я могу видеть. Последняя инструкция if, содержащая вашу строку «Game Over», имеет неправильный отступ. Переместить его влево на один блок:

else: 
    print "You missed my battleship!" 
    board[guess_row][guess_col] = "X" 

if turn == 3: 
    print "Game Over" 
    # Print (turn + 1) here! 
    print_board(board) 

Вот мой полный код из этого упражнения:

from random import randint 

board = [] 

for x in range(5): 
    board.append(["O"] * 5) 

def print_board(board): 
    for row in board: 
     print " ".join(row) 

print "Let's play Battleship!" 
print_board(board) 

def random_row(board): 
    return randint(0, len(board) - 1) 

def random_col(board): 
    return randint(0, len(board[0]) - 1) 

ship_row = random_row(board) 
ship_col = random_col(board) 
print ship_row 
print ship_col 

for turn in range(4): 
    print "Turn", turn + 1 

    guess_row = int(raw_input("Guess Row:")) 
    guess_col = int(raw_input("Guess Col:")) 

    if guess_row == ship_row and guess_col == ship_col: 
     print "Congratulations! You sunk my battleship!" 
    else: 
     if (guess_row < 0 or guess_row > 4) or (guess_col < 0 or guess_col > 4): 
      print "Oops, that's not even in the ocean." 
     elif(board[guess_row][guess_col] == "X"): 
      print "You guessed that one already." 
     else: 
      print "You missed my battleship!" 
      board[guess_row][guess_col] = "X" 

     print_board(board) 

    if turn == 3: 
     print "Game Over" 
+0

Вы пропустили «перерыв» после печати «Игра за: –

1

for turn in range(4): цикл не работает так, как вы думаете, что он делает.

Это эквивалентно следующему:

_range = [0, 1, 2, 3] 
_it = iter(_range) 
while True: 
    try: 
     turn = next(_it) 
    except StopIteration: 
     break 
    # your code here 

Вы не должны понимать все детали есть, но они ключевым моментом является то, что каждый раз через петлю, это присвоение нового значения turn, который выходит прямо из итератора и не имеет ничего общего со старым значением turn. Итак, ваши изменения на turn не имеют значения.


Итак, как вы его исправите?

Один из способов заключается в замене for цикл с while цикл, который явно поддерживает turn, так что вы можете явно уменьшить его или, лучше, просто не увеличивать его. Например:

turn = 0 
while turn < 4: 
    # your code, slightly modified 
    # do turn += 1 only when the turn is valid 
    # don't do turn += 1 when the turn is invalid 

Другой способ поставить еще один цикл внутри этого for цикла, который просто повторяет, пока игрок не делает правильный поворот:

for turn in range(4): 
    while True: 
     # your code, slightly modified 
     # do break only when the turn is valid 
     # do nothing, or continue, when the turn is invalid 

В то время как я на него, есть еще одна проблема в вашем коде.

Это if turn == 3 часть является неправильной или ненужной. Игра заканчивается, когда игрок находится вне очереди. Вы знаете, что игрок находится вне очереди, когда вы закончите цикл. Для этого вам не нужны дополнительные тесты. Итак:

for or while or whatever: 
    # stuff  
print "Game Over" 
Смежные вопросы