2015-10-23 2 views
1

Для школьного проекта я должен сделать игру «Броненосец». В игре у игрока 4 корабля, и игра заканчивается, если все корабли одного игрока уничтожены. Я пытаюсь заставить эту функцию работать.Линейный корабль в Python

Это код:

board = [] 
for x in range(10): 
    board.append(["O"] * 10) 
def print_board(board): 
    for row in board: 
     print " ".join(row) 
print "Let's play Battleship!" 
print_board(board) 
def Input_row1(board): 
    return int(raw_input("In what row do you want to place your first ship?")) 
def Input_col1(board): 
    return int(raw_input("In what col do you want to place your first ship?")) 
def Input_row2(board): 
    return int(raw_input("In what row do you want to place your second ship?")) 
def Input_col2(board): 
    return int(raw_input("In what col do you want to place your second ship?")) 
def Input_row3(board): 
    return int(raw_input("In what row do you want to place your third ship?")) 
def Input_col3(board): 
    return int(raw_input("In what col do you want to place your third ship?")) 
def Input_row4(board): 
    return int(raw_input("In what row do you want to place your fourth ship?")) 
def Input_col4(board): 
    return int(raw_input("In what col do you want to place your fourth ship?")) 
ship_row1 = Input_row1(board) 
ship_col1 = Input_col1(board) 
ship_row2 = Input_row2(board) 
ship_col2 = Input_col2(board) 
ship_row3 = Input_row3(board) 
ship_col3 = Input_col3(board) 
ship_row4 = Input_row4(board) 
ship_col4 = Input_col4(board) 
for turn in range(9): 
    guess_row = int(raw_input("Guess Row:")) 
    guess_col = int(raw_input("Guess Col:")) 
    if guess_row == ship_row1 and guess_col == ship_col1 or guess_row == ship_row2 and guess_col == ship_col2 or guess_row == ship_row3 and guess_col == ship_col3 or guess_row == ship_row4 and guess_col == ship_col4: 
     print "Congratulations! You sunk my battleship!" 
     if True: 
      total_ships = 4 
      total_ships = total_ships - 1 
      print total_ships 
      if total_ships == 0: 
       print "You destroyed all hostile ships!" 
    else: 
     if (guess_row < 0 or guess_row > 9) or (guess_col < 0 or guess_col > 9): 
      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!" 
      if turn == 9: 
       print "GAME OVER" 
       if turn == 9: 
        print "Game Over" 
     board[guess_row][guess_col] = "X" 
    print "Turn", turn + 1 
    print_board(board) 

Проблема заключается в том, что после того, как второй корабль был поражен, тем total_ships остается 3, и не повернется 2. Почему это работает неправильно?

+0

в функциях вам не нужен параметр платы – efirvida

+2

положить 'total_ships = 4' вне контура – efirvida

+0

K Thijssen: Помните, что если ответ решить вашу проблему, вы должны«Принять», что ответ! –

ответ

2

Это ваша проблема:

total_ships = 4 
total_ships = total_ships - 1 

Вы сбрасываете total_ships каждый раз. Выше эквивалентно:

total_ships = 3 

Вы должны иметь инициализацию вашего total_ships быть вне своей очереди для цикла. В этом случае лучшее, что вы можете сделать, это создать функцию, которая представляет собой ваш игровой цикл и функцию, которая обрабатывает определенные повороты, поэтому у вас есть не один длинный файл кода.

2

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

  • для основного вопроса, а ответил Натаниэль Форд, проблема в том, что вы сбросьте total_ships до 4, прежде чем уменьшать его каждый раз, когда корабль попадает. Инициализируйте его только один раз в начале программы, а не в петле поворотов.

  • В том же цикле, есть линия

    if True: 
    

    Я не знаю, что вы имели в виду, что, но это, вероятно, не делать то, что вы хотите, чтобы это сделать. Это абсолютно бесполезно, так как блок внутри ifвсегда выполнен (так что вы можете также удалить if или, скорее всего, переписать тест, чтобы он сделал то, что имел в виду).

  • В начале вы объявляете массив 10x10 с именем board, но вы его никогда не используете. Если вы создадите доску (что кажется хорошей идеей), вы не должны хранить позиции каждого линейного корабля в отдельных переменных (ship_row1, ship_col1 и т. Д.). Вместо этого, когда пользователь выбирает позицию (i, j) судна, вы должны установить ячейку board[i][j] на номер 1, чтобы указать, что там есть корабль, и полностью избавиться от переменных и ship_row. Таким образом, выбор позиций для всех кораблей осуществляется одинаково в цикле, который запрашивает x и y (строка и столбец) и изменяет соответствующую ячейку на доске (представьте, что вы разместите 20 кораблей с кодом, который вы написали, что было бы много копирования/вставки ...). Это также сделало бы проще, чтобы проверить, что пользователь не помещает два судна в том же месте (в текущей реализации, при размещении 4-го корабля, вы должны добавить длинный чек, чтобы увидеть, если

    ship_col4 == ship_col1 and ship_row4 == ship_row1 
    or ship_col4 == ship_col2 and ship_row4 == ship_row2 
    or ship_col4 == ship_col3 and ship_row4 == ship_row3 
    

    , которые могли бы просто замените его, проверив, является ли ячейка на плате уже 1.

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