• 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ę

Object Storage Arubacloud
0 głosów
384 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 Ekspert (346,900 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 Ekspert (346,900 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 Ekspert (346,900 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 (41,290 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 (41,290 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 Ekspert (346,900 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 (41,290 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 Ekspert (346,900 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ź 188 wizyt
pytanie zadane 7 września 2016 w Python przez shadou102 Pasjonat (21,630 p.)
0 głosów
1 odpowiedź 168 wizyt
pytanie zadane 17 listopada 2022 w Python przez dedek2 Początkujący (370 p.)
0 głosów
1 odpowiedź 374 wizyt
pytanie zadane 14 października 2022 w Python przez Ichbinda Nowicjusz (230 p.)

92,760 zapytań

141,684 odpowiedzi

320,470 komentarzy

62,104 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.

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...