Is this Josephus problem solution bad or really bad?
You can simplify the code if you use (number + 1) % len(self.ppl). This is as it loops back around to the front of the list for you.
If you remove the prints then the code is easier to understand.
You can change creating_list to list(range(...)).
You don't need creating_list to be its own function.
You can combine run into kill removing the class. Leaving:

def game(n):
    ppl = list(range(1, n+1))
    has_gun = 1
    while True:
        number = ppl.index(has_gun) + 1 % len(ppl)
        del ppl[number]
        if len(ppl) &gt; 1:
            number = ppl.index(has_gun) + 1 % len(ppl)
            has_gun = ppl[number]
        if len(ppl) == 1:
            return ppl[0]

You can move the if len(ppl) == 1: check into the statement of the while loop. This makes it easier to see that the function will always return.
You should rename your variables to make it easier to understand things. people over ppl.
Rather than using people.index store the index.

def game(people):
    people = list(range(1, people+1))
    index = 0
    while len(people) &gt;= 1:
        index = (index + 1) % len(people)
        del people[index]
    return people[0]

Error if there is less than one person.
Allow taking a custom skip.


And you'd get to the function that I wrote to test your code:

def josephus_problem(people, amount):
    if people &lt; 1:
        raise ValueError("There has to be at least one person")
    people = list(range(1, people+1))
    index = 0
    while len(people) &gt; 1:
        index = (amount + index) % len(people)
        people.pop(index)
    return people[0]