You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

3.7 KiB

petr.py

# OPRAVOVAL LUKÁŠ
# Celkový komentář: Hezký, dobře čitelný kód, za mě jsi úplně splnil zadání
# Máš to krátké a výstižné


# Hezký, takhle se to normálně dělává, máš nějaký dict, který ti mapuje internální strukturu na její zobrazení
values = {
    0: " ",
    1: "x",
    2: "o"
}

# Kdybys pak chtěl přidat možnost opakovaného hraní, tak bys tohle musel přesunout do nějakého cyklu dole
board = [[0, 0, 0], [0, 0, 0], [0, 0, 0]]

def print_board(): # Celkem pěkný, sice to dělá vedlejší efekty, ale tady to moc nevadí
    for i in range(3):
        print("{}|{}|{}".format(values.get(board[i][0]), values.get(board[i][1]), values.get(board[i][2])))
        print("-+-+-")

def get_user_input(): 
    # Taky profi, jenom snad možná by bylo lepší přesunout kód na kontrolu vstupu sem
    # aby to nemátlo lidi, co čtou kód hlavního cyklu a celkově by to bylo, řekl bych, ucelenější
    return [int(i) for i in input().split()]

def check_win(): 
    # Je vidět, že narozdíl od Matěje umíš cykly
    # Bohužel by to nefungovalo, kdybychom zvětšili herní pole
    # Tahle funkce by mohla brát board jako argument, což by bylo hezčí, 
    # protože by se dala používat flexibilněji a nezávisela na svém umístění
    # Každopádně zadání celkem hezky splněno
    for i in range(3):
        if board[i][0] == board[i][1] == board[i][2] and board[i][0] != 0:
            return True
        if board[0][i] == board[1][i] == board[2][i] and board[0][i] != 0:
            return True

    if board[0][0] == board[1][1] == board[2][2] and board[1][1] != 0:
        return True
    if board[2][0] == board[1][1] == board[0][2] and board[1][1] != 0:
        return True
    return False

def main():
    finished = False
    plays = 1
    
    # Fajn, tady jsou dva odlišné přístupy (jeden je s break), ale nikdo neví, který z nich použít, takže dobrý:D
    while not finished:
        print_board()
        # Dá se zjednodušit f-stringem, ale tvá verze je kompatibilní i se staršími verzemi Pythonu 3 (<3.5),
        # což taky má své výhody
        print("Hraje {}".format(values.get(plays)))
        inp = False
        while not inp:
            try:
                user_input = get_user_input()
                if board[user_input[0]][user_input[1]] == 0:
                    board[user_input[0]][user_input[1]] = plays
                    # Jenom taková zajímavost - dalo by se to zkrátit na plays = (plays+1)%2
                    # Každopádně je otázka, jestli by to bylo čitelnější, takže jsi udělal dobře
                    if plays == 2: 
                        plays = 0
                    plays += 1
                    inp = True
                else:
                    print("Buňka je již obsazena")
            except:
                # Jenom prosím, nikdy nepoužívat except bez specifikovaného typu chyby
                # Tady by stačilo něco jako `except (IndexError, ValueError):`
                # Vždycky specifikuj typy těch chyb, které zachytáváš, mohlo by se ti totiž stát, že tam bude ještě nějaká další
                # Pak další věc - snaž se, aby byla část v try-except bloku, co nejkratší, 
                # protože opět, co kdybys udělal nějakou nečekanou chybu
                # Ty tady totiž máš i tu logiku na udělání tahu a změnu hráče
                # Každopádně jsem rád, že jsi na try-except vůbec přišel
                print("Váš vstup není platný")
        finished = check_win()

    print_board()
    print("Konec hry")

if __name__ == "__main__":
    # Dobrá konstrukce, hodí se to, když chceš, aby tvůj kód byl také snadno importovatelný jako knihovna
    main()