pythonpython-3.xtext-based

How can I set a system like a turn order with 6 ints?


I'm trying to set a turn order on a text-based game but I don't know how to set it up correctly.

I've tried to set it this way, I know it's all wrong but it's just to give an example that what I'm expecting.

#EXAMPLES RESULTS
WarriorTurnOrder = 23
PriestTurnOrder = 15
vampire1TurnOrder = 20
vampire2TurnOrder = 5
vampire3TurnOrder = 10
vampire4TurnOrder = 2

def first_turn():
        if (WarriorTurnOrder > vampire1TurnOrder) and (WarriorTurnOrder > vampire2TurnOrder) and (WarriorTurnOrder > vampire3TurnOrder)  and (WarriorTurnOrder > vampire4TurnOrder) and (WarriorTurnOrder > PriestTurnOrder) : #Warrior goes first
            warrior_turn() #Starts warrior turn
        elif (PriestTurnOrder > vampire1TurnOrder) and (PriestTurnOrder > vampire2TurnOrder) and (PriestTurnOrder > vampire3TurnOrder) and (PriestTurnOrder > vampire4TurnOrder) and (PriestTurnOrder > WarriorTurnOrder): #Priest goes first
            priest_turn() #Starts priest turn
        elif (vampire1TurnOrder > WarriorTurnOrder) and (vampire1TurnOrder > vampire2TurnOrder) and (vampire1TurnOrder > vampire3TurnOrder) and (vampire1TurnOrder > vampire4TurnOrder) and (vampire1TurnOrder > PriestTurnOrder): #Enemy 1 goes first
            enemy_turn() #Starts vampire1 turn
        elif (vampire2TurnOrder > vampire1TurnOrder) and (vampire2TurnOrder > vampire3TurnOrder) and (vampire2TurnOrder > vampire4TurnOrder) and (vampire2TurnOrder > WarriorTurnOrder) and (vampire2TurnOrder > PriestTurnOrder): #Enemy 2 goes first
            enemy_turn() #Starts vampire2 turn
        elif (vampire3TurnOrder > vampire1TurnOrder) and (vampire3TurnOrder > vampire2TurnOrder) and (vampire3TurnOrder > vampire4TurnOrder) and (vampire3TurnOrder > WarriorTurnOrder) and (vampire3TurnOrder > PriestTurnOrder): #Enemy 3 goes first
            enemy_turn() #Starts vampire3 turn
        elif (vampire4TurnOrder > vampire1TurnOrder) and (vampire4TurnOrder > vampire2TurnOrder) and (vampire4TurnOrder > vampire3TurnOrder) and (vampire4TurnOrder > WarriorTurnOrder) and (vampire4TurnOrder > PriestTurnOrder): #Enemy 4 goes first
            enemy_turn() #Starts vampire3 turn
first_turn()

Solution

  • A way of doing it while more or less sticking to your code structure would be as follows:

    # Contains information about the players/enemies, their order, and the function to call when it's their turn
    turn_orders = {
        "warrior": {"order": 23, "turn_func":warrior_turn},
        "priest": {"order": 15, "turn_func":priest_turn},
        "vampire1": {"order": 20, "turn_func":enemy_turn},
    }
    

    We can then use python's sorting functions as follows: sorted(turn_orders, key=lambda x:turn_orders[x]["order"]) to get the name of the entities, sorted from lowest to highest turn order.

    Putting it all together:

    def first_turn(turn_orders):
        for entity_name in sorted(turn_orders, key=lambda x:turn_orders[x]["order"]): 
            turn_orders[entity_name]["turn_func"]()
    

    You might also want to look into object-oriented programming (you could have what we call an "object" representing each entity, and containing the information about their order and their turn function instead of having to use a dictionary).