Bei "while" Schleife immer die selbe Random Zahl

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Beko04
User
Beiträge: 4
Registriert: Montag 25. März 2019, 20:00

Hallo zusammen!

Ich habe mich vor kurzem entschlossen nach ein wenig C++ Basics mir Python genauer unter die Lupe zu nehmen :).

Als kleines Projekt schreibe ich mir ein kleines Commandline Spiel, in der man mit einem Charakter kämpfen & leveln kann.

Nun habe ich das Problem, das wenn ich einen Kampf starte (die Ausgabe ist z.B wie folgt: Dein Schaden: 22, Gegner Schaden 54) und den Kampf wie in den Klammern beschrieben beende und dann einen neuen starte, ich wieder die selben Werte vom Random erhalte sprich wieder die 22 und die 54.

Ich hoffe ich bin im richtigen Teil des Forums und das mir jemand weiterhelfen kann.

Vielen Dank im voraus!

LG Beko

Code: Alles auswählen

import random
import time

    
#initialiserungen Charakter
char_level = 1
char_atk = random.randint(45, 78)
char_hp = 350
char_exp = 0
#initalisierung GameMenü
char_show = 0
char_fight = 1
char_offline = 2
#initaliserungen Gegner Tier1
enemy_tier1 = ["Pilzkuh", "Tollwütiger Hamster", "Kleine Maus", "Baby-Schwertfisch"]
enemy_tier1_hp = random.randint(128, 256)
enemy_tier1_xp_drop = random.randint(32, 64)
enemy_tier1_atk = random.randint(125, 360)
#intialiserung Charakter erstellen Menü (Hier beginnt das Spiel)
print("Willkommen bei CommandRPG! Wie ist dein Name werter Krieger?")
char_name = str(input())
print("Ich heisse dich noch einmal herzlich Willkommen", char_name, "!")
#initialisierung Kampfsystem:
def kampf_tier1():
    print("Du kämpfst gegen:", random.choice(enemy_tier1))
    print("Dein Schaden:", char_atk, "Schaden des Gegners:", enemy_tier1_atk)
    if char_atk > enemy_tier1_atk:
        print("Du hast den Kampf gewonnen!")
        random.seed()
    elif enemy_tier1_atk > char_atk:
        print("Du hast den Kampf verloren!")
        random.seed()
#intialisierung While (Quesi Gamemenü)
char_online = 0
while char_online == 0:
    print("Was möchtest du jetzt tun", char_name, "?", "\n")
    print("0 = Deine Werte anzeigen.\n")
    print("1 = Auf in den Kampf!\n")
    print("2 = Offline gehen.\n")
    #If verzweigung
    char_choice = int(input())
    if char_choice == char_show:
        print("Dein Name:", char_name, "\n")
        print("Deine Leben:", char_hp, "\n")
        print("Dein Angriffschaden:", char_atk, "\n")
        print("Deine Erfahrungspunkte:", char_exp, "\n")
        print("Warte 3 Sekunden...")
        time.sleep(3)
    elif char_choice == char_offline:
        print("Bis zum nächsten mal!")
        break
    elif char_choice == char_fight:
        kampf_tier1()
__deets__
User
Beiträge: 14539
Registriert: Mittwoch 14. Oktober 2015, 14:29

Die Zufallswerte werden ja auch nur VOR der while Schleife bestimmt. Wie sollen sie sich da ändern?
Beko04
User
Beiträge: 4
Registriert: Montag 25. März 2019, 20:00

__deets__ hat geschrieben: Montag 25. März 2019, 20:16 Die Zufallswerte werden ja auch nur VOR der while Schleife bestimmt. Wie sollen sie sich da ändern?
Wenn ich die Variablen in der while Schleife initialisiere dann müssten die also immer neue Werte anzeigen?

Edit:

Funktioniert so, Danke!
Benutzeravatar
__blackjack__
User
Beiträge: 13103
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Beko04: Nur um sicher zu gehen solltest Du auch alle `random.seed()`-Aufrufe raus werfen.

Bei C++ hättest Du exakt das gleiche Problem gehabt.

Anmerkungen zum Quelltext: Auf Modulebene sollte nur Code stehen der Konstanten, Funktionen, und Klassen definiert. Das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst.

Funktionen und Methoden sollten alles was sie ausser Konstanten benötigen als Argument(e) übergeben bekommen, und nicht auf magische Weise aus der ”Umgebung” nehmen.

Namen sollten nicht irgendwie kryptisch abgekürzt werden. Wenn man Namen anfängt zu nummerieren macht man in der Regel auch etwas falsch. Entweder gibt es einen passenderen Namen, oder man wollte keine einzelnen Namen, sondern eine Datenstruktur. Meistens eine Liste.

Es gibt dort einen Haufen einzelner Namen die man sinnvollerweise zu einem Objekt zusammenfassen würde. Wenn die Werte unveränderbar sein dürfen gäbe es `collections.namedtuple()`. Ansonsten Klassen. Eventuell mit Hilfe der externen `attr`-Bibliothek.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Beko04
User
Beiträge: 4
Registriert: Montag 25. März 2019, 20:00

Vielen Dank @__blackjack__

Ich werde da nochmals über die Bücher gehen.

Kann ich den prinzipiell wie in C++ welche quasi die main Funktion bei beginn hat auch in Python schreiben und dort den Code beginnen!
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Beko04 hat geschrieben: Montag 25. März 2019, 20:43 Kann ich den prinzipiell wie in C++ welche quasi die main Funktion bei beginn hat auch in Python schreiben und dort den Code beginnen!
Ja, kannst du. Das geht so:

Code: Alles auswählen

def main():
    # Dein Code

if __name__ == '__main__':
    main()
__name__ ist als "__main__" definiert, wenn das Modul von der Kommandozeile (quasi als Skript) aufgerufen wird. Falls es via import deinmodul eingebunden wird, dann passiert nichts, d.h. man müsste dann die main()-Funktion selbst aufrufen.
Beko04
User
Beiträge: 4
Registriert: Montag 25. März 2019, 20:00

snafu hat geschrieben: Montag 25. März 2019, 21:29
Beko04 hat geschrieben: Montag 25. März 2019, 20:43 Kann ich den prinzipiell wie in C++ welche quasi die main Funktion bei beginn hat auch in Python schreiben und dort den Code beginnen!
Ja, kannst du. Das geht so:

Code: Alles auswählen

def main():
    # Dein Code

if __name__ == '__main__':
    main()
__name__ ist als "__main__" definiert, wenn das Modul von der Kommandozeile (quasi als Skript) aufgerufen wird. Falls es via import deinmodul eingebunden wird, dann passiert nichts, d.h. man müsste dann die main()-Funktion selbst aufrufen.
Vielen Dank, das hilft mir weiter!

LG Beko
Antworten