Значение в словаре меняется , но изменений на поле не происходит

Пишу простую игру на Python , в которой игрок может передвигаться по полю из клеток . Размеры поля могут задаваться самые разные . Вот сама программа :

EMPTY = " "

class Field (object) : 
    """Игровое поле""" 

    cells = {} # словарь для клеток : получает два значения (x и y) и возвращает значение клетки

    def __init__ (self,height,width) : 
        self.height = height 
        self.width = width 

        for line in range (self.height) : # заполнение поля пустыми клетками
            for cell in range (self.width) : 
                self.cells[line,cell] = EMPTY 

    def print_field(self) : 
        """Вывод поля на экран"""
        print ("-"*(self.width+2)) 
        for line in range(self.height) : 
            print ("|",end= "")
            for cell in range (self.width) :
                print (self.cells[line,cell],end = "")
            print ("|")
        print ("-"*(self.width+2))

    def get_player (self,old_coordinates,new_coordinates,name) : 
        """Переход игрока на другую клетку"""
        self.cells[old_coordinates] = EMPTY 
        self.cells[new_coordinates] = name

class Player (object) : 
    """Игрок""" 

    def __init__ (self,x,y,name,field) : 
        self.x = x 
        self.y = y 
        self.name = name
        coordinates = self.x,self.y
        field.get_player(coordinates,coordinates,self.name)

    def correct (self,field) : # если координаты в пределах поля , возвращает правду
        if self.x in range(field.height) and self.y in range(field.width) : 
            return True 
        else : 
            return False

    def move (self,direction,field) : 
        """Ход игрока"""
        copy = self.x,self.y
        if direction == "ВХ" : # неправильно
            self.x =- 1
        elif direction == "ВН" :# правильно
            self.x += 1
        elif direction == "ВЛ" : # неправильно
            self.y =- 1
        elif direction == "ВП" : # правильно
            self.y =+ 1
        elif direction == "end" : 
            print ("Работа программы завершена .")
            return
        else :
            print ("Неизвестная операция !")
            return

        if not self.correct(field) : 
            self.x,self.y = copy
            print ("Неправильно !")
        else :
            field.get_player(copy,(self.x,self.y),self.name)
            print ("Правильно !")

def welcome () :
    print ("Добро пожаловать !\n")
    print ("В этой простой игре вы можете передвигать своего персонажа по карте .")
    print ("Для выхода введите end .")

def main (map,person) : 
    """Запуск игры"""
    welcome()

    map.print_field()
    direction = input ("В какую сторону будете ходить (ВХ/ВН/ВЛ/ВП)?")
    person.move(direction,map)
    while direction != "end" :
        map.print_field()
        direction = input ("В какую сторону будете ходить (ВХ/ВН/ВЛ/ВП)?")
        person.move(direction,map)

    input ("Нажмите Enter , чтобы выйти ...")

map = Field(10,10)
person = Player(1,1,"X",map)

main(map,person)

При попытке запуска начинают твориться безумные вещи : крестик на экране отказывается двигаться влево и вверх ( на экран выводиться 'Неправильно !') , но реальности двигается только вниз . Хотя при попытке движения вправо выводиться 'Успешно !' , крестик никуда не движется . Как я догадываюсь , ошибка возникает ещё при заполнении поля клетками , но найти я эту ошибку не могу .


Ответы (1 шт):

Автор решения: CrazyElf

У вас вместо x += 1 просто местами написано x =+ 1, т.е. x = 1 фактически. Я исправил:

EMPTY = " "

class Field (object) : 
    """Игровое поле""" 

    cells = {} # словарь для клеток : получает два значения (x и y) и возвращает значение клетки

    def __init__ (self,height,width) : 
        self.height = height 
        self.width = width 

        for line in range (self.height) : # заполнение поля пустыми клетками
            for cell in range (self.width) : 
                self.cells[line,cell] = EMPTY 

    def print_field(self) : 
        """Вывод поля на экран"""
        print ("-"*(self.width+2)) 
        for line in range(self.height) : 
            print ("|",end= "")
            for cell in range (self.width) :
                print (self.cells[line,cell],end = "")
            print ("|")
        print ("-"*(self.width+2))

    def get_player (self,old_coordinates,new_coordinates,name) : 
        """Переход игрока на другую клетку"""
        self.cells[old_coordinates] = EMPTY 
        self.cells[new_coordinates] = name

class Player (object) : 
    """Игрок""" 

    def __init__ (self,x,y,name,field) : 
        self.x = x 
        self.y = y 
        self.name = name
        coordinates = self.x,self.y
        field.get_player(coordinates,coordinates,self.name)

    def correct (self,field) : # если координаты в пределах поля , возвращает правду
        if self.x in range(field.height) and self.y in range(field.width) : 
            return True 
        else : 
            return False

    def move (self,direction,field) : 
        """Ход игрока"""
        copy = self.x,self.y
        if direction == "ВХ" : # ИСПРАВИЛ
            self.x -= 1
        elif direction == "ВН" :# правильно
            self.x += 1
        elif direction == "ВЛ" : # ИСПРАВИЛ
            self.y -= 1
        elif direction == "ВП" : # ИСПРАВИЛ
            self.y += 1
        elif direction == "end" : 
            print ("Работа программы завершена .")
            return
        else :
            print ("Неизвестная операция !")
            return

        if not self.correct(field) : 
            self.x,self.y = copy
            print ("Неправильно !")
        else :
            field.get_player(copy,(self.x,self.y),self.name)
            print ("Правильно !")

def welcome () :
    print ("Добро пожаловать !\n")
    print ("В этой простой игре вы можете передвигать своего персонажа по карте .")
    print ("Для выхода введите end .")

def main (map,person) : 
    """Запуск игры"""
    welcome()

    map.print_field()
    direction = input ("В какую сторону будете ходить (ВХ/ВН/ВЛ/ВП)?")
    person.move(direction,map)
    while direction != "end" :
        map.print_field()
        direction = input ("В какую сторону будете ходить (ВХ/ВН/ВЛ/ВП)?")
        person.move(direction,map)

    input ("Нажмите Enter , чтобы выйти ...")

map = Field(10,10)
person = Player(1,1,"X",map)

main(map,person)
→ Ссылка