2014-01-29 4 views
5

Итак, я только что закончил раздел этой проблемы и представил правильный ответ, но мне трудно понять, почему это правильно.CodeAcademy Battleship

Идея состоит в том, чтобы построить сетку 5x5 в виде доски, заполненной «O». Правильный код я использовал:

board = [] 
board_size=5 

for i in range(board_size): 

    board.append(["O"] *5) 

Однако я запутался, почему это не создает 25 «Выходы» в одном ряду, как я никогда не указывал на итерацию в отдельную строку. Я пробовал

for i in range(board_size): 

    board[i].append(["O"] *5) 

но это дало мне ошибку: IndexError: индекс индекса вне диапазона. Может ли кто-нибудь объяснить, почему первый из них правильный, а не второй?

Спасибо!

ответ

6
["O"]*5 

Это создает список размером 5, заполненный "O": ["O", "O", "O", "O", "O"]

board.append(["O"] *5) 

Это присоединяет (добавляет в конец списка) выше список на борт []. Выполнение этого 5 раз в цикле создает список, заполненный 5 из приведенных выше списков.

[["O", "O", "O", "O", "O"], 
["O", "O", "O", "O", "O"], 
["O", "O", "O", "O", "O"], 
["O", "O", "O", "O", "O"], 
["O", "O", "O", "O", "O"]] 

Ваш код не работает, потому что списки не инициализируется с размером в питона, он просто начинает как пустой контейнер []. Для того, чтобы ваша работа, вы могли бы сделать:

board = [[],[],[],[],[]] 

и в цикле:

board[i] = ["O"]*5 
0

Я думаю, что проблема проста: при запуске кода, ваш массив пуст!

Вы можете оформить

board = [[], [], [], [], []] 

инициализировать его в качестве вложенного, пяти мест массива.

Вы также можете использовать Dict для имитации неопределенно вложенную массива:

board=defaultdict(lambda:defaultdict(lambda:[])) 
0

Это происходит потому, что каждый раз, когда вы запускаете board.append(["O"] *5) создать новый список (из квадратных скобок, используемых в отчете дописывания).

Если бы вы использовали board.append("O" *5) вместо этого вы получите один список с пятью элементами, такими как:

['OOOOO', 'OOOOO', 'OOOOO', 'OOOOO', 'OOOOO']

Символ * 5 умножает строку. если вы просто работать с интерактивной быстрой 'O' * 5 вы получите:

'OOOOO'

Однако, если вы запустите ['O'] * 5 умножает текст в списке, и вы получите список с пятью элементами.

['O', 'O', 'O', 'O', 'O']

Вы добавили пять списков, каждый из которых имеет 5 элементов.

2

списки Python начинаются пустым:

board = [] # empty list 

В отличие от некоторых языков программирования, вы не указали или инициализацию границы массива, так что если вы пытаетесь получить доступ по индексу:

board[0] 

вы получите IndexError; еще нет индекса 0.

В первом варианте, на каждую поездку через петлю for, вы append (добавить в конец списка) в новый список, содержащий пять"O" с. Если вы хотите, чтобы board список содержит 25 "O" с, вы должны использовать вместо extend:

for i in range(board_size): 
    board.extend(["O"] *5) 
0
board = [] 
board_size=5 

for i in range(board_size): 

    board.append(["O"] *5) 

В этом коде board начинается как пустой список. ["O"] * 5 создаст список, равный ["O", "O", "O", "O", "O"]. Затем он будет добавлен в список board. Это произойдет 5 раз в этом примере с board_size == 5.

for i in range(board_size): 

    board[i].append(["O"] *5) 

Это не будет работать, если элемент с индексом i был список, так как append() является метод list класса. Если вы хотите, чтобы вставить что-то в i вы бы использовать метод списка insert()

0

Первый шаг в codeacademy

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

print board 

Второй шаг в codeacademy

board = [] 

def print_board(board): 
    for x in range(5): 
     board= (["O"] * 5) 
     print board 
    return board 

print_board(board) 

третий шаг в codeacademy

board = [] 

def print_board(board): 
    for x in range(5): 
     board= (["O"] * 5) 
     print " ".join(board) 
    return board 

print_board(board) 

4-й этап

from random import randint 

board = [] 

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

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

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

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

print print_board(board) 
print random_row(board) 
print random_col(board) 

5-ый этап buttleship на codeacademy

from random import randint 

board = [] 

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

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

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) 


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

Заключительный шаг Позволяет .. играть в игру BettleShip CodeAcademy

from random import randint 

доска = [] для х в диапазоне (5): board.append (["O"] * 5)

def print_board (board): fo r ряд в доске: печать "" .join (ряд)

печать «Давайте играть в линкор!" print_board (доска)

Защиту random_row (доска): возвращение randint (0, длина (доска) - 1)

Защиту random_col (доска): возвращение randint (0, длина (доска [0 ]) - 1)

ship_row = random_row (доска) ship_col = random_col (доска) печати ship_row печати ship_col

получается = 0 выигрыш = 0 для поворота в диапазон (4): если поворот < = 5: guess_row = INT (raw_input ("Угадай Row:")) guess_col = INT (raw_input ("Угадай Col:"))

if guess_row == ship_row and guess_col == ship_col: 
     print "Congratulations! You sunk my battleship!" 
     win +=1 
     if win == 2: 
      break 
    else: 
     turns +=1 
     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 (turn + 1) 
     print_board(board) 
elif turns == 3: 
    print "Game Over" 
else: 
    print "Max Turn try is over Try Again" 
1

код должен выглядеть как это. board = [] for i in range(0, 5): board.append(["O"]*5) print(board)