2015-08-29 5 views
0

Я получил эту ошибку, когда я пытаюсь запустить мою программу:Python. AttributeError: «ул» объект не имеет атрибута

C:\Users\Goldsmitd\chess\Scripts\python.exe C:/Users/Goldsmitd/PycharmProjects/CHESS/chess_ver0.07.py Traceback (most recent call last): File "C:/Users/Goldsmitd/PycharmProjects/CHESS/chess_ver0.07.py", line 138, in a.display() File "C:/Users/Goldsmitd/PycharmProjects/CHESS/chess_ver0.07.py", line 80, in display if self.board[i][j].sl=='R': AttributeError: 'str' object has no attribute 'sl'

Кто-то знает, что я делаю не так?

__author__ = 'Goldsmitd' 

class Rook: 
    def __init__(self,x,y,sl,team): 
     self.name = 'Rook' 
     self.x = x 
     self.y = y 
     self.sl = sl 
     self.team = team 


class Knight: 
    def __init__(self,x,y,sl,team): 
     self.name = 'Knight' 
     self.x = x 
     self.y = y 
     self.sl = sl 
     self.team = team 


class Bishop: 
    def __init__(self,x,y,sl,team): 
     self.name = 'Bishop' 
     self.x = x 
     self.y = y 
     self.sl = sl 
     self.team = team 


class Queen: 
    def __init__(self,x,y,sl,team): 
     self.name = 'Queen' 
     self.x = x 
     self.y = y 
     self.sl = sl 
     self.team = team 


class King: 
    def __init__(self,x,y,sl,team): 
     self.name = 'King' 
     self.x = x 
     self.y = y 
     self.sl = sl 
     self.team = team 


class Pawn: 
    def __init__(self,x,y,sl,team): 
     self.name = 'Pawn' 
     self.x = x 
     self.y = y 
     self.sl = sl 
     self.team = team 


class Chess_Board: 
    def __init__(self): 
     self.board = [['.']*8 for _ in range(8)] 
     self.board[7][0] = Rook(x=7,y=0,sl='R',team='white') 
     self.board[7][1] = Knight(x=7,y=1,sl='N',team='white') 
     self.board[7][2] = Bishop(x=7,y=2,sl='B',team='white') 
     self.board[7][3] = Queen(x=7,y=3,sl='Q',team='white') 
     self.board[7][4] = King(x=7,y=4,sl='K',team='white') 
     self.board[7][5] = Bishop(x=7,y=5,sl='B',team='white') 
     self.board[7][6] = Knight(x=7,y=6,sl='N',team='white') 
     self.board[7][7] = Rook(x=7,y=7,sl='R',team='white') 
     self.board[6][0] = Pawn(x=6,y=0,sl='P',team='white') 
     self.board[6][0] = Pawn(x=6,y=1,sl='P',team='white') 
     self.board[6][0] = Pawn(x=6,y=2,sl='P',team='white') 
     self.board[6][0] = Pawn(x=6,y=3,sl='P',team='white') 
     self.board[6][0] = Pawn(x=6,y=4,sl='P',team='white') 
     self.board[6][0] = Pawn(x=6,y=5,sl='P',team='white') 
     self.board[6][0] = Pawn(x=6,y=6,sl='P',team='white') 
     self.board[6][0] = Pawn(x=6,y=7,sl='P',team='white') 

    def display(self): 
     for i in range(8): 
      for j in range(8): 
       if self.board[i][j].sl=='R': 
        print('R',end=' ') 
       elif self.board[i][j].sl=='N': 
        print('N',end=' ') 
       elif self.board[i][j].sl=='B': 
        print('B',end=' ') 
       elif self.board[i][j].sl=='Q': 
        print('Q',end=' ') 
       elif self.board[i][j].sl=='K': 
        print('K',end=' ') 
       elif self.board[i][j].sl=='P': 
        print('P',end=' ') 
       else: 
        print(self.board[i][j],end=' ') 
      print() 

    def figure_choice(self): 
     while True: 
      try: 
       print('please give a position of figure which you chose') 
       sx=int(input()) 
       sy=int(input()) 
       return sx,sy 
      except: 
       print('ERROR. Your choice is valid. Please choose only integers') 

    def move_king(self): 

     while True: 
      try: 
       print('please give a position of figure which you chose') 
       sx=int(input()) 
       sy=int(input()) 
       return sx,sy 
      except: 
       print('ERROR. Your choice is valid. Please choose only integers') 
      try: 
       print('please give a position of king') 
       sx=int(input()) 
       sy=int(input()) 
      except: 
       print('ERROR. Your choice is valid. Please choose only integers') 
      try: 
       print('please choose a destination for king') 
       dx=int(input()) 
       dy=int(input()) 
      except: 
       print('ERROR. Your choice is valid. Please choose only integers') 
      if self.board[dx][dy] == '.' : 
        if (abs(sx-dx) <2 and abs(sx-dy) < 2): 
         self.board[dx][dy]=King(x=dx,y=dy,sl='K',team='white') 
         self.board[sx][sy] = '.' 
         return self.board 
         break 


a=Chess_Board() 

a.display() 
print(a.board[7][0].sl) 

ответ

2

С

self.board = [['.']*8 for _ in range(8)] 

для некоторых значений i и j, self.board[i][j] является строкой. Поэтому

self.board[i][j].sl=='R' 

поднимает AttributeError: 'str' object has no attribute 'sl', потому что строки не имеют sl атрибут.


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

Обратите внимание, что не ясно (мне), что вам действительно нужны отдельные классы для каждого вида шахматной фигуры. Все они в основном одинаковы вид объекта, они просто отличаются с точки зрения того, как они перемещаются. Таким образом, вы можете быть лучше с один шахматный кусок класса и дать каждому экземпляру атрибут kind который может равняться 'rook', 'knight' и т.д.

отметить также, что в вашем коде есть избыточная информация: self.board записывает расположение частей, а шахматная фигура также записывает местоположение:

self.board[7][0] = Rook(x=7,y=0,sl='R',team='white') 

запись информации в двух местах создает проблему:

  • Информация может быть повреждена - если логика вашего кода неверна, плата может записывать местоположение части в другом месте, чем там, где сам кусок считает, что он находится на доске. Таким образом, у вас есть проблема координации.

  • Наличие информации в двух местах делает ваш код более сложным, потому что вам необходимо обновить местоположение как на доске, так и на шахматной фигуре, чтобы поддерживать согласованность при каждом перемещении части.

+0

Хорошо, я знаю, что мне делать. Мне нужно создать доску, в которой все элементы являются экземплярами классов. Таким образом, пустые квадраты без рисунков также должны быть классом. – Rafail

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