Найти - Пользователи
Полная версия: Предложите пожалуйста варианты. Как избавиться от цикла for в программе, но результат получить тот же?
Начало » Python для новичков » Предложите пожалуйста варианты. Как избавиться от цикла for в программе, но результат получить тот же?
1
m1r42
Здравия всем и мира!
Есть алгоритм расчета очередности хода как в 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
Все, тема закрыта, оказалось все просто. Не надо избавляться от 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
Если кому интересно, то вот набросок работы магии скорости в цикле 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()
AD0DE412
ну так … фантазии …
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]

1. клас который при дабовленни изменении юнита ставит его на нужное место очереди
2. поискать подходящию структуру данных (по факту это 1 номер)

зы а шо за игра то
py.user.next
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)

Когда работаешь с какими-то сущностями, давай им ясные имена и работай с ними через эти ясные имена. Не надо помнить, что эти сущности хранятся в каком-то там массиве, и работать с ними через этот массив. Это всё затрудняет свободное мышление. Чем свободнее у тебя мышление, когда ты читаешь и перечитываешь код, тем больше ты замечаешь в коде каких-то других нюансов.

В данном примере я дал имена order1 и order2, что дало возможность в if'ах быстро видеть, где и что проверяется. При этом не нужно думать, в ту ли ячейку массива я заглядываю во время проверки, потому что правильные ячейки зафиксированы в этих именах. Благодаря этому if'ы стали быстрее читаться и в них стало хорошо видно, что никаких ошибок не допущено.
  
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)
m1r42
py.user.next
Когда работаешь с какими-то сущностями, давай им ясные имена и работай с ними через эти ясные имена. Не надо помнить, что эти сущности хранятся в каком-то там массиве, и работать с ними через этот массив. Это всё затрудняет свободное мышление. Чем свободнее у тебя мышление, когда ты читаешь и перечитываешь код, тем больше ты замечаешь в коде каких-то других нюансов.
Вы прямо маг какой-то. Мысли читаете? Именно это меня и напрягало в некрасивой структуре операторов if. Я понял, что неправильно дал название темы. Действительно надо именовать и код становится более удобным и читаемым. Спасибо. Плюсик жмакнул.
m1r42
AD0DE412
ну так … фантазии …
0. сортировка по своим правилам
1. клас который при дабовленни изменении юнита ставит его на нужное место очереди
2. поискать подходящию структуру данных (по факту это 1 номер)
зы а шо за игра то
Не, с сортировкой у меня все гуд. Сортируется на отлично. Игра Heroes III в моем исполнении. Пишу сугубо для изучения Python и изучения игры, так как фанат. Сортировка в игре зависит от статуса героя (нападающий/обороняющийся), порядка построения армии героя, скорости отдельного юнита. Сортирую через массив или список, как принято в Python.
юнит a = [скорость юнита][статус героя][порядок построения армии] и т.д. для всех юнитов
Затем все это пакуется еще в один список:
армия mas = [a,b,c,d,e,f]
И сортируется как надо. Сортировка нарушается при изменении скорости юнита магией, поэтому после магии все пересортировывается.
AD0DE412
ясно хм олдово
за сортировку не нужен был for
вот и немного креатива чем заменить

там еще можно итертулз, генераторы, вышие финкции .. в общем дофига чего
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB