«IndexError: список индексов назначения вне диапазона» в python - PullRequest
0 голосов
/ 07 февраля 2020

Я пытаюсь сделать линкор (в Германии это называется корабли-утопители). У меня есть проблема, которая описана в названии. Больше нечего сказать, но мне нужно что-то написать, чтобы я мог опубликовать это. Может кто-нибудь, пожалуйста, помогите мне, я не вижу проблемы

from random import randint

class Spiel():

    def __init__(self):
        self.feld = [[],[],[],[],[],[],[],[],[],[]]
        for i in range(0,10):
            for e in range(0, 10):
                self.feld[i].append(0)
    def place(self):
        boats = [5,4,4,3,3,3,2,2,2,2]
        for e in boats:
            while True:
                ausrichtung = randint(0,1)
                if ausrichtung==0: ##Horizontal
                    z1 = randint(0, 9-e)
                    z2=randint(0,9)
                    abschnitt = self.feld[z2][z1:(z1+e)]
                    if  not(1 in abschnitt) and  not(2 in abschnitt) :
                        schiff=[]
                        for i in range(0,e-2):
                            schiff.append(1)
                        self.feld[z2][z1:(z1+e)]=[2,*schiff,2]
                        break
                elif ausrichtung==1: ##Vertikal
                    z1 = randint(0, 9)
                    z2=randint(0,(9-e))
                    z3 = z2
                    lp=0
                    for m in range(0, e):
                        if self.feld[z2][z1] ==1 or self.feld[z2][z1]==2:
                            lp +=1
                        z2 += 1
                    if lp <1:

                        schiff=[]
                        for i in range(0,e-2):
                            schiff.append(1)
                        self.feld[z3:(z3+e)][z1]=[2,*schiff,2] # PROBLEM HERE
                        break
        print(self.feld[0:1])
        print(self.feld[1:2])
        print(self.feld[2:3])
        print(self.feld[3:4])
        print(self.feld[4:5])
        print(self.feld[5:6])
        print(self.feld[6:7])
        print(self.feld[7:8])
        print(self.feld[8:9])
        print(self.feld[9:10])


spiel = Spiel()
spiel.place()

Ошибка:

Traceback (most recent call last):
  File "test.py", line 56, in <module>
    spiel.place()
  File "test.py", line 40, in place
    self.feld[z3 : (z3 + e)][z1] = [2, *schiff, 2]
IndexError: list assignment index out of range

1 Ответ

2 голосов
/ 07 февраля 2020

Добавление следующего оператора печати перед строкой, в которой разрывается ваш код, показывает следующее:

print(len(self.feld), z3, (z3 + e), len(self.feld[z3 : (z3 + e)]), z1)
self.feld[z3 : (z3 + e)][z1] = [2, *schiff, 2]
10 1 6 5 1
10 2 5 3 8
Traceback (most recent call last): ...

Кажется, что z1 равно 8, но self.feld[z3 : (z3 + e)] имеет длину 3. Ваша проблема в том, как [z1] индексирует. Возможно следующая строка:

z1 = randint(0, 9)

Является виновником. :)

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