Wątek przeniesiony 2019-01-19 00:41 z Edukacja przez somekind.

Python dla każdego - zadania.

Odpowiedz Nowy wątek
2019-01-18 21:04
1

Cześć wszystkim,

Jestem na etapie zmiany kierunku swojej kariery, a ponadto jest to mój pierwszy wpis na forum zatem proszę o wyrozumiałość jeśli palnę jakieś banalne czy wręcz śmieszne pytanie.

Jestem na etapie nauki Python'a i pod rękę wpadła mi książka z tytułu tego posta "Python dla każdego". Po każdym rozdziale autor przedstawia kilka zadań, dzięki którym można pobawić się kodem i zmajstrować coś bazując na wcześniej poznanych regułach, funkcjach itp. Wprawdzie w sieci można wybiórczo znaleźć odpowiedzi na wybrane pytania, ale w związku z tym, że przerabiam tą książke od samego początku to pozwoliłem sobie uruchomić taki temat, gdzie będę wrzucał swoje "rozwiązania" tych zadań. Kod zapewne nie jest pierwszej jakości, ponieważ samym językiem zacząłem się głębiej interesować od tygodnia lub dwóch, ale już coś tam potrafię naskrobać.

Jeśli to możliwe, to bardzo proszę tych bardziej doświadczonych programistów o wsparcie i ewentualne porady co do jakości kodu, zmian w nim lub po prostu czy widzą jakiś totalny fakap w danym rozwiązaniu. Oczywiście pozostałych forumowiczów też zachęcam do dyskusji, a jeśli ktoś z was jest na etapie rozwiązywania tych zadań - o wrzucanie swoich rozwiązań w tym temacie.

Rozdział 4, zadanie nr 4
Utwórz grę, w której komputer wybiera losowo słowo, które gracz musi odgadnąć. Komputer informuje gracza, ile liter znajduje się w wybranym słowie. Następnie gracz otrzymuje pięć szans na zadanie pytania, czy jakaś litera jest zawarta w tym słowie. Komputer może odpowiedzieć tylko „tak” lub „nie”. Potem gracz musi odgadnąć słowo.

#Gra, w której komputer wybiera losowe słowo, a gracz musi je odgadnąć

import random

#Najpierw tworzę krotkę z zestawieniem słów
words = ("karuzela", "autostrada", "pałac", "miasto", "doniczka", "pielucha", "bank", "stolica", "lodówka")

#Następnie komputer losuje z zestawu słów jedno
word = random.choice(words)

#Przypisuję zmienne
correct = word
tries = 0

#Rozpoczynamy grę
print("\t\tWitaj w grze 'Słowny Mix'!")
print("Wybrałem dla Ciebie pewne słowo, a Twoim zadaniem będzie je odgadnąć.")
print("Możesz skorzystać z 5 szans i spytać mnie, czy dana litera zawiera się w słowie.")
print("\nPodpowiem tylko, że słowo ma następującą ilość liter: ", len(correct))

choice1 = input("\nSpróbujesz odgadnąć słowo już teraz? tak/nie ")

while choice1 == "nie" and tries<5:
    litera = input("\nWpisz literę, a ja odpowiem, czy zawiera się ona w tym słowie: ")
    if litera in correct:
        print("\nTak, litera", litera, "znajduje się w tym słowie.")
    else:
        print("\nNie, litera", litera, "nie znajduje się w tym słowie.")
    choice2 = input("\nCzy chcesz spytać o kolejną literę?")
    if choice2 == "tak" and tries <5:
        tries += 1
    else:
        break
    if tries > 4:
        input("\nPrzykro mi, wykorzystałeś(aś) już wszystkie 5 prób podpowiedzi. Musisz odpowiedzieć. Co to za słowo? ")

answer = input("\nA więc co to za słowo? ")
if answer == correct:
    print("\n\nGratulacje! Udało Ci się odpowiedzieć po", tries, "podpowiedziach!")

print("\n\nTo nie to słowo. Poprawne słowo to:", correct)
print("\nKoniec gry!")

Pozostało 580 znaków

2019-01-18 22:08
0

Na szybko, to komunikat o niewłaściwym słowie wyświetli się zawsze, nawet jak zgadniesz poprawny wyraz.

Pozostało 580 znaków

2019-01-18 22:22
1
#Następnie komputer losuje z zestawu słów jedno
word = random.choice(words)

#Przypisuję zmienne
correct = word

Mnożysz byty ponad potrzebę. Wystarczy correct = random.choice(words).

if tries > 4:
        input("\nPrzykro mi, wykorzystałeś(aś) już wszystkie 5 prób podpowiedzi. Musisz odpowiedzieć. Co to za słowo? ")

Tutaj pytasz o słowo, ale nic z tego nie wynika. Gracz wpisuje słowo, a potem dostaje pytanie "A więc co to za słowo?"

edytowany 1x, ostatnio: sugar_hiccup, 2019-01-18 22:22

Pozostało 580 znaków

2019-01-18 22:36
0

Dzięki, poprawiłem zgodnie z uwagami:

#Gra, w której komputer wybiera losowe słowo, a gracz musi je odgadnąć

import random

#Najpierw tworzę krotkę z zestawieniem słów
words = ("karuzela", "autostrada", "pałac", "miasto", "doniczka", "pielucha", "bank", "stolica", "lodówka")

#Następnie komputer losuje z zestawu słów jedno (prawidłowa odpowiedź)
correct = random.choice(words)
tries = 0

#Rozpoczynamy grę
print("\t\tWitaj w grze 'Słowny Mix'!")
print("Wybrałem dla Ciebie pewne słowo, a Twoim zadaniem będzie je odgadnąć.")
print("Możesz skorzystać z 5 szans i spytać mnie, czy dana litera zawiera się w słowie.")
print("\nPodpowiem tylko, że słowo ma następującą ilość liter: ", len(correct))

choice1 = input("\nSpróbujesz odgadnąć słowo już teraz? tak/nie ")
if choice1 == "tak":
    answer = input("\nA więc co to za słowo? ")

while choice1 == "nie" and tries<5:
    litera = input("\nWpisz literę, a ja odpowiem, czy zawiera się ona w tym słowie: ")
    if litera in correct:
        print("\nTak, litera", litera, "znajduje się w tym słowie.")
    else:
        print("\nNie, litera", litera, "nie znajduje się w tym słowie.")
    choice2 = input("\nCzy chcesz spytać o kolejną literę?")
    if choice2 == "tak" and tries <5:
        tries += 1
    else:
        answer = input("\nA więc co to za słowo? ")
        break
    if tries > 4:
        answer = input("\nPrzykro mi, wykorzystałeś(aś) już wszystkie 5 prób podpowiedzi. Musisz odpowiedzieć. Co to za słowo? ")

if answer == correct:
    print("\n\nGratulacje! Udało Ci się odpowiedzieć po", tries, "podpowiedziach!")
else:
    print("\n\nTo nie to słowo. Poprawne słowo to:", correct)

print("\nKoniec gry!")

Jeśli chodzi o uwagę związaną z przypisaniem zmiennej "correct = word" to chyba nawyk początkującego. W książce wszystko rozpisują krok po kroku i pewnie stąd się to wzięło...

Pozostało 580 znaków

2019-01-19 16:14
0
  1. Fajnie, ze probujesz pisac po angielsku nazwy zmiennych, ale staraj sie byc konsekwentym (zapomniales o zmiennej "litera")
  2. Czy sprawdzanie prób w warunku

while choice1 == "nie" and tries<5:

    if choice2 == "tak" and tries <5:

Jest potrzebne, gdy masz

    if tries > 4:
        answer = input("\nPrzykro mi, wykorzystałeś(aś) już wszystkie 5 prób podpowiedzi. Musisz odpowiedzieć. Co to za słowo? ")

Mozesz dodac tam break i wyjdzie to samo, a komputer mniej warunkow do sprawdzenia ma? Sprawdz


POCZATKUJACY NIE BRAC MOICH RAD NA POWAZNIE

Pozostało 580 znaków

2019-01-19 16:27
0

Faktycznie, śmiga identycznie bez tego warunku :) dzięki za pomoc. "To są właśnie te detale" jak to mawia klasyk.

#Gra, w której komputer wybiera losowe słowo, a gracz musi je odgadnąć

import random

#Najpierw tworzę krotkę z zestawieniem słów
words = ("karuzela", "autostrada", "pałac", "miasto", "doniczka", "pielucha", "bank", "stolica", "lodówka")

#Następnie komputer losuje z zestawu słów jedno (prawidłowa odpowiedź)
correct = random.choice(words)
tries = 0

#Rozpoczynamy grę
print("\t\tWitaj w grze 'Słowny Mix'!")
print("Wybrałem dla Ciebie pewne słowo, a Twoim zadaniem będzie je odgadnąć.")
print("Możesz skorzystać z 5 szans i spytać mnie, czy dana litera zawiera się w słowie.")
print("\nPodpowiem tylko, że słowo ma następującą ilość liter: ", len(correct))

choice1 = input("\nSpróbujesz odgadnąć słowo już teraz? tak/nie ")
if choice1 == "tak":
    answer = input("\nA więc co to za słowo? ")

while choice1 == "nie":
    letter = input("\nWpisz literę, a ja odpowiem, czy zawiera się ona w tym słowie: ")
    if letter in correct:
        print("\nTak, litera", letter, "znajduje się w tym słowie.")
    else:
        print("\nNie, litera", letter, "nie znajduje się w tym słowie.")
    choice2 = input("\nCzy chcesz spytać o kolejną literę?")
    if choice2 == "tak":
        tries += 1
    else:
        answer = input("\nA więc co to za słowo? ")
    if tries > 4:
        answer = input("\nPrzykro mi, wykorzystałeś(aś) już wszystkie 5 prób podpowiedzi. Musisz odpowiedzieć. Co to za słowo? ")
        break
if answer == correct:
    print("\n\nGratulacje! Udało Ci się odpowiedzieć po", tries, "podpowiedziach!")
else:
    print("\n\nTo nie to słowo. Poprawne słowo to:", correct)

print("\nKoniec gry!")

Pozostało 580 znaków

2019-01-20 20:36
0

Wrzucam kolejne zadanie z prośbą o uwagi.

Rozdział 5, zadanie nr 1
Utwórz program, który wypisuje listę słów w przypadkowej kolejności. Program powinien wypisać wszystkie słowa bez żadnych powtórzeń.

#Program wyświetla listę elementów w losowej kolejności
#Program nie może powtórzyć żadnego elementu

import random

elements = ["piłka nożna", "siatkówka", "skoki narciarskie", "żużel", "hokej"]

print("Dyscypliny sportowe to m.in.:")

while elements:
    random_item = random.choice(elements)
    print(random_item)
    elements.remove(random_item)

input("\nWciśnij Enter, aby zakończyć program.")

PS. od kilku godzin męczę się nad zadaniem nr 2 z rozdziału 5. Czy ktoś może mi powiedzieć, czy jest opcja wyświetlenia słownika jako listy tj. od nowej linii każda pozycja z parametrem? Wklejam też treść dla chcących pomóc:
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.

Nie jestem pewien czy w tym zadaniu mogę użyć listy czy powinienem użyć słownika?

Pozostało 580 znaków

2019-01-20 21:32
0
Krispekowy napisał(a):

Wrzucam kolejne zadanie z prośbą o uwagi.

Rozdział 5, zadanie nr 1
Utwórz program, który wypisuje listę słów w przypadkowej kolejności. Program powinien wypisać wszystkie słowa bez żadnych powtórzeń.

#Program wyświetla listę elementów w losowej kolejności
#Program nie może powtórzyć żadnego elementu

import random

elements = ["piłka nożna", "siatkówka", "skoki narciarskie", "żużel", "hokej"]

print("Dyscypliny sportowe to m.in.:")

while elements:
    random_item = random.choice(elements)
    print(random_item)
    elements.remove(random_item)

input("\nWciśnij Enter, aby zakończyć program.")

Jak najbardziej poprawne, jedyne moje uwagi to:

  • Po hastagu zostaw spację i dopiero pisz komentarz, x = 5 # o, w ten sposob
  • Możesz użyć random.shuffle(arr) do pomieszania tablicy w miejscu, lub random.sample(arr, len(arr)) by stworzyć nową tablicę z pomieszanymi elementami. Czytaj dokładniej dokumentację, bo python ma bardzo rozbudowaną bibliotekę standardową i można sobie dzięki niej zaoszczędzić pracy :)

PS. od kilku godzin męczę się nad zadaniem nr 2 z rozdziału 5. Czy ktoś może mi powiedzieć, czy jest opcja wyświetlenia słownika jako listy tj. od nowej linii każda pozycja z parametrem? Wklejam też treść dla chcących pomóc:
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.

Nie jestem pewien czy w tym zadaniu mogę użyć listy czy powinienem użyć słownika?

Ja bym zrobił osobną klasę, ale w zadaniu pewnie chodzi o słownik z kluczami 'sila', 'madrosc', 'zdrowie', 'zresznosc'. Po dictcie możesz iterować w ten sposób:

d = {
    'sila': 20,
    'zresznosc': 5,
}
for k, v in d.items():
    print(f'pod kluczem {k} jest wartosc {v}')

P.S. bardzo propsuję, że tak czytelnie prowadzisz temat, oraz, że zamieszczasz swój kod zamiast prosić o gotowca :)

edytowany 2x, ostatnio: iksde, 2019-01-20 21:33

Pozostało 580 znaków

2019-01-21 08:22
0

Jak najbardziej poprawne, jedyne moje uwagi to:

  • Po hastagu zostaw spację i dopiero pisz komentarz, x = 5 # o, w ten sposob
  • Możesz użyć random.shuffle(arr) do pomieszania tablicy w miejscu, lub random.sample(arr, len(arr)) by stworzyć nową tablicę z pomieszanymi elementami. Czytaj dokładniej dokumentację, bo python ma bardzo rozbudowaną bibliotekę standardową i można sobie dzięki niej zaoszczędzić pracy :)

Pewnie dlatego nie użyłem tych metod, bo w książce nie było o nich mowy póki co, a za dokumentację pythona jeszcze się nie zabrałem. Wielkie dzięki za pomoc.

Ja bym zrobił osobną klasę, ale w zadaniu pewnie chodzi o słownik z kluczami 'sila', 'madrosc', 'zdrowie', 'zresznosc'. Po dictcie możesz iterować w ten sposób:

d = {
    'sila': 20,
    'zresznosc': 5,
}
for k, v in d.items():
    print(f'pod kluczem {k} jest wartosc {v}')

P.S. bardzo propsuję, że tak czytelnie prowadzisz temat, oraz, że zamieszczasz swój kod zamiast prosić o gotowca :)

Dzięki za pomoc. Zadanie poprzedza rozdział o listach i słownikach, zatem wydaje mi się, że klas tutaj nie oczekują (poza tym jeszcze nie wiem z czym to się je:) ). Dzisiaj wrzucę rozwiązanie tego zadania.

Pozostało 580 znaków

2019-01-21 09:48
0

Rozdział 5, zadanie nr 2
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.

# Program Kreator postaci

p = {"siła": 0,
"zdrowie": 0,
"mądrość": 0,
"zręczność": 0}
statment = ["siła",
          "wytrzymałość",
          "charyzma",
          "obrona",
          "inteligencja"]
jackpot = int(30)

print("\nTwoja postać może otrzymać 30 punktów umiejętności.",
          "\n\nDo wykorzystania pozostało Ci ", jackpot, "umiejętności.")

print("Punkty możesz przypisywać do następujących parametrów bohatera:")
for k, v in p.items():
    print(f"{k}  \t= {v}")

while jackpot > 0:
    choice = input("\nPodaj parametr, który chcesz zmodyfikować: ")
    if choice == "siła":
        point = int(input("\nA teraz podaj liczbę punktów, którą chcesz do niego przypisać (jeśli chcesz zmniejszyć punkty danej umiejętności, wstaw przed cyfrą znak '-'): "))
        p[choice] = point
        jackpot = jackpot - point
        print("Twój parametr", choice, "zwiększył się o", point)
    elif choice == "zdrowie":
        point = int(input("\nA teraz podaj liczbę punktów, którą chcesz do niego przypisać (jeśli chcesz zmniejszyć punkty danej umiejętności, wstaw przed cyfrą znak '-'): "))
        p[choice] = point
        jackpot = jackpot - point
        print("Twój parametr", choice, "zwiększył się o", point)
    elif choice == "mądrość":
        point = int(input("\nA teraz podaj liczbę punktów, którą chcesz do niego przypisać (jeśli chcesz zmniejszyć punkty danej umiejętności, wstaw przed cyfrą znak '-'): "))
        p[choice] = point
        jackpot = jackpot - point
        print("Twój parametr", choice, "zwiększył się o", point)
    elif choice == "zręczność":
        point = int(input("\nA teraz podaj liczbę punktów, którą chcesz do niego przypisać (jeśli chcesz zmniejszyć punkty danej umiejętności, wstaw przed cyfrą znak '-'): "))
        p[choice] = point
        jackpot = jackpot - point
        print("Twój parametr", choice, "zwiększył się o", point)
    else:
        print("Podałeś niepoprawną nazwę parametru. Wprowadź ją raz jeszcze.")

print("\n\nWykorzystałeś już wszystkie punkty, Twoja postać prezentuje się następująco:")
for k, v in p.items():
    print(f"{k}  \t= {v}")

input("\n\nWciśnij ENTER aby zakończyć.")

Są dwie rzeczy, których nie mogę rozwiąząć:

  1. Jak ograniczyć pulę od 0 do 30 punktów? Chodzi o to, że podając np. 20 pkt siła, pętla się powtarza, a gdy podam kolejne 20 pkt, to pętla się przerywa, ale do parametru dodano 20 pkt mimo iż w puli zostało 30.
  2. Jak ograniczyć wybór użytkownika, aby do parametrów (siła, mądrość itp.) nie mógł przypisywać ujemnych wartości. Chodzi o to, aby uniknąć sytuacji "siła: -20", a "mądrość: 50"?

Pozostało 580 znaków

2019-01-21 11:33
0

Twój program nie do końca robi to, co powinien. Powinieneś zwiększać wartość parametru, a ty ją przypisujesz. Jak podam dwa razy "siła" i "20", wynikiem będzie

siła    = 20
zdrowie     = 0
mądrość     = 0
zręczność   = 0

Protip: użyj nazwy podanego parametru jako klucza do słownika, to nie będziesz musiał 4 razy klepać tego samego kodu :) w sumie już to robisz. Po co każdy przypadek rozpatrujesz osobno?

jackpot = int(30)

To pewnie jakaś pozostałość po castowaniu inputu, ale wystarczy napisać jackpot = 30 i python będzie wiedział, że to int.

p = {"siła": 0,
"zdrowie": 0,
"mądrość": 0,
"zręczność": 0}
statment = ["siła",
"wytrzymałość",
"charyzma",
"obrona",
"inteligencja"]

Popraw formatowanie. To nie jest błąd składniowy, ale imo warto się od początku trzymać dobrych praktyk. Wyrównuj kolejne elementy listy/dicta do poprzednich (1), albo zaczynaj wszystko w nowej linii (2, preferowana przeze mnie):
(1)

p = {"siła": 0,
     "zdrowie": 0,
     "mądrość": 0,
     "zręczność": 0}
statment = ["siła",
            "wytrzymałość",
            "charyzma",
            "obrona",
            "inteligencja"]

(2)

p = {
    "siła": 0,
    "zdrowie": 0,
    "mądrość": 0,
    "zręczność": 0,
}
statment = [
    "siła",
    "wytrzymałość",
    "charyzma",
    "obrona",
    "inteligencja",
]
  1. Jak ograniczyć pulę od 0 do 30 punktów? Chodzi o to, że podając np. 20 pkt siła, pętla się powtarza, a gdy podam kolejne 20 pkt, to pętla się przerywa, ale do parametru dodano 20 pkt mimo iż w puli zostało 30.

Możesz użyć funkcji min żeby wiedzieć, ile punktów faktycznie powinieneś dodać, uwzględniając limit, np. jeśli zostało 10 punktów do rozdania, a użytkownik wpisze 20, to min(limit, user_input) zwróci 10.

  1. Jak ograniczyć wybór użytkownika, aby do parametrów (siła, mądrość itp.) nie mógł przypisywać ujemnych wartości. Chodzi o to, aby uniknąć sytuacji "siła: -20", a "mądrość: 50"?

Przed przetworzeniem polecenia użytkownika sprawdź wartość w słowniku pod podanym kluczem i upewnij się, że nie zejdzie poniżej zera.

edytowany 3x, ostatnio: iksde, 2019-01-21 11:44

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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