Python 3 - ошибка кортежа вне диапазона. Но я использую словарь? - PullRequest
0 голосов
/ 07 сентября 2018

Я получил Tuple вне зоны действия моей программы линкоров.Причина, по которой я запутался, заключается в том, что я не использую кортеж, если не ошибаюсь и не хочу исправляться.Кортежи не являются изменяемыми, и к словарю, на который он ссылается, добавляются элементы при запуске программы.Я новичок, поэтому, если я допустил глупую ошибку, пожалуйста, не судите!

from random import randint
#empty list to generate the board.
board = []
messages = {
  "win" : "Nooo you won!",
  "lose" : "Not my ship haha",
  "out" : "Oops, that's not even in the ocean.",
  "repeat" : "You guessed that one already"

}

ships = {
  'shiprows' : [0]
  'shipcols' : [0]
}

#generate board and append to board[] As of now it is a 10*10 grid.
for x in range(0, 10):
  board.append(["O"] * 10)

#prints the board every turn.
def print_board(board):
  for row in board:
    print(" ".join(row))

print_board(board)

#computer chooses where to put battleships' rows
def random_row1(board):
  return randint(0, len(board) - 1)

def random_col1(board):
 return randint(0, len(board) - 1)
#calling above two functions and storing their values for 5 ships.
#creating variables for 5 ships.
vars = 0
for vars in range(0, 5):
  print(vars)
  if len(ships.keys()) >= 4:
    while ships["shiprow{}".format(vars - 2)] == ships["shiprow{}".format(vars - 1)] and ships["shipcol{}".format(vars - 2)] == ships["shipcol{}".format(vars - 1)]:
      ships["shiprow{}".format(vars)] = random_row1(board)
      ships["shipcol{}".format(vars)] = random_col1(board)
    ships["shiprow{}".format(vars)] = random_row1(board)
    ships["shipcol{}".format(vars)] = random_col1(board)
  else:
    ships["shiprow{}".format(vars)] = random_row1(board)
    ships["shipcol{}".format(vars)] = random_col1(board)


#program itself
turn = 0
#enforces four turns before game over. Will possibly extend to unlimited with multiple ships.
print(ships)
for turn in range(20):
  turn = turn + 1
  print ("Turn {}".format(turn))
  print ("Ships Left: {}".format(int(len(ships.keys()) / 2))) 
  guess_row = int(input("Guess Row: "))
  guess_col = int(input("Guess Col: "))

#checking stuff.
  i = 0
  if guess_row == ships["shiprow{}".format(i = range(0, 10))] and guess_col == ships["shipcol{}".format(i)]:
    print (messages["win"])
    board[guess_col][guess_row] = u"#"
    print_board(board)

  elif board[guess_col][guess_row] == "X":
    print ("You guessed that one already.")
  elif guess_row not in range(len(board)) and guess_col not in range(len(board[0])):
    print(messages["out"])
  else:
    print(messages["lose"])
    board[guess_col][guess_row] = "X"
    print_board(board)
  if turn >= 20:
    print ("Game Over")
    board[ships["ship_col{}".format(range(0, 10))]][ships["ship_row{}".format(range(0, 10))]] = u"#"
    print_board(board)
    break

Подозреваемая линия - это линия 62 - эта кажется отрывочной, но я не знаю, как это сделать.,Посоветуйте пожалуйста что делать: Кстати вот ошибка:

Traceback (most recent call last):
  File "battleship3.py", line 62, in <module>
    if guess_row == ships["shiprow{}".format(i = range(0, 10))] and guess_col == ships["shipcol{}".format(i)]:
IndexError: tuple index out of range

Спасибо.

Ответы [ 2 ]

0 голосов
/ 07 сентября 2018

Начало:

Traceback (most recent call last):
File "shiptest.py", line 51, in <module>
ships['shiprows'][vars] += random_row1(board)
IndexError: list index out of range

От изменения всего после var = 0 до:

vars = 0
for vars in range(0, 5):
  print(vars)
  ships['shiprows'][vars] = random_row1(board)
  ships['shipcols'][vars] = random_col1(board)
  print(ships)

Я думаю, что я делаю список в словаре неправильно. Должен ли я использовать .append ()? РЕДАКТИРОВАТЬ: я использовал .append (), я был идиотом. Сейчас работает, спасибо за вашу помощь!

0 голосов
/ 07 сентября 2018

Это сообщение об ошибке появляется всякий раз, когда вы используете строку формата со спецификациями позиционных форматов (например, {} или {1}), но передаете только аргументы ключевого слова.

Аналогично, вы получаете KeyError, когда используете строку формата с только спецификациями формата ключевого слова (например, {v}), но передаете только позиционные аргументы:

>>> '{}'.format(i=1)
IndexError: tuple index out of range
>>> '{i}'.format(1)
KeyError: 'i'

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

>>> '{i}'.format(i=1)
1
>>> '{}'.format(1)
1

Несмотря на все сказанное, я не уверен, какой смысл в этом:

"shiprow{}".format(i = range(0, 10))

Вы можете исправить это в любом случае, но вам действительно нужна эта строка?

>>> "shiprow{i}".format(i = range(0, 10))
'shiprowrange(0, 10)'
>>> "shiprow{}".format(range(0, 10))
'shiprowrange(0, 10)'

Если вам интересно , почему вы получаете эту ошибку, немного упрощая format, она работает так:

def format(self, *args, **kwargs):
    result = ''
    index = 0
    bits = self.parse_format_stuff()
    for bit in bits:
        if bit is a regular string:
            result += bit
        elif bit is empty braces:
            result = args[index]
            index += 1
        elif bit is a number in braces:
            result += args[number]
        elif bit is a valid identifier string in braces:
            result += kwargs[identifier]
        else:
            raise a ValueError
    return result

Итак, когда он видит спецификации формата {}, он ищет args[0]. Поскольку вы не передали никаких позиционных аргументов, args - это пустой кортеж (), поэтому args[0] - это IndexError.

Возможно, будет лучше, если format обработает эти ошибки и превратит их во что-то более приятное, но иногда полезно иметь возможность обрабатывать KeyError программно. (Не так часто IndexError, но, очевидно, оба должны работать одинаково.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...