Kreator wojownika z wykorzystaniem list

0

Witam. Mam za zadanie napisać program, w którym użytkownik dodaje i odejmuje z puli 30 punktów punkty doświadczenia dla czterech atrybutów.

# kreator wojownika

atrybuty = []
atrybuty_lista = ["siła", "zdrowie", "mądrość", "zręczność"]
points = 30


choice = None

while choice != "0":
    print(
        """

        0 - zakończ program
        1 - dodaj punkty do umiejętności
        2 - odejmij punkty od umiejętności
        3 - wyświetl drzewko umiejętności
        """
        )
    choice = input("Wybierz opcję: ")
    print()
    if choice == "0":
        print("Żegnaj!")
    elif choice == "1":
        if points == 0:
            print("Wykorzystałeś wszystkie punkty!")
        else:
            print("Dostępne atrybuty: ", atrybuty_lista)
            name_skill = input("Do jakiego atrybutu chcesz dodać punkty?")
            value = int(input("Ile punktów chcesz przyznać?"))
            x = name_skill, value
            if x not in atrybuty:
                atrybuty.append(x)
            else:
                print("Ta umiejętność ma już dodane punkty")
            points -= value

    elif choice == "2":
        for atrybut in atrybuty:
            print(atrybut, end ="")
        name_skill2 = input("\nOd jakiego atrybutu chcesz odjąć punkty?")
        value = int(input("Ile punktów chcesz odjąć?"))
        y = name_skill2, value
        if y in atrybuty:
            atrybuty.remove(y)
        else:
            print(y, "nie ma takiej umiejętności w 'atrybutach'")
        points += value
    elif choice == "3":
        print("\nTwoje drzewko umiejętności:")
        for atrybut in atrybuty:
            print(atrybut)
    else:
        print("Przykro mi,", choice, " nie jest właściwym wyborem!")

input("\n\nAby zakończyć program naciśnij enter!")

Jak widzicie pierwsz funkcja elif tworzy krotkę z dwoma elementami "str" i liczbą 10 w liście atrybuty. Czy jest możliwość usunięcia liczby z tej krotki aby później w razie potrzeby dodać do tej krotki kolejną liczbę? Krotki są niemutowalne więc z tego co się nauczyłem nie można ich zmieniać. Tak więc druga funkcja elif usuwa istniejącą już pozycję poprzez jej podanie. Czy da się utworzyć program z listami gdzie gracz będzie miał możliwość dodawania i usuwania wybranej liczby punktów doświadczenia? Jak np. doda 10 punktów do życia czy będzie mógł odjąć 7? Próbowałem też robić tą operację wykorzystując słowniki. Ale w słownikach mogę usuwać całosc klucz i definicję albo edytować definicję.

3

Pewnie chciałbyś napisać klasę.

class Wojownik:
  def __init__(self):
    self.sila = 1
    self.zdrowie = 5
    self.madrosc = 3
    self.zrecznosc = 7

w = Wojownik() # tworzymy obiekt wojownika
w.zdrowie += 10
w.zdrowie -= 7

print (w.zdrowie)
0

To zadanie przy rozdziale listy i słowniki. Więc to musi się jakoś dać zrobić z wykorzystaniem list i słowników.
Bardziej list bo są 4 zadania do rozdziału. Pierwsze było do list, to powyżej jest drugie i chyba tyczy się list bo 3 i 4 odnosi się do słowników.
ALe na dzisiaj sobie odpuszczam. Cały dzień w książce i w kodzie siedziałem. Mam dość. Hehe.

1
saqr napisał(a):

To zadanie przy rozdziale listy i słowniki. Więc to musi się jakoś dać zrobić z wykorzystaniem list i słowników.

Wszystko się da, ale w takich przypadkach poprzez napisanie klasy po prostu programista może napisać kod, który jest bardziej zrozumiały.
Słownik możesz np. zainicjować listą kluczy (w Twoim kodzie możesz użyć to co napisałeś, atrybuty_lista): https://www.geeksforgeeks.org/python-dictionary-fromkeys-method/

Ciebie chyba trapi, że w słowniku można usuwać klucze, co może popsuć logikę aplikacji. Bo napisałeś:

Próbowałem też robić tą operację wykorzystując słowniki. Ale w słownikach mogę usuwać całosc klucz i definicję albo edytować definicję.

No cóż... W takim razie, Twoja w tym głowa, żeby nie dawać użytkownikowi opcji usuwania kluczy.
Jeśli wojownik jest słownikiem z zainicjowanymi kluczami, to możesz zrobić z nim to samo co mój przykład z klasą:

slownik["zdrowie"] += 10
slownik["zdrowie"] -= 7
print(slownik["zdrowie"])
0

Zrobiłem to na słowniku. W miarę jestem zadowolony z wyniku.

# kreator wojownik

skills = {}
points = 30
skills_list = ["siła", "zdrowie", "mądrość", "zręczność"]
choice = None

while choice != "0":
    print(
        """

        0 - zakończ program
        1 - dodaj punkty
        2 - odejmij punkty
        3 - wyświetl drzewko umiejętnośći
        """
        )
    choice = input("Wybierz: ")
    print()
    if choice == "0":
        print("Żegnaj!")
    elif choice == "1":
        if points == 0:
            print("Wykorzystałeś wszystkie punkty!")
        else:
            print("Posiadasz", points, " punktów")
        print("Umiejętności, które możesz wybrać: ")
        for skill in skills_list:
            print(skill, end =" ")
        key = input("Jakiej umiejętności chcesz dodać punkty?: ")
        if key not in skills:
            value = int(input("Ile punktów chcesz dodać: "))
            skills[key] = value
        else:
            print("Nie możesz dodać więcej punktów do", key)
        points -= value
    elif choice == "2":
        key = input("Od jakiej umiejętności chcesz odjąć punkty? :")
        if key in skills:
            element = skills.pop(key)
            points += element
        else:
            print("Przykro mi ale", key, " nie znajduję w umiejętnościach")
    elif choice == "3":
        x = skills.items()
        print(x)
input("\n\nAby zakończyć program naciśnij enter.")
        


40

Poprzedni post był mało elegancki, więc poprawiłem na rozwiązanie z dataclassami ;) Tak jak mówiłem, ja bym odseparował atrybuty całkowicie do odrębnej klasy. Poniżej "abstrakcyjny" przykład jak by to mogło np wyglądać.

from dataclasses import dataclass, field
from abc import ABC, abstractmethod

@dataclass(frozen=True)
class Attributes:
    caller: object
    _attributes: dict = field(default_factory=dict, init=False)

    def __post_init__(self):
        if not isinstance(self.caller, Character):
            raise TypeError("Attributes can only be created for Character subcalsses")
        self._attributes.update({"str":0})

    def __getitem__(self, item):
        if not item in self._attributes:
            raise ValueError("Attribute does not exist")
        return self._attributes[item]

    def __setitem__(self, key, value):
        if not key in self._attributes:
            raise AttributeError("Cannot create new attributes")
        self._attributes[key] = value

    def __repr__(self):
        return str(self._attributes)

class Character(ABC):
    @abstractmethod
    def __init__(self):
        self.attributes = Attributes(self)

class Warrior(Character):
    def __init__(self):
        super().__init__()

def main():
    w = Warrior()
    w.attributes["str"] += 1
    print(w.attributes)

if __name__ == "__main__":
    main()

{'str': 1}
0

Hihi. Na klasy przyjdzie czas. Dopiero się uczę i jestem na piątym rozdziale. Listy i słowniki. :)

0
saqr napisał(a):

Hihi. Na klasy przyjdzie czas. Dopiero się uczę i jestem na piątym rozdziale. Listy i słowniki. :)

To czemu nie zrobisz uniwersalne menu na podstawie słownika?

0

Zrobiłem na podstawie słownika. Kod podałem wyżej. Nie mogę w nim odjąć określonej liczby punktów lecz usuwam cały klucz z definicją, ale punkty, które były w definicji wracają do puli punktów i ponownie mogę je przypisać.

0
saqr napisał(a):

Zrobiłem na podstawie słownika.

Nie o to mi chodzi to jest w C ale tu chodzi o idee nie o język : https://4programmers.net/Forum/C_i_C++/352675-stos_funkcje_zapisu_i_odczytu_pliku_binarnego?p=1772198#id1772198

0

Znalazłem kod tego programu. To ma wyglądać tak.

# Character Creator
#
# Pg 155, Challenge No. 2
#
# Write a Character Creator program for a role-playing game.
# The player should be given a pool of 30 points to spend on
# four attributes: Strength, Health, Wisdom, and Dexterity.
# The player should be able to spend points from the pool on
# any attribute and should be able to take points from an
# attribute and put them back into the pool.
#
# Note:
# I added two extra options to this; The ability to remove
# all of points from the attributes and the ability to
# assign the remaining points in the pool to the
# attributes randomly.

import random

# Setting up variables
character = {"Strength":0,
             "Health":0,
             "Wisdom":0,
             "Dexterity":0
            }

choice = None
point_pool = 30

while choice != "0":
    print("""
    Character Creator
    0 - Exit character creator
    1 - Add points to an attribute
    2 - Remove points from an attribute (And add them back to the point pool)
    3 - Remove points from all attributes (And add them back to the point pool)
    4 - Randomly assign points from the point pool to characters
    Your character:
    Strength - """, character["Strength"], """
    Health - """, character["Health"], """
    Wisdom - """, character["Wisdom"], """
    Dexterity - """, character["Dexterity"], """
    Point Pool - """, point_pool, """
    """)

    choice = input("Choice: ")
    print()

    # exit
    if choice == "0":
        print("Thank you for using the character creator")
    # Add points to an attribute
    elif choice == "1":
        if point_pool != 0:
            attribute = input("What attribute do you want to add points to? ")
            # Check that the attribute exists
            if attribute in character:
                add_points = int(input("How many points do you want to add? "))

                # Check that the number of points being added does not exceed
                # the number of points in the pool
                new_pool = point_pool - add_points
                while new_pool < 0:
                    print(add_points, "is more than the number of points in "
                          + "the pool. Please choose a lower number.")
                    add_points = int(input("How many points do you want to add? "))
                    new_pool = point_pool - add_points

                # Calculate the new number of points for the attribute
                new_att_points = character[attribute] + add_points
                character[attribute] = new_att_points

                # Update the point pool to reflect the change
                point_pool = new_pool

                print("\n", add_points, "points added to", attribute)
            else:
                print("The attribute", attribute, "doesn't exist. Please try again.")
        else:
            print("You don't have any points left!")
    # Remove points from an attribute
    elif choice == "2":
        if point_pool != 30:
            attribute = input("What attribute do you want to remove points from? ")
            # Check that the attribute exists
            if attribute in character:

                rem_points = int(input("How many points do you want to remove? "))
                # Check that the number of points being removed does not exceed
                # the number of points in the atttribute
                new_att_points = character[attribute] - rem_points
                while new_att_points < 0:
                    print(rem_points, "is more than the number of points in "
                          + "the attribute. Please choose a lower number.")
                    rem_points = int(input("How many points do you want to remove? "))
                    new_att_points = character[attribute] - rem_points

                # Calculate the new number of points for the point pool
                new_pool = point_pool + rem_points
                point_pool = new_pool

                # Update the attribute to reflect the change
                character[attribute] = new_att_points

                print("\n", rem_points, "points removed from", attribute)
            else:
                print("The attribute", attribute, "doesn't exist. Please try again.")
        else:
            print("You haven't added any points to the attributes yet!")
    # Remove all points from the attributes (AKA reset the character)
    elif choice == "3":
        if point_pool != 30:
            for attribute in character:
                character[attribute] = 0
            point_pool = 30
            print("Attributes emptied, point pool refilled")
        else:
            print("The attributes are already empty!")
    # Randomly assign the remaining points from the point pool to attributes
    elif choice == "4":
        if point_pool != 0:
            while point_pool != 0:
                # You can't use random.choice with dictionaries, so this
                # temporary list is to store the name of the attributes
                temp = []
                for att in character:
                    temp.append(att)
                # Choose a random attribute and a random number of points from
                # the available amount of points
                randAtt = random.choice(temp)
                randPoint = random.randint(0, point_pool)
                # Update attribute points and point pool
                new_att_points = character[randAtt] + randPoint
                character[randAtt] = new_att_points
                new_pool = point_pool - randPoint
                point_pool = new_pool
            print("Remaining points have been randomly allocated.")
        else:
            print("You have no points left!")
    else:
        print(choice, "is not a valid choice! Please try again")


input("\n\nPress the enter key to close the program.")

0

Cześć. Podepnę się. Ja napisałem to w ten sposób. Niby wszystko spoczko, ale mogę robić punkty ujemne i nie mogę rozgryźć dlaczego . Może ktoś podpowiedzieć? Dzięki

points = 30
siła = 0
inteligencja = 0
zdrowie = 0
zręczność = 0
#  przywitanie gracza w kreatorze
print ("""Witaj w kreatorze postaci.
Możesz rozdać 30 punktów w różne zdolności. 
Są to: siła, 
inteligencja, 
zdowie oraz 
zręczność""")
# menu i petla
choice = None
while choice != "0":
    print ("\n\t\t\t MENU")
    print ("""
    1. Dodaj lub odejmij punkt siły
    2. Dodaj lub odejmij punkt inteligencji
    3. Dodaj lub odejmij punkt zdrowia
    4. Dodaj lub odejmij punkt zręczności 
    5. Sprawdź statystyki 
    0. Zakończ działanie kreatora
    """)
    choice=input ("Co chcesz zrobić? ")
    if choice == "1":
        x = int(input ("Dodaj lub odejmij punkty siły "))
        siła += x
        points -= x
        if points < 0 or points >= 30 :
            print ("Nie masz już punktów")
        continue
        print (f"Twoja siła wynosi teraz {siła}. Pozostalo {points} punktów umiejętności " )
        if siła <= 0 or siła > 30:
            print ("Wartość nieprawidłowa")
            choice = input("Co chcesz zrobić? ")
    if choice == "2":
        x = int(input("Dodaj lub odejmij punkty inteligencji "))
        inteligencja += x
        points -= x
        if points < 0 or points >= 30:
            print("Nie masz już punktów")
        continue
        print(f"Twoja inteligencja wynosi teraz {inteligencja}. Pozostalo {points} punktów umiejętności ")
        if inteligencja <= 0 or inteligencja > 30:
            print("Wartość nieprawidłowa")

    if choice == "3":
        x = int(input("Dodaj lub odejmij punkty zdrowia "))
        zdrowie += x
        points -= x
        if points < 0 or points >= 30:
            print("Nie masz już punktów")
        continue
        print(f"Twoje zdrowie wynosi teraz {zdrowie}. Pozostalo {points} punktów umiejętności ")
        if zdrowie <= 0 or zdrowie > 30:
            print("Wartość nieprawidłowa")
    if choice == "4":
        x = int(input("Dodaj lub odejmij punkty zręczności "))
        zręczność += x
        points -= x
        if points < 0 or points >= 30:
            print("Nie masz już punktów")
        continue
        print(f"Twoja zręczność wynosi teraz {zręczność}. Pozostalo {points} punktów umiejętności ")
        if zręczność <= 0 or zręczność > 30:
            print("Wartość nieprawidłowa")
    if choice == "5":
        print (f"""Twoje statystyki prezentują się następująco:
               Siła: {siła}
               Inteligencja: {inteligencja}
               Zdrowie: {zdrowie}
               Zręczność: {zręczność}"""
               )
        print (f"Pozostało {points} punków umiejętności")
    if choice == "0" :
        input("Wciśnij Enter, żeby zakończyć")
1

@biduin:
No bo sprawdzenie punktow masz na samym koncu?
Przykladowo dla inteligencji:

    if choice == "2":
        x = int(input("Dodaj lub odejmij punkty inteligencji "))
        inteligencja += x
        points -= x
        if points < 0 or points >= 30:
            print("Nie masz już punktów")
        continue
        print(f"Twoja inteligencja wynosi teraz {inteligencja}. Pozostalo {points} punktów umiejętności ")
        if inteligencja <= 0 or inteligencja > 30:
            print("Wartość nieprawidłowa")

Najpierw dodajesz inteligencje, potem odejmujesz punkty i dopiero wtedy sprawdzasz czy punkty mieszcza sie w przedziale 0-30. Czyli jezeli wpisze, ze chce dodac 35 punktow inteligencji to Ty dasz mi 35 inteligencji, odejmiesz 35 punktow i dopiero poinformujesz mnie, ze nie mam juz punktow, ale to wszystko dzieje sie po fakcie.
Aha no i tym continue jednoczesnie pomijasz tego printa o inteligencji i sprawdzenie czy inteligencja miesci sie w przedziale 0-30. Po co wrzuciles tam continue i czy w ogole rozumiesz co ten keyword oznacza?

0

Myślałem, że continue będzie potrzebne żeby wrócić do początku pętli, ale już widzę błąd. Trochę to przepisałem i wydaje mi się, że jest ok, ale gdyby ktoś rzucił okiem to będę wdzięczny

points = 30
siła = 0
inteligencja = 0
zdrowie = 0
zręczność = 0
#  przywitanie gracza w kreatorze
print ("""Witaj w kreatorze postaci.
Możesz rozdać 30 punktów w różne zdolności. 
Są to: siła, 
inteligencja, 
zdowie oraz 
zręczność""")
# menu i petla


choice = None
while choice != "0":

    if points <= -1:
        print ("Nie masz już punktów zacznij od początku. Resetuje wybór ")
        points = 30
        siła = 0
        inteligencja = 0
        zdrowie = 0
        zręczność = 0
        pass

    print ("\n\t\t\t MENU")
    print ("""
    1. Dodaj lub odejmij punkt siły
    2. Dodaj lub odejmij punkt inteligencji
    3. Dodaj lub odejmij punkt zdrowia
    4. Dodaj lub odejmij punkt zręczności 
    5. Sprawdź statystyki 
    0. Zakończ działanie kreatora
    """)
    choice=input ("Co chcesz zrobić? ")
    if choice == "1":
        x = int(input ("Dodaj lub odejmij punkty siły "))
        siła += x
        points -= x
        print (f"Twoja siła wynosi teraz {siła}. Pozostalo {points} punktów umiejętności " )
    if choice == "2":
        x = int(input("Dodaj lub odejmij punkty inteligencji "))
        inteligencja += x
        points -= x
        print(f"Twoja inteligencja wynosi teraz {inteligencja}. Pozostalo {points} punktów umiejętności ")

    if choice == "3":
        x = int(input("Dodaj lub odejmij punkty zdrowia "))
        zdrowie += x
        points -= x
        print(f"Twoje zdrowie wynosi teraz {zdrowie}. Pozostalo {points} punktów umiejętności ")
    if choice == "4":
        x = int(input("Dodaj lub odejmij punkty zręczności "))
        zręczność += x
        points -= x
        print(f"Twoja zręczność wynosi teraz {zręczność}. Pozostalo {points} punktów umiejętności ")
    if choice == "5":
        print (f"""Twoje statystyki prezentują się następująco:
               Siła: {siła}
               Inteligencja: {inteligencja}
               Zdrowie: {zdrowie}
               Zręczność: {zręczność}"""
               )
        print (f"Pozostało {points} punków umiejętności")
    if choice == "0" :
        input("Wciśnij Enter, żeby zakończyć")

1 użytkowników online, w tym zalogowanych: 0, gości: 1