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-27 22:04
0

Rozdział 6, zadanie nr 1
Popraw funkcję ask_number() w taki sposób, aby mogła być wywoływana z wartością kroku. Spraw, aby domyślną wartością kroku była liczba 1.

Tutaj chyba potrzeba nieco objaśnień, dla tych co książki nie czytali (pomijam fakt, że nie do końca rozumiem o co chodzi autorowi w tym pytaniu).

W rozdziale 6 autor porusza po raz pierwszy kwestię funkcji. Rozdział finalnie kończy się zaprogramowaniem gry pod nazwą "Kółko i krzyżyk", której kod poniżej wklejam. Powyższe pytanie dotyczy właśnie kodu poniżej.

# Kółko i krzyżyk
# Komputer gra w kółko i krzyżyk przeciwko człowiekowi

# stałe globalne
X = "X"
O = "O"
EMPTY = " "
TIE = "TIE"
NUM_SQUARES = 9

def display_instruct():
    """Wyświetl instrukcję gry."""  
    print(
    """
    Witaj w największym intelektualnym wyzwaniu wszech czasów, jakim jest
    gra 'Kółko i krzyżyk'. Będzie to ostateczna rozgrywka między Twoim
    ludzkim mózgiem a moim krzemowym procesorem.  

    Swoje posunięcie wskażesz poprzez wprowadzenie liczby z zakresu 0 - 8.
    Liczba ta odpowiada pozycji na planszy zgodnie z poniższym schematem:

                    0 | 1 | 2
                    ---------
                    3 | 4 | 5
                    ---------
                    6 | 7 | 8

    Przygotuj się, Człowieku.  Ostateczna batalia niebawem się rozpocznie. \n
    """
    )

def ask_yes_no(question):
    """Zadaj pytanie, na które można odpowiedzieć tak lub nie."""
    response = None
    while response not in ("t", "n"):
        response = input(question).lower()
    return response

def ask_number(question, low, high, step):
    """Poproś o podanie liczby z odpowiedniego zakresu."""
    response = None
    while response not in range(low, high, step):
        response = int(input(question))
    return response

def pieces():
    """Ustal, czy pierwszy ruch należy do gracza, czy do komputera."""
    go_first = ask_yes_no("Czy chcesz mieć prawo do pierwszego ruchu? (t/n): ")
    if go_first == "t":
        print("\nWięc pierwszy ruch należy do Ciebie.  Będzie Ci potrzebny.")
        human = X
        computer = O
    else:
        print("\nTwoja odwaga Cię zgubi... Ja wykonuję pierwszy ruch.")
        computer = X
        human = O
    return computer, human

def new_board():
    """Utwórz nową planszę gry."""
    board = []
    for square in range(NUM_SQUARES):
        board.append(EMPTY)
    return board

def display_board(board):
    """Wyświetl planszę gry na ekranie."""
    print("\n\t", board[0], "|", board[1], "|", board[2])
    print("\t", "---------")
    print("\t", board[3], "|", board[4], "|", board[5])
    print("\t", "---------")
    print("\t", board[6], "|", board[7], "|", board[8], "\n")

def legal_moves(board):
    """Utwórz listę prawidłowych ruchów."""
    moves = []
    for square in range(NUM_SQUARES):
        if board[square] == EMPTY:
            moves.append(square)
    return moves

def winner(board):
    """Ustal zwycięzcę gry."""
    WAYS_TO_WIN = ((0, 1, 2),
                   (3, 4, 5),
                   (6, 7, 8),
                   (0, 3, 6),
                   (1, 4, 7),
                   (2, 5, 8),
                   (0, 4, 8),
                   (2, 4, 6))

    for row in WAYS_TO_WIN:
        if board[row[0]] == board[row[1]] == board[row[2]] != EMPTY:
            winner = board[row[0]]
            return winner

    if EMPTY not in board:
        return TIE

    return None

def human_move(board, human):
    """Odczytaj ruch człowieka."""  
    legal = legal_moves(board)
    move = None
    while move not in legal:
        move = ask_number("Jaki będzie Twój ruch? (0 - 8):", 0, NUM_SQUARES,1)
        if move not in legal:
            print("\nTo pole jest już zajęte, niemądry Człowieku.  Wybierz inne.\n")
    print("Znakomicie...")
    return move

def computer_move(board, computer, human):
    """Spowoduj wykonanie ruchu przez komputer."""
    # utwórz kopię roboczą, ponieważ funkcja będzie zmieniać listę
    board = board[:]
    # najlepsze pozycje do zajęcia według kolejności
    BEST_MOVES = (4, 0, 2, 6, 8, 1, 3, 5, 7)

    print("Wybieram pole numer", end=" ")

    # jeśli komputer może wygrać, wykonaj ten ruch
    for move in legal_moves(board):
        board[move] = computer
        if winner(board) == computer:
            print(move)
            return move
        # ten ruch został sprawdzony, wycofaj go
        board[move] = EMPTY

    # jeśli człowiek może wygrać, zablokuj ten ruch
    for move in legal_moves(board):
        board[move] = human
        if winner(board) == human:
            print(move)
            return move
        # ten ruch został sprawdzony, wycofaj go
        board[move] = EMPTY

    # ponieważ nikt nie może wygrać w następnym ruchu, wybierz najlepsze wolne pole
    for move in BEST_MOVES:
        if move in legal_moves(board):
            print(move)
            return move

def next_turn(turn):
    """Zmień wykonawcę ruchu."""
    if turn == X:
        return O
    else:
        return X

def congrat_winner(the_winner, computer, human):
    """Pogratuluj zwycięzcy."""
    if the_winner != TIE:
        print(the_winner, "jest zwycięzcą!\n")
    else:
        print("Remis!\n")

    if the_winner == computer:
        print("Jak przewidywałem, Człowieku, jeszcze raz zostałem triumfatorem.  \n" \
              "Dowód na to, że komputery przewyższają ludzi pod każdym względem.")

    elif the_winner == human:
        print("No nie!  To niemożliwe!  Jakoś udało Ci się mnie zwieść, Człowieku. \n" \
              "Ale to się nigdy nie powtórzy!  Ja, komputer, przyrzekam Ci to!")

    elif the_winner == TIE:
        print("Miałeś mnóstwo szczęścia, Człowieku, i jakoś udało Ci się ze mną " \
              "zremisować. \nŚwiętuj ten dzień... bo to najlepszy wynik, jaki możesz " \
              "kiedykolwiek osiągnąć.")

def main():
    display_instruct()
    computer, human = pieces()
    turn = X
    board = new_board()
    display_board(board)

    while not winner(board):
        if turn == human:
            move = human_move(board, human)
            board[move] = human
        else:
            move = computer_move(board, computer, human)
            board[move] = computer
        display_board(board)
        turn = next_turn(turn)

    the_winner = winner(board)
    congrat_winner(the_winner, computer, human)

# rozpocznij program
main()
input("\n\nAby zakończyć grę, naciśnij klawisz Enter.")

Natomiast tutaj wklejam moje "rozwiązanie", które wyciąłem z powyższego kodu. Program działa, ale niestety nie wiem czy dobrze, bo rozwiązanie zadania poprzez "przypisanie" kroku do funkcji ask_number wydaje mi się banalnie proste. Nie znalazłem żadnej różnicy w działaniu programu stąd też nie mam bladego pojęcia po co akurat w miejscu, gdzie użytkownik ma wskazać numer, autor prosi o krok...

Definicja funkcji:

def ask_number(question, low, high, step):
    """Poproś o podanie liczby z odpowiedniego zakresu."""
    response = None
    while response not in range(low, high, step):
        response = int(input(question))
    return response

Wykorzystanie funkcji w definicji innej:

def human_move(board, human):
    """Odczytaj ruch człowieka."""  
    legal = legal_moves(board)
    move = None
    while move not in legal:
        move = ask_number("Jaki będzie Twój ruch? (0 - 8):", 0, NUM_SQUARES,1)
        if move not in legal:
            print("\nTo pole jest już zajęte, niemądry Człowieku.  Wybierz inne.\n")
    print("Znakomicie...")
    return move

Pozostało 580 znaków

2019-01-29 20:13
0

Panowie i Panie pomocy :)

Rozdział 6, zadanie nr 2
Zmodyfikuj projekt Jaka to liczba? z rozdziału 3. przez użycie w nim funkcji ask_number().

# Jaka to liczba?
#
# Komputer wybiera losowo liczbę z zakresu od 1 do 100.
# Gracz próbuje ją odgadnąć, a komputer go informuje,
# czy podana przez niego liczba jest: za duża, za mała,
# prawidłowa.

import random  

print("\tWitaj w grze 'Jaka to liczba'!")
print("\nMam na myśli pewną liczbę z zakresu od 1 do 100.")
print("Spróbuj ją odgadnąć w jak najmniejszej liczbie prób.\n")

the_number = random.randint(1, 100)

# definicja funkcji
def ask_the_number(guess):
    while guess != the_number:
        if guess > the_number:
            print("Za duża...")
        else:
            print("Za mała...")
        tries += 1
        guess = int(input("Wprowadź liczbę: "))

# kod główny
tries = 1
ask_the_number(int(input("Wprowadź liczbę: ")))
print("Odgadłeś! Ta liczba to", the_number)
print("Do osiągnięcia sukcesu potrzebowałeś tylko", tries, "prób!\n")

input("\n\nAby zakończyć program, naciśnij klawisz Enter.")

Po odgadnięciu poprawnej liczby wyskakuje mi błąd:
Traceback (most recent call last):
File "E:\Praca\IT Analityk biznesowy\Python - język programowania\kody\r03\jaka_to_liczba.py", line 29, in <module>
ask_the_number(int(input("Wprowadź liczbę: ")))
File "E:\Praca\IT Analityk biznesowy\Python - język programowania\kody\r03\jaka_to_liczba.py", line 24, in ask_the_number
tries += 1
UnboundLocalError: local variable 'tries' referenced before assignment

edytowany 1x, ostatnio: Krispekowy, 2019-01-29 20:15

Pozostało 580 znaków

2019-01-29 20:37
0

Jeśli chcesz modyfikować zmienne spoza scope'u funkcji, musisz dodać global <var> gdzieś w ciele funkcji zanim jej użyjesz. Można, ale to jest zła praktyka - lepiej będzie zadeklarować tries wewnątrz funkcji, a potem je zwrócić.

edytowany 1x, ostatnio: iksde, 2019-01-29 20:37

Pozostało 580 znaków

2019-01-29 21:53
0

W jaki sposób mogę to zrobić? Chodzi mi o zwrócenie zmienniej z wnętrza funkcji. Ten sposób poniżej powoduje problem w przypadku poprawnej odp - nie zadeklarowano zmiennej "tries"

# definicja zmiennej
def ask_the_number(guess, tries):
    while guess != the_number:
        if guess > the_number:
            print("Za duża...")
        else:
            print("Za mała...")
        tries += 1
        guess = int(input("Wprowadź liczbę: "))

# kod główny
ask_the_number(int(input("Wprowadź liczbę: ")), 1)

print("Odgadłeś! Ta liczba to", the_number)
print("Do osiągnięcia sukcesu potrzebowałeś tylko", tries, "prób!\n")

input("\n\nAby zakończyć program, naciśnij klawisz Enter.")

Pozostało 580 znaków

2019-01-29 22:26
0

Nie przekazuj zmiennej tries jako parametr, tylko zdefiniuj ją w ciele funkcji, a pod koniec zwróć. Wynik ten funkcji przypisz do zmiennej, której potem użyjesz do wypisania ile prób użytkownik potrzebował do odgadnięcia liczby.

Pozostało 580 znaków

2019-02-02 20:07
0

Chyba teraz wszystko gra. Dzięki za pomoc.

# Jaka to liczba?
#
# Komputer wybiera losowo liczbę z zakresu od 1 do 100.
# Gracz próbuje ją odgadnąć, a komputer go informuje,
# czy podana przez niego liczba jest: za duża, za mała,
# prawidłowa.

import random  

print("\tWitaj w grze 'Jaka to liczba'!")
print("\nMam na myśli pewną liczbę z zakresu od 1 do 100.")
print("Spróbuj ją odgadnąć w jak najmniejszej liczbie prób.\n")

the_number = random.randint(1, 100)

# definicja zmiennej
def ask_the_number(guess):
    tries = 1
    while guess != the_number:
        if guess > the_number:
            print("Za duża...")
        else:
            print("Za mała...")
        tries += 1
        guess = int(input("Wprowadź liczbę: "))
    return tries

# kod główny
tries = ask_the_number(int(input("Wprowadź liczbę: ")))

print("Odgadłeś! Ta liczba to", the_number)
print("Do osiągnięcia sukcesu potrzebowałeś tylko", tries, "prób!\n")

input("\n\nAby zakończyć program, naciśnij klawisz Enter.")

Pozostało 580 znaków

2019-02-02 20:14
0
Krispekowy napisał(a):

Chyba teraz wszystko gra. Dzięki za pomoc.

# Jaka to liczba?
#
# Komputer wybiera losowo liczbę z zakresu od 1 do 100.
# Gracz próbuje ją odgadnąć, a komputer go informuje,
# czy podana przez niego liczba jest: za duża, za mała,
# prawidłowa.

import random  

print("\tWitaj w grze 'Jaka to liczba'!")
print("\nMam na myśli pewną liczbę z zakresu od 1 do 100.")
print("Spróbuj ją odgadnąć w jak najmniejszej liczbie prób.\n")

the_number = random.randint(1, 100)

# definicja zmiennej
def ask_the_number(guess):
    tries = 1
    while guess != the_number:
        if guess > the_number:
            print("Za duża...")
        else:
            print("Za mała...")
        tries += 1
        guess = int(input("Wprowadź liczbę: "))
    return tries

# kod główny
tries = ask_the_number(int(input("Wprowadź liczbę: ")))

print("Odgadłeś! Ta liczba to", the_number)
print("Do osiągnięcia sukcesu potrzebowałeś tylko", tries, "prób!\n")

input("\n\nAby zakończyć program, naciśnij klawisz Enter.")

Dlaczego guess jest parametrem funkcji?

Pozostało 580 znaków

2019-02-02 20:16
0
enedil napisał(a):
Krispekowy napisał(a):

Chyba teraz wszystko gra. Dzięki za pomoc.

# Jaka to liczba?
#
# Komputer wybiera losowo liczbę z zakresu od 1 do 100.
# Gracz próbuje ją odgadnąć, a komputer go informuje,
# czy podana przez niego liczba jest: za duża, za mała,
# prawidłowa.

import random  

print("\tWitaj w grze 'Jaka to liczba'!")
print("\nMam na myśli pewną liczbę z zakresu od 1 do 100.")
print("Spróbuj ją odgadnąć w jak najmniejszej liczbie prób.\n")

the_number = random.randint(1, 100)

# definicja zmiennej
def ask_the_number(guess):
    tries = 1
    while guess != the_number:
        if guess > the_number:
            print("Za duża...")
        else:
            print("Za mała...")
        tries += 1
        guess = int(input("Wprowadź liczbę: "))
    return tries

# kod główny
tries = ask_the_number(int(input("Wprowadź liczbę: ")))

print("Odgadłeś! Ta liczba to", the_number)
print("Do osiągnięcia sukcesu potrzebowałeś tylko", tries, "prób!\n")

input("\n\nAby zakończyć program, naciśnij klawisz Enter.")

Dlaczego guess jest parametrem funkcji?

Nie rozumiem? Po prostu taką nazwę przypisałem.

nie musisz cytować całego posta razem z poprzednimi cytowaniami, robi się z tego wielki blob z którego ciężko coś przeczytać :P - superdurszlak 2019-02-02 21:14
Gratuluje zapału, powodzenia - sadaijeakjesaea231 2019-02-02 22:20

Pozostało 580 znaków

2019-02-03 00:38
0

Chodzi o to, że w takim wypadku parametr nie powinien być w ogóle przesyłany, a pierwszy input powinien znaleźć się już w funkcji.

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