Форум сайта python.su
Здравия всем и мира!
Есть алгоритм расчета очередности хода как в Heroes III. Алгоритм прекрасно работает, но мне не нравиться цикл в этой программе, так как в дальнейшем, например при накладывании заклинания “скорость”, мне придется сортировать список вновь, список будет уменьшаться по мере ходов юнитов игрока и с циклом это как-то не вяжется. Подкиньте идею. Знаю, вы можете направить в нужное русло даже такого вредного программиста как я. Спасибо!
# если a[0] выше всех, то юнит ходит раньше всех независимо от очередности # хода героя # чем выше a[1] тем раньше ходит герой # чем выше a[2] тем раньше ходит его юнит # юниты нападающего героя [скорость,очередность героя, очередность юнита] a = [6,1,2] b = [7,1,1] c = [6,1,0] # юниты защищающегося героя d = [6,0,2] e = [7,0,1] f = [8,0,0] mas = [a,b,c,d,e,f] mas.sort(reverse = True) print(mas) for i in mas: if i[1] == 0: hero = "second" elif i[1] == 1: hero = "first" if i[2] == 0: unit = "third" elif i[2] == 1: unit = "second" elif i[2] == 2: unit = "first" print("walks ",hero," hero ",unit," unit ",i[0]," speed")
Отредактировано m1r42 (Ноя. 7, 2022 10:28:52)
Офлайн
Все, тема закрыта, оказалось все просто. Не надо избавляться от for, надо его просто модернизировать:
for i in range(0,len(mas)): i = 0 if mas[i][1] == 0: hero = "second" elif mas[i][1] == 1: hero = "first" if mas[i][2] == 0: unit = "third" elif mas[i][2] == 1: unit = "second" elif mas[i][2] == 2: unit = "first" print("walks ",hero," hero ",unit," unit ",mas[i][0]," speed") mas.pop(0)
Отредактировано m1r42 (Ноя. 7, 2022 10:24:46)
Офлайн
Если кому интересно, то вот набросок работы магии скорости в цикле for, пока только для теста:
# юниты нападающего героя [скорость,очередность героя, очередность юнита] a = [6,1,2] b = [7,1,1] c = [6,1,0] # юниты защищающегося героя d = [6,0,2] e = [7,0,1] f = [8,0,0] mas = [a,b,c,d,e,f] print(mas) def steps(): for i in range(0,len(mas)): i = 0 magic_speed = input("заклинание скорость на юнита -->") if magic_speed != "": # добавляем скорости mas[int(magic_speed)-1][0] += 20 break if mas[i][1] == 0: hero = "second" elif mas[i][1] == 1: hero = "first" if mas[i][2] == 0: unit = "third" elif mas[i][2] == 1: unit = "second" elif mas[i][2] == 2: unit = "first" print("walks ",hero," hero ",unit," unit ",mas[i][0]," speed") mas.pop(0) while True: step = input() if step == "0": break mas.sort(reverse = True) print(mas) steps()
Отредактировано m1r42 (Ноя. 7, 2022 10:31:37)
Офлайн
ну так … фантазии …
0. сортировка по своим правилам
a = [1, '8', 9, 3, '7'] def always_num(val): return int(val) print(sorted(a, key=always_num))
[1, 3, '7', '8', 9]
Отредактировано AD0DE412 (Ноя. 7, 2022 19:17:41)
Офлайн
m1r42
Но если есть еще варианты более красивого кода, готов выслушать.def steps(): for i in range(0,len(mas)): i = 0 magic_speed = input("заклинание скорость на юнита -->") if magic_speed != "": # добавляем скорости mas[int(magic_speed)-1][0] += 20 break if mas[i][1] == 0: hero = "second" elif mas[i][1] == 1: hero = "first" if mas[i][2] == 0: unit = "third" elif mas[i][2] == 1: unit = "second" elif mas[i][2] == 2: unit = "first" print("walks ",hero," hero ",unit," unit ",mas[i][0]," speed") mas.pop(0)
def steps(): for i in range(len(mas)): i = 0 magic_speed = input("заклинание скорость на юнита -->") if magic_speed != "": # добавляем скорости mas[int(magic_speed)-1][0] += 20 break order1 = mas[i][1] order2 = mas[i][2] if order1 == 0: hero = "second" elif order1 == 1: hero = "first" if order2 == 0: unit = "third" elif order2 == 1: unit = "second" elif order2 == 2: unit = "first" print("walks ",hero," hero ",unit," unit ",mas[i][0]," speed") mas.pop(0)
Отредактировано py.user.next (Ноя. 7, 2022 21:14:09)
Офлайн
py.user.nextВы прямо маг какой-то. Мысли читаете? Именно это меня и напрягало в некрасивой структуре операторов if. Я понял, что неправильно дал название темы. Действительно надо именовать и код становится более удобным и читаемым. Спасибо. Плюсик жмакнул.
Когда работаешь с какими-то сущностями, давай им ясные имена и работай с ними через эти ясные имена. Не надо помнить, что эти сущности хранятся в каком-то там массиве, и работать с ними через этот массив. Это всё затрудняет свободное мышление. Чем свободнее у тебя мышление, когда ты читаешь и перечитываешь код, тем больше ты замечаешь в коде каких-то других нюансов.
Офлайн
AD0DE412Не, с сортировкой у меня все гуд. Сортируется на отлично. Игра Heroes III в моем исполнении. Пишу сугубо для изучения Python и изучения игры, так как фанат. Сортировка в игре зависит от статуса героя (нападающий/обороняющийся), порядка построения армии героя, скорости отдельного юнита. Сортирую через массив или список, как принято в Python.
ну так … фантазии …
0. сортировка по своим правилам
1. клас который при дабовленни изменении юнита ставит его на нужное место очереди
2. поискать подходящию структуру данных (по факту это 1 номер)
зы а шо за игра то
юнит a = [скорость юнита][статус героя][порядок построения армии] и т.д. для всех юнитов
армия mas = [a,b,c,d,e,f]
Отредактировано m1r42 (Ноя. 8, 2022 08:37:14)
Офлайн
ясно хм олдово
за сортировку не нужен был for
вот и немного креатива чем заменить
там еще можно итертулз, генераторы, вышие финкции .. в общем дофига чего
Отредактировано AD0DE412 (Ноя. 8, 2022 13:19:41)
Офлайн