2014-12-08 2 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

당신은 우리가, 모든 코드를 읽어 그것을 실행하고 당신을 위해 그것을 테스트 하시겠습니까 : 여기

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) 

을 그 운동에서 내 전체 코드는? –

+1

[최소, 완전하며 검증 가능한 예] (http://stackoverflow.com/help/mcve)를 읽어보십시오. 이 모든 것을 본질적으로 제거하는 것은 매우 쉬울 것입니다. 예를 들어 [this pastebin] (http://pastebin.com/YTst1vC3)을 참조하십시오. 여러분이 전체 프로그램 대신에, 우리에게 당신의 질문을 던지면 -5 대신에 + 3으로 투표하게 될 것입니다. – abarnert

답변

1

코드에서 볼 수있는 것보다 약간의 오류가 있습니다. "Game Over"문자열을 포함하는 마지막 if 문은 잘못 들여 쓰기되어 있습니다. 이 한 블록 왼쪽으로 이동 :

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

인쇄 후 "중단"을 놓친 경우 "Game Over : –

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에 대한 변경 사항은 부적합합니다.


그래서 어떻게 수정합니까?

루프는 루프를 명시 적으로 turn을 유지하는 while 루프로 바꾸는 것입니다. 따라서 명시 적으로 감소 시키거나 더 좋게 증가시키지 않도록 할 수 있습니다. 예를 들어 :

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"