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

VPS Starter Arubacloud
0 głosów
330 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 (344,100 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 (344,100 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 (344,100 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 (40,650 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 (40,650 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 (344,100 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 (40,650 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 (344,100 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ź 181 wizyt
pytanie zadane 7 września 2016 w Python przez shadou102 Pasjonat (21,630 p.)
0 głosów
1 odpowiedź 152 wizyt
pytanie zadane 17 listopada 2022 w Python przez dedek2 Początkujący (370 p.)
0 głosów
1 odpowiedź 326 wizyt
pytanie zadane 14 października 2022 w Python przez Ichbinda Nowicjusz (230 p.)

92,453 zapytań

141,262 odpowiedzi

319,088 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

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!

...