Mam tę funkcję, która wygląda na wynik karty (która jest deską, która składa się z krotki z trzema krotkami, a każda mniejsza krotka ma trzy elementy, które mogą być tylko 1, -1 lub 0). Jest to w zasadzie tablica Tic Tac Toe, gdzie 1 reprezentuje X, -1 reprezentuje O i 0 = nic nie odtwarzane. Chcę, aby moja funkcja zwrócił liczbę wygranej gracza (1 lub -1, a jeśli jest to remis, a następnie zwraca 0), ale zwróci go ValueError, jeśli umieściłem kartę, która ma 2 graczy, których oboje wygrali. Podam kilka przykładów (pomyśl o każdej mniejszej krotu jako pierwszej, drugiej i trzecią wiersz Tic Tac Toe Board):

  • tab = ((1,1,1),(-1,-1,-1),(0,0,0)) - Jest to niemożność, jakkolwiek zwraca "1"
  • tab = ((1,1,-1),(0,1,-1),(0,0,1)) - Zwraca 1

Oto mój kod. Możesz zignorować pierwsze trzy funkcje:

def eh_tabuleiro(tab):
    if len(tab) != 3:  
        return False
    else:  
        for row in tab:
            if len(row) != 3: 
                return False
            else: 
                for element in row:
                    if element not in (-1, 0, 1):
                        return False
        return True

def obter_coluna(tab, c): 
    if eh_tabuleiro(tab):
        if c == 1:
            return (tab[0][0],tab[1][0],tab[2][0])
        elif c == 2:
            return (tab[0][1],tab[1][1],tab[2][1])
        elif c == 3:
            return (tab[0][2],tab[1][2],tab[2][2])
        else:
            return ValueError('obter_coluna: algum dos argumentos e invalido')
    else:
        return ValueError('obter_coluna: algum dos argumentos e invalido')    
    
def obter_linha(tab, l): 
    if eh_tabuleiro(tab):
        if l == 1:
            return (tab[0][0],tab[0][1],tab[0][2])
        elif l == 2:
            return (tab[1][0],tab[1][1],tab[1][2])
        elif l == 3:
            return (tab[2][0],tab[2][1],tab[2][2])
        else:
            return ValueError('obter_linha: algum dos argumentos e invalido')
    else:
        return ValueError('obter_linha: algum dos argumentos e invalido')    
    
def obter_diagonal(tab, d): 
    if eh_tabuleiro(tab):
        if d == 1:
            return (tab[0][0],tab[1][1],tab[2][2])
        elif d == 2:
            return (tab[2][0],tab[1][1],tab[0][2])
        else:
            raise ValueError('obter_diagonal: algum dos argumentos e invalido')
    else:
        raise ValueError('obter_diagonal: algum dos argumentos e invalido')


#This is the one I am having problems with

def jogador_ganhador(tab):
    if eh_tabuleiro(tab):
        #winner on the diagonal
        if sum(obter_diagonal(tab, 1)) == 3:
            return '1'     
        elif sum(obter_diagonal(tab, 1)) == -3:
            return '-1'
        elif sum(obter_diagonal(tab, 2)) == 3:
            return '1'      
        elif sum(obter_diagonal(tab, 2)) == -3:
            return '-1'
        #winner on the lines
        elif sum(obter_linha(tab, 1)) == 3:
            return '1'     
        elif sum(obter_linha(tab, 1)) == -3:
            return '-1'
        elif sum(obter_linha(tab, 2)) == 3:
            return '1'      
        elif sum(obter_linha(tab, 2)) == -3:
            return '-1'
        elif sum(obter_linha(tab, 3)) == 3:
            return '1'    
        elif sum(obter_linha(tab, 3)) == -3:
            return '-1'
        #winner on the columns 
        elif sum(obter_coluna(tab, 1)) == 3:
            return '1'     
        elif sum(obter_coluna(tab, 1)) == -3:
            return '-1'
        elif sum(obter_coluna(tab, 2)) == 3:
            return '1'      
        elif sum(obter_coluna(tab, 2)) == -3:
            return '-1'
        elif sum(obter_coluna(tab, 3)) == 3:
            return '1'    
        elif sum(obter_coluna(tab, 3)) == -3:
            return '-1'
        else: #draw
            return '0'
    else:
        raise ValueError('winner: the argument is invalid')

Ta ostatnia funkcja jest zasadniczo dodawanie wszystkich linii, kolumn i przekątnych i widzi, czy wartość jest 3 (jeśli gracz z x wygrał) lub -3 (jeśli gracz z o wygranym), ale nie rozumiem, jak to nie powraca Błąd, czy jest dwóch zwycięzców i co mogę zrobić, aby zmienić.

0
Pedro 23 listopad 2020, 12:59

1 odpowiedź

Najlepsza odpowiedź

Problem polega na tym, że sprawdzasz tylko dla jednego wiersza lub kolumny i nie sprawdzenia innych dla niespójności, więc rozwiązanie jest sprawdzenie niespójności, jak również:

def jogador_ganhador(tab):
    if not eh_tabuleiro(tab): raise ValueError('winner: the argument is invalid')

    num_wins = []

    #winner on the diagonal
    if sum(obter_diagonal(tab, 1)) == 3:
        num_wins.append('1')
    if sum(obter_diagonal(tab, 1)) == -3:
        num_wins.append('-1')
    if sum(obter_diagonal(tab, 2)) == 3:
        num_wins.append('1')
    if sum(obter_diagonal(tab, 2)) == -3:
        num_wins.append('-1')

    #winner on the lines
    if sum(obter_linha(tab, 1)) == 3:
        num_wins.append('1')
    if sum(obter_linha(tab, 1)) == -3:
        num_wins.append('-1')
    if sum(obter_linha(tab, 2)) == 3:
        num_wins.append('1')
    if sum(obter_linha(tab, 2)) == -3:
        num_wins.append('-1')
    if sum(obter_linha(tab, 3)) == 3:
        num_wins.append('1')
    if sum(obter_linha(tab, 3)) == -3:
        num_wins.append('-1')

    #winner on the columns
    if sum(obter_coluna(tab, 1)) == 3:
        num_wins.append('1')
    if sum(obter_coluna(tab, 1)) == -3:
        num_wins.append('-1')
    if sum(obter_coluna(tab, 2)) == 3:
        num_wins.append('1')
    if sum(obter_coluna(tab, 2)) == -3:
        num_wins.append('-1')
    if sum(obter_coluna(tab, 3)) == 3:
        num_wins.append('1')
    if sum(obter_coluna(tab, 3)) == -3:
        num_wins.append('-1')

    if len(num_wins) > 1:
        raise ValueError('winner: the argument is invalid')

    return num_wins[0] if len(num_wins) else '0'
1
Nikos M. 23 listopad 2020, 11:10