• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Lista w Pythonie nie zamienia się

Aruba Cloud - Virtual Private Server VPS
0 głosów
640 wizyt
pytanie zadane 15 listopada 2021 w Python przez DaXari Początkujący (280 p.)

Robię kalkulator Damage'a i po każdych obliczeniach, statystyki muszą wrócić do stanu początkowego podanego prze gracza, jednak tego nie robią, mogę prosić o pomoc? (Skrypt nie jest skończony gdyż najpierw chcę wyeliminować problem) Kod:

Gracz1Staty = [0, 0, 0, 0]
Gracz2Staty = [0, 0, 0, 0]

Gracz1pokemon = str(input("Gracz 1, podaj nazwę pokemona: "))
Gracz1Staty[0] = int(input("Podaj atak: "))
Gracz1Staty[1] = int(input("Podaj życie: "))
Gracz1Staty[2] = int(input("Podaj tarczę: "))
Gracz1Staty[3] = int(input("Podaj speed: "))

Gracz2pokemon = str(input("Gracz 2, podaj nazwę pokemona: "))
Gracz2Staty[0] = int(input("Podaj atak: "))
Gracz2Staty[1] = int(input("Podaj życie: "))
Gracz2Staty[2] = int(input("Podaj tarczę: "))
Gracz2Staty[3] = int(input("Podaj speed: "))

Gracz1Statyw = Gracz1Staty
Gracz2Statyw = Gracz2Staty

while True:
    if Gracz1Statyw[3] > Gracz2Statyw[3]:
        print(Gracz1pokemon, " atakuje!")
        Gracz2Statyw[2] /= 2
        Gracz1Statyw[0] = Gracz1Statyw[0] - Gracz2Statyw[2]
        Efektywnosc = float(input("Podaj efektywność ataku: "))
        if Efektywnosc == 0:
            Gracz1Statyw[0] = 0
        elif Efektywnosc == 0.5:
            Gracz1Statyw[0] *= 0.5
        elif Efektywnosc == 2:
            Gracz1Statyw[0] *= 2
        Gracz2Statyw[1] -= Gracz1Statyw[0]
        print(Gracz1pokemon, " zadał ", str(Gracz1Statyw[0].__round__()), " życia")
        if Gracz2Statyw[1] <= 0:
            print(Gracz2pokemon, " wyeliminowany!")
            Gracz2Staty.clear()
            exit(0)
        else:
            print(Gracz2pokemon, " ma ", str(Gracz2Statyw[1].__round__()), " życia")

    Gracz1Statyw = Gracz1Staty
    Gracz2Statyw = Gracz2Staty

 

2 odpowiedzi

+1 głos
odpowiedź 15 listopada 2021 przez adrian17 Mentor (352,580 p.)
wybrane 16 listopada 2021 przez DaXari
 
Najlepsza
Gracz1Statyw = Gracz1Staty
Gracz2Statyw = Gracz2Staty

w Pythonie takie przypisanie nie kopiuje obiektu (tu: tablicy), tylko przypisuje referencję. `Gracz1Statyw` i `Gracz1Staty` to ta sama tablica, więc późniejsze przypisania nic nie robią.

Jak chcesz wykonać kopię tablicy, to wywołaj na niej na przykład metodę .copy()

A na boku:

1. zdecydowanie czytelniej by było, gdyby zamiast tablicy to był słownik lub obiekt z nazwanymi polami. "Gracz1statyw[0]" nic nie mówi, "gracz1.atak" lub "gracz1['atak']" już tak.

2. zamiast `x.__round__()`, wystarczy zwykłe `round(x)`. Nie trzeba też konwertować na stringa używając str() żeby przekazać cokolwiek do print()a.

komentarz 16 listopada 2021 przez DaXari Początkujący (280 p.)
Mam już "copy()", tyle że za pierwszym razem oblicza damage poprawnie, ale jak użyje drugi raz z rzędu tej samej "efektywności" czyli mnożnika damage'a, to damage jest równy -4 i powtarza się tak w nieskończoność
komentarz 17 listopada 2021 przez DaXari Początkujący (280 p.)
Czemu się tak dzieje?
komentarz 17 listopada 2021 przez adrian17 Mentor (352,580 p.)
Musiałbyś pokazać nowy kod (po poprawkach), bo teraz na ślepo trudno cokolwiek powiedzieć.
komentarz 17 listopada 2021 przez DaXari Początkujący (280 p.)
Jakby było łatwiej, to mógłbym na discordzie share screena czy coś
komentarz 17 listopada 2021 przez adrian17 Mentor (352,580 p.)
Ale po co robić share screena, jeśli możesz po prostu wrzucić tekstowo kod :V
komentarz 17 listopada 2021 przez DaXari Początkujący (280 p.)
Można
0 głosów
odpowiedź 15 listopada 2021 przez reaktywny Nałogowiec (46,230 p.)
Polecam nauczyć się programowania obiektowego i zapoznać się z DRY.  W innym przypadku będziesz gonił błędy w programie do końca życia :) :) Tu masz zaledwie 40 linii kodu a już nad nim nie panujesz ;)

Serio, do (większości) gier w Pythonie najlepiej sprawdza się OOP.
komentarz 15 listopada 2021 przez DaXari Początkujący (280 p.)

blush czyli że to jest do naprawienia, ale szkoda naprawiać?

komentarz 15 listopada 2021 przez reaktywny Nałogowiec (46,230 p.)
Masz zaledwie 40 linii kodu a już się gubisz. Pisząc tak jak teraz, możesz natłuc kilkaset albo kilka tys. linii kodu.... pomyśl, jak wtedy będzie wyglądać Twój program i jakie będziesz miał problemy z jego "ogarnięciem".
1
komentarz 15 listopada 2021 przez adrian17 Mentor (352,580 p.)

Masz zaledwie 40 linii kodu a już się gubisz.

Gubi się bo nie rozumie jeszcze niektórych pojęć w Pythonie, a nie dlatego że nie użył OOP.

komentarz 16 listopada 2021 przez reaktywny Nałogowiec (46,230 p.)
No tak a pomyśl co będzie jak będzie miał 2000+ linii kodu.

Nie twierdzę, że OOP jest niezbędne, ale w większości gier warto stosować prog. obiektowe.

Oczywiście tu już stosowanie się do zasad DRY, użycie funkcji wiele by pomogło.
komentarz 16 listopada 2021 przez adrian17 Mentor (352,580 p.)

No tak a pomyśl co będzie jak będzie miał 2000+ linii kodu.

To wtedy się nauczy o projektowaniu kodu. Najpierw musi jednak zrozumieć podstawy.

Podobne pytania

0 głosów
1 odpowiedź 219 wizyt
pytanie zadane 7 września 2016 w Python przez shadou102 Pasjonat (21,690 p.)
0 głosów
1 odpowiedź 252 wizyt
pytanie zadane 17 listopada 2022 w Python przez dedek2 Początkujący (370 p.)
0 głosów
1 odpowiedź 446 wizyt
pytanie zadane 14 października 2022 w Python przez Ichbinda Nowicjusz (230 p.)

93,327 zapytań

142,323 odpowiedzi

322,397 komentarzy

62,657 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...