Nauč se Python > Kurzy > Začátečnický kurz PyLadies > Funkce a řetězce > Zpětná vazba k domácím projektům

Feedback k domácím projektům

Tah hráče

Je tam opravdu vše potřeba?

In [ ]:
def tah_hrace (pole):
    'Vrátí herní pole se zaznamenaným tahem hráče'
    t = 0
    while t == 0:
        pozice = int(input('Na které políčko chceš hrát? '))
        if (pozice > 0) and (pozice<=20) and (pole[pozice-1] == '-'):
            return tah(pole,pozice,'x')
            t = 1
        else:
            print('Špatně zadaná pozice, zkus to znovu.')

Není

In [ ]:
def tah_hrace(pole):
    'Vrátí herní pole se zaznamenaným tahem hráče'
    while True:
        pozice = int(input('Na které políčko chceš hrát? '))
        if (pozice > 0) and (pozice<=20) and (pole[pozice-1] == '-'):
            return tah(pole,pozice,'x')
        else:
            print('Špatně zadaná pozice, zkus to znovu.')

Vyhodnocení piškvorek

Co by se tady dalo udělat jednodušeji?

In [ ]:
def vyhodnot(pole):
    "Vyhodnotí stav pole."
    krizek = "xxx"
    kolecko = "ooo"
    volno = "-"
    if krizek in pole and kolecko not in pole:
        return("x")
    elif kolecko in pole and krizek not in pole:
        return("o")
    elif volno not in pole and krizek not in pole and kolecko not in pole:
        return("!")
    else:
        None

Upravená varianta

In [ ]:
def vyhodnot(pole):
    "Vyhodnotí stav pole."
    if 'xxx' in pole:
        return("x")
    elif 'ooo' in pole:
        return("o")
    elif '-' not in pole:
        return("!")
    else:
        return '-'

Piškvorky

In [ ]:
from random import randrange

def vyhodnot(pole):
    "Vyhodnotí stav pole."
    if 'xxx' in pole:
        return("x")
    elif 'ooo' in pole:
        return("o")
    elif '-' not in pole:
        return("!")
    else:
        return '-'

def tah(pole, pozice, symbol):
    "Vrátí herní pole s daným symbolem umístěným na danou pozici."
    return pole[:pozice] + symbol + pole[pozice + 1:]

def tah_hrace(herni_pole):
    "Ptá se hráče na kterou pozici chce hrát a vrací herní pole se zaznamenaným tahem"
    while True:
        cislo_pozice = int(input("Na kterou pozici chceš hrát? "))
        if cislo_pozice >= 0 and cislo_pozice < len(herni_pole) and herni_pole[cislo_pozice] == "-":
            return tah(herni_pole, cislo_pozice, "x")
        else:
            print("Špatná pozice, zkus to znovu. ")

def tah_pocitace(herni_pole):
    "Vrátí herní pole se zaznamenaným tahem počítače. "
    while True:
        cislo_pozice = randrange(len(herni_pole))
        if herni_pole[cislo_pozice] == "-":
            return tah(herni_pole, cislo_pozice, "o")

def piskvorky():
    "Vygeneruje prázdné pole a střídá tah hráče a počítače. "
    pole = "-" * 20
    while True:
        print(pole)
        pole = tah_hrace(pole)
        print(pole)
        if vyhodnot(pole) != '-':
            break
        pole = tah_pocitace(pole)
        if vyhodnot(pole) != '-':
            break
    
    print(pole)
    if vyhodnot(pole) == '!':
        print('Remíza!')
    elif vyhodnot(pole) == 'x':
        print('Vyhrála jsi!')
    elif vyhodnot(pole) == 'o':
        print('Vyhrál počítač!')

piskvorky()

Chyby v programu a jejich řešení

Nejdříve chyby v syntaxi, na které si Python stěžuje ihned po přečtení programu.

In [1]:
def piskvorky1d(symbol):
    symbol_hrac = input('Chces o nebo x?)
    pole= '-' * 20
    print(pole)
    vysledek == '-'

    while vysledek =='-'
    tah_hrace(pole,symbol_hrac)
    print(pole)
    if symbol_hrac == 'o':
        symbol_pocitac == 'x'
    else:
        symbol_pocitac == 'o'
    tah_pocitace(pole,symbol_pocitac)
    print(pole)
    vysledek == vyhodnot(pole)
    print(vysledek)
  File "<ipython-input-1-ccb09551c24e>", line 2
    symbol_hrac = input('Chces o nebo x?)
                                         ^
SyntaxError: EOL while scanning string literal
In [2]:
def piskvorky1d(symbol):
    symbol_hrac = input('Chces o nebo x?')
    pole= '-' * 20
    print(pole)
    vysledek == '-'

    while vysledek =='-'
    tah_hrace(pole,symbol_hrac)
    print(pole)
    if symbol_hrac == 'o':
        symbol_pocitac == 'x'
    else:
        symbol_pocitac == 'o'
    tah_pocitace(pole,symbol_pocitac)
    print(pole)
    vysledek == vyhodnot(pole)
    print(vysledek)
  File "<ipython-input-2-caf4662f8092>", line 7
    while vysledek =='-'
                        ^
SyntaxError: invalid syntax
In [3]:
def piskvorky1d(symbol):
    symbol_hrac = input('Chces o nebo x?')
    pole= '-' * 20
    print(pole)
    vysledek == '-'

    while vysledek =='-':
    tah_hrace(pole,symbol_hrac)
    print(pole)
    if symbol_hrac == 'o':
        symbol_pocitac == 'x'
    else:
        symbol_pocitac == 'o'
    tah_pocitace(pole,symbol_pocitac)
    print(pole)
    vysledek == vyhodnot(pole)
    print(vysledek)
  File "<ipython-input-3-849da4aa383b>", line 8
    tah_hrace(pole,symbol_hrac)
            ^
IndentationError: expected an indented block
In [4]:
def piskvorky1d(symbol):
    symbol_hrac = input('Chces o nebo x?')
    pole= '-' * 20
    print(pole)
    vysledek == '-'

    while vysledek =='-':
        tah_hrace(pole,symbol_hrac)
        print(pole)
        if symbol_hrac == 'o':
            symbol_pocitac == 'x'
        else:
            symbol_pocitac == 'o'
        tah_pocitace(pole,symbol_pocitac)
        print(pole)
        vysledek == vyhodnot(pole)
        print(vysledek)

Pro řešení těch dalších už musíme kód v naší funkci spustit, jinak se o jeho chování nic nedozvíme.

In [5]:
def piskvorky1d(symbol):
    symbol_hrac = input('Chces o nebo x?')
    pole= '-' * 20
    print(pole)
    vysledek == '-'

    while vysledek =='-':
        tah_hrace(pole,symbol_hrac)
        print(pole)
        if symbol_hrac == 'o':
            symbol_pocitac == 'x'
        else:
            symbol_pocitac == 'o'
        tah_pocitace(pole,symbol_pocitac)
        print(pole)
        vysledek == vyhodnot(pole)
        print(vysledek)

piskvorky1d()
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-5-38c9f4d5522f> in <module>()
     17         print(vysledek)
     18 
---> 19 piskvorky1d()

TypeError: piskvorky1d() missing 1 required positional argument: 'symbol'
In [6]:
def piskvorky1d():
    symbol_hrac = input('Chces o nebo x?')
    pole= '-' * 20
    print(pole)
    vysledek == '-'

    while vysledek =='-':
        tah_hrace(pole,symbol_hrac)
        print(pole)
        if symbol_hrac == 'o':
            symbol_pocitac == 'x'
        else:
            symbol_pocitac == 'o'
        tah_pocitace(pole,symbol_pocitac)
        print(pole)
        vysledek == vyhodnot(pole)
        print(vysledek)

piskvorky1d()
Chces o nebo x?x
--------------------
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-6-7bbdc769e0fd> in <module>()
     17         print(vysledek)
     18 
---> 19 piskvorky1d()

<ipython-input-6-7bbdc769e0fd> in piskvorky1d()
      3     pole= '-' * 20
      4     print(pole)
----> 5     vysledek == '-'
      6 
      7     while vysledek =='-':

NameError: name 'vysledek' is not defined
In [7]:
def piskvorky1d():
    symbol_hrac = input('Chces o nebo x?')
    pole= '-' * 20
    print(pole)
    vysledek = '-'

    while vysledek =='-':
        tah_hrace(pole,symbol_hrac)
        print(pole)
        if symbol_hrac == 'o':
            symbol_pocitac == 'x'
        else:
            symbol_pocitac == 'o'
        tah_pocitace(pole,symbol_pocitac)
        print(pole)
        vysledek = vyhodnot(pole)
        print(vysledek)

piskvorky1d()
Chces o nebo x?x
--------------------
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-7-5b37f45dac8a> in <module>()
     17         print(vysledek)
     18 
---> 19 piskvorky1d()

<ipython-input-7-5b37f45dac8a> in piskvorky1d()
      6 
      7     while vysledek =='-':
----> 8         tah_hrace(pole,symbol_hrac)
      9         print(pole)
     10         if symbol_hrac == 'o':

NameError: name 'tah_hrace' is not defined

Nepřehánějme to s komentáři

In [ ]:
#Program by měl vypisovat všechny hody a nakonec napsat, kdo vyhrál.
def hazeni(hrac):
    '''Tato funkce generuje náhodné hody kostkou hráče.
    Výsledkem je počet hodů dokud nepadla šestka.'''
#hodnota jedna, protože vždycky se alespoň jednou hodí kostkou
    pocet = 1
    while True:
#hod generuje náhodná čísla 1-6
        hod = randrange(1,7)
        # print(hod, 'tohle jsem hodil')
#v každém případě, kdy není hozena šestka, se připočítává k hodnotě počet jednička
        if hod != 6:
            pocet += 1
            # print(pocet, 'tolik hodů')
#když šestka padne, vypíše se v rámci funkce text a vrátí se hodnota (dále se s ní počítá jako s vyslB)
        else:
            print(hrac, '. hráč potřeboval ', pocet, ' hodů na hození šestky.', sep='')
            return pocet
In [1]:
def obsah_elipsy(a, b):
    obsah = pi * a * b  # Přiřazení do `obsah`
    a = a + 3  # Přiřazení do `a`
    return obsah

Plagiáty?

bart

Pochvaly

  • Za to, že vaše programy očekávají různé vstupy - například Ano, ANO, ano, A atp.
  • Pochvala za použití Gitu a Githubu.

Obecné rady a doporučení

  • U funkcí vždy používáme dokumentační řetězce s trojtými uviozovkami. K popisu funkcí nepoužíváme komentáře.
  • Nezapomeňte kontrolovat svůj kód před odesláním, jestli tam nezůstali nějaké ladící hlášky nebo něco navíc.
  • Pokud máte domácí úkol v Gitu a nahraný na Github, není třeba ho zabalit a poslat ještě jednou na Dropbox. Pošlete jen odkaz.
  • Dělejte i složitější úlohy. I když se vám třeba nakonec nepodaří dokončit, je to lepší než je neudělat vůbec a je se alespoň o čem bavit a co řešit.

Toto je stránka lekce z kurzu, který probíhá nebo proběhl naživo s instruktorem.