Hearthstone fatigue calculator
The math

There is a useful formula for triangle numbers that vastly simplifies a lot of the code here:

$$\sum_{k=1}^n k = \frac{n(n+1)}{2}$$

So for instance, the first triangle number is \$1\$, the second \$1 + 2 = 3\$, the third \$1 + 2 + 3 = 6\$ and so fourth. Compare that to the Hearthstone fatigue counter.

The interface

The main function

In a lot of programming languages there is the concept of a main function. This is commonly emulated in Python with:

def main():
    ...

if __name__ == '__main__':
    main()


See this answer for more details. In your case, you should probably have your main() consist of the top level while True statement i.e.:

def main():
    while True:
        ...


if statements

It is rather unfortunate that Python doesn't have switch-case statements which provide a very nice way to match against mode. In this case I would recommend usage of tuple (or dictionary) to handle the modes. To illustrate:

def needed():
    while True:
        try:
            damageInput = int(input("\nPlease input the damage needed for lethal: "))
            startInput = int(input("Starting at how much damage? (default is 1): "))
            ...

def dealt():
    while True:
        try:
            turnsInput = int(input("\nPlease input how many fatigue turns: "))
            startInput = int(input("Starting at how much damage? (default is 1): "))
            ...


MODES = (needed, dealt)


def main():
    while True:
        ...
        MODES[mode]()


Default dictionary?

This takes a bit more work, but you probably want to invest some time into learning what defaultdict is. Default dictionaries give you the power of dictionaries in Python with the ability to avoid raising KeyErrors. You logic right now heavily relies on capturing bad input and handling the exceptions yourself. With a default dict, you:


don't need to convert anything to an integer, just use string keys. This prevents any sort of conversion error.
set the default value for the dictionary to error. In other words, MODES["SOME_GARBAGE_VALUE"]() will act like error().
Add another value to MODES which allows for an exit.