Strona główna Polish Python Coders Group
   Strona główna   Pomoc Zaloguj się Rejestracja  
Witamy, Gość. Zaloguj się lub zarejestruj.
Czy dotarł do Ciebie email aktywacyjny?

Zaloguj się podając nazwę użytkownika, hasło i długość sesji

Aktualności:
Szukaj Szukaj
Strony: [1]   Do dołu
Drukuj
Wątek: Problem z if-em  (Przeczytany 110 razy)
« : 14:07 04/12/18 »
osa Offline
Hello World!

Zobacz profil
*

Reputacja: 0
Wiadomości: 3


Hej dopiero się uczę i potrzebuje pomocy. Mam zadanie stworzyć kreator postaci w którym bedę rozdysponowywać punkty umiejętności. No i wszystko fanie program się wykonuję mogę dodać lub odjąć punkty, problem zaczyna sie gdy chce zmienić kolejną umiejętność. Ciężko to wytłumaczyć ale jeśli odpalicie kod odrazu zrozumiecie. Program jest jeszczę do dopracowania także bez spiny.

Kod
#-*- coding: utf-8 -*-
 
 
punkty=30
bohater=[["sila",0],["zdrowie",0],["madrosc",0],["zrecznosc",0]]
choice=None
choice2=None
 
while choice!=0:
 
   print("Kreator postaci ")
   print("\tTwój bohater wygląda tak:")
   print("\t1 Siła =",bohater[0][1])
   print("\t2 Zdrowie =",bohater[1][1])
   print("\t3 Mądrość =",bohater[2][1])
   print("\t4 Zręczność =",bohater[3][1])
 
   print("Punkty do rozdysponowania = ",punkty)
   print("Jesli chcesz zakonczyć wybierz 0")
   choice = int(input("\nJaką umiejętność chcesz zmienić: (Wybierz 1-4) : "))
 
 
   if choice==1:
       while choice2!=0:
           print(bohater[choice-1]," co chcesz zrobić?")
           print(" 1 = dodaj punkty")
           print(" 2 = odejmij punkty")
           print(" 0 = cofnij")
           choice2= int(input("Twój wybór: "))
           if choice2==1:
               wartosc=0
               wartosc=int(input("Ile punktów chcesz dodać: "))
               score = bohater[choice-1][1]
               if wartosc>punkty :
                   print("Nie posiadasz tylu punktów")
               else:
                   bohater[choice-1][1]=score+wartosc
                   punkty-=wartosc
           elif choice2==2:
               wartosc=0
               wartosc=int(input("Ile punktów chcesz odjąć: "))
               score = bohater[choice-1][1]
               if wartosc>score :
                   print("Umijętność nie może być ujemna!")
               else:
                   bohater[choice-1][1]=score-wartosc
                   punkty+=wartosc
           else: print("Błąd zła wartość!!")
 
   elif choice==2:
       while choice2!=0:
           print(bohater[choice-1]," co chcesz zrobić?")
           print(" 1 = dodaj punkty")
           print(" 2 = odejmij punkty")
           print(" 0 = cofnij")
           choice2= int(input("Twój wybór: "))
           if choice2==1:
               wartosc=0
               wartosc=int(input("Ile punktów chcesz dodać: "))
               score = bohater[choice-1][1]
               if wartosc>punkty :
                   print("Nie posiadasz tylu punktów")
               else:
                   bohater[choice-1][1]=score+wartosc
                   punkty-=wartosc
           elif choice2==2:
               wartosc=0
               wartosc=int(input("Ile punktów chcesz odjąć: "))
               score = bohater[choice-1][1]
               if wartosc>score :
                   print("Umijętność nie może być ujemna!")
               else:
                   bohater[choice-1][1]=score-wartosc
                   punkty+=wartosc
           else: print("Błąd zła wartość!!")
   elif choice==3:
       while choice2!=0:
           print(bohater[choice-1]," co chcesz zrobić?")
           print(" 1 = dodaj punkty")
           print(" 2 = odejmij punkty")
           print(" 0 = cofnij")
           choice2= int(input("Twój wybór: "))
           if choice2==1:
               wartosc=0
               wartosc=int(input("Ile punktów chcesz dodać: "))
               score = bohater[choice-1][1]
               if wartosc>punkty :
                   print("Nie posiadasz tylu punktów")
               else:
                   bohater[choice-1][1]=score+wartosc
                   punkty-=wartosc
           elif choice2==2:
               wartosc=0
               wartosc=int(input("Ile punktów chcesz odjąć: "))
               score = bohater[choice-1][1]
               if wartosc>score :
                   print("Umijętność nie może być ujemna!")
               else:
                   bohater[choice-1][1]=score-wartosc
                   punkty+=wartosc
           else: print("Błąd zła wartość!!")
   elif choice==4:
       while choice2!=0:
           print(bohater[choice-1]," co chcesz zrobić?")
           print(" 1 = dodaj punkty")
           print(" 2 = odejmij punkty")
           print(" 0 = cofnij")
           choice2= int(input("Twój wybór: "))
           if choice2==1:
               wartosc=0
               wartosc=int(input("Ile punktów chcesz dodać: "))
               score = bohater[choice-1][1]
               if wartosc>punkty :
                   print("Nie posiadasz tylu punktów")
               else:
                   bohater[choice-1][1]=score+wartosc
                   punkty-=wartosc
           elif choice2==2:
               wartosc=0
               wartosc=int(input("Ile punktów chcesz odjąć: "))
               score = bohater[choice-1][1]
               if wartosc>score :
                   print("Umijętność nie może być ujemna!")
               else:
                   bohater[choice-1][1]=score-wartosc
                   punkty+=wartosc
           else: print("Błąd zła wartość!!")
 
   else: print("Błąd!!")
 
Zapisane
« Odpowiedz #1 : 14:37 04/12/18 »
firemark Offline
Advanced Python User

Zobacz profil
**

Reputacja: 16
Wiadomości: 192


Wiesz co, błąd jest prosty - nie zerujesz zmiennych (dokładnie to choice2) i masz zadużo zmiennych globalnych - nie powinno się tak robić, dzięki takim globalnym jeden student zaczadził ludzi bo w sterowniku zedytował 'nie tą globalną co trzeba'. z Sprzętem medycznym to samo - jedna zła globalna zmienna doprowadziła do napromieniowania 30 osób w kilku szpitalach USA.

Kod powinnien być jak najbaridzje 'modularny' i odizlowaony od "efektów ubocznych". Nie jest to łatwe na początku Uśmiech Dam generalnie 2 rady

1) twój kod sie powtarza 4 razy - jest prawd identyczny. cały blok można zmienić w funkcję w której podasz argument choice. https://www.learnpython.org/pl/Funkcje - to ułatwi mozliwosc szukania kolejnych błędów. Oraz - im wiecej mniejszych funkcji tym bardziej widać co programista miał na myśli.

2) zmienna bohater mozesz zmienic na obiekt z nowo generowanej klasy, ale to dla poczatkuajcego moze byc już trudne, więc ja bym preferował słownik https://www.learnpython.org/pl/Slowniki - zamiast bohater[choice-1][1] będziesz mieć bohater[attrybut]

Zapisane
« Odpowiedz #2 : 14:44 04/12/18 »
osa Offline
Hello World!

Zobacz profil
*

Reputacja: 0
Wiadomości: 3


Dzięki. Uczę się Pythona z książki "Pathon dla każdego" i w następnym rozdziale mam funkcje. Myślałem żeby to zamknąć w funkcje ale chce się trzymać książki, późniejsze zadania polegają na edycji poprzednich więc nie chciałem wybiegać w przód. Jeśli chodzi o 2 radę to masz rację słownik bedzię tu odpowiedniejszy. Dzięki za pomoc. Zaraz zeruje zmienne i powinno się udać. Pozdrawiam
Zapisane
« Odpowiedz #3 : 15:21 04/12/18 »
firemark Offline
Advanced Python User

Zobacz profil
**

Reputacja: 16
Wiadomości: 192


To ja mam pytanie - czy te zadanie jest z książki? bo wygląda na spoko na tzn Coding Dojo, które prowadzę w Katowicach - czy mógłbym te zadanko ukraść i jak tak to od kogo Mrugnięcie
Zapisane
« Odpowiedz #4 : 15:35 04/12/18 »
jell Offline
Administrator
Expert Python User

Zobacz profil
*****

Reputacja: 70
Płeć: Mężczyzna
Wiadomości: 612


firemark: nie ucz mlodziezy glupot, tj. mylenia kopiowania z kradzieza Mrugnięcie

tak jak firemark pisal - ustawiasz wartosc dla choice2 na 0, ale zapominasz ja skasowac przy kolejnym obrocie petli, przez "glownej", przez co nie wchodzi do "srodkowych".
Zapisane

The UNIX Guru`s view of Sex:
unzip; strip; touch; finger; mount; fsck; more; yes; umount; sleep
« Odpowiedz #5 : 17:18 04/12/18 »
osa Offline
Hello World!

Zobacz profil
*

Reputacja: 0
Wiadomości: 3


Zadanie jest z książki "Python dla każdego. Podstawy programowania." Dokładna treść to: "Napisz program Kreator postaci do gry z podziałem na role. Gracz powinien
otrzymać pulę 30 punktów, którą może spożytkować na cztery atrybuty: siła,
zdrowie, mądrość i zręczność. Gracz powinien mieć możliwość przeznaczania
punktów z puli na dowolny atrybut, jak również możliwość odbierania
punktów przypisanych do atrybutu i przekazywania ich z powrotem do puli."

Jeśli chodzi o mój problem to już rozwiązany.. Wstyd że taka błachostka mnie pokonała.
Dziękuję za pomoc i zamykam wątek.
Zapisane
« Odpowiedz #6 : 17:30 04/12/18 »
jell Offline
Administrator
Expert Python User

Zobacz profil
*****

Reputacja: 70
Płeć: Mężczyzna
Wiadomości: 612


Nie przejmuj sie i ucz sie dalej Mrugnięcie
Zapisane

The UNIX Guru`s view of Sex:
unzip; strip; touch; finger; mount; fsck; more; yes; umount; sleep
Strony: [1]   Do góry
Drukuj
Skocz do:  

© 2007 - 2018 Polish Python Coders Group
Powered by SMF 1.1.21 | SMF © 2006-2009, Simple Machines | Theme by PixelSlot