Problem w wykorzystaniu funkcji zip()

0

Cześć, wydaje mi się, że robię jakiś szkolny błąd w wykorzystaniu funkcji zip() i już kompletnie się pogubiłem. Prosiłbym o wskazanie tego błędu, ponieważ nie rozumiem czemu moja funkcja nie działa.

Napisałem funkcje, która ma sprawdzać poziomo wiersze tablicy i w przypadku wystąpienia 3 razy X lub O w jednym wierszu, zwracać wartość True i drukować napis o tym, która wartość się powtarza.

Niestety funkcja działa jedynie dla tablicyX a powinna również dla tablicyY.

Domyślam się, że jest jeszcze pewnie parę innych sposobów implementacji funkcji checkHorizontally ale chciałbym skorzystać z tego, który używa funkcji zip właśnie, chyba że zwyczajnie się nie nadaje.

tablica = [[0, 0, 0],  # [0, 0, 0], [0, 0, 0], [0, 0, 0]
           [0, 0, 0], 
           [0, 0, 0]]

tablicaX = [['X', 0, 0], #['X', 0, 0], ['X', 0, 0], ['X', 0, 0]
            ['X', 0, 0], 
            ['X', 0, 0]]

tablicaY = [[0, 0, 'O'], #[0, 0, 'O'], [0, 0, 'O'], [0, 0, 'O']
            [0, 0, 'O'], 
            [0, 0, 'O']]

tablicaTestowa = [['X', '0', 'X'], [1, 2, 3], [1, 5, 0]]


#Poziomo
def checkHorizontally(tablica):
    for x, y, z in zip(tablica[0], tablica[1], tablica[2]):
        if(x == y == z):
            if x == 'X':
                print('Gracz z X wygrał')
                return True
            elif x == '0':
                print('Gracz z 0 wygrał')
                return True
        else:
            print('Nikt nie wygrał')
            return False
            


checkHorizontally(tablicaY)
1

tak się nie porównuje x == y == z tylko z and
https://www.w3schools.com/python/python_conditions.asp

1

Jest to zła praktyka czy po prostu błąd? — Lil Keyboard 3 minuty temu

błąd - jest formalnie akceptowany, bo da się policzyć, ale wynik jest ZUPEŁNIE innych od tego, który oczekujesz.
Popularny poślizg w językach, które mają zbyt uniwersalne wartości boolean, jak C, C++, Python, PHP.

Byłoby twardym błędem kompilacji w Javie czy C#,

0

Zmieniłem w takim razie warunek w pierwszym if ale funkcja dalej nie działa tak jakbym tego oczekiwał.

def checkHorizontally(tablica):
    for x, y, z in zip(tablica[0], tablica[1], tablica[2]):
        if(x == y and x == z):
            if x == 'X':
                print('Gracz z X wygrał')
                return True
            elif x == '0':
                print('Gracz z 0 wygrał')
                return True
        else:
            print('Nikt nie wygrał')
            return False
1

Robisz to źle bo sprawdzasz 1 kolumnę i OD RAZU robisz return False a co z następnymi? O tym że nikt nie wygrał to możesz stwierdzić dopiero ZA PĘTLĄ. Teraz niby masz pętlę for ale zawsze robisz return w jej pierwszym obiegu.

3
def elo(tablica):
    for x in range(len(tablica)):
        match_x = 0
        if x == 0:
            for y in range(len(tablica[0])):
                a = 1
                match_y = 0
                while True:
                    if a < len(tablica):
                        if type(tablica[0][y]) == str and tablica[0][y] == tablica[a][y]:
                            a+=1
                            match_y += 1
                        else:
                            break
                    else:
                        break
                if match_y > 1:
                    return f"Wygrał {tablica[0][y]}"
        for z in range(len(tablica[x])):
            if z+1 < len(tablica[x]) and type(tablica[x][z]) == str and tablica[x][z] == tablica[x][z+1]:
                match_x += 1
        if match_x > 1:
            return f"Wygrał {tablica[x][z]}"
    return f"Nikt nie wygrał"

print(elo(tablicaY))

Troche lopatologia ale dziala. Mam dzisiaj raka mozgu ;d

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