Значение в словаре меняется , но изменений на поле не происходит
Пишу простую игру на 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)