Kółko i krzyżyk

0

Śmigam kółko i krzyżyk z podręcznika i mam problem z tym fragmentem:

# 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

Wywala mi błąd "return outside function"

0

Na moje oko nie masz tu funkcji(metody), nie widzę def-a.

Wrzuć cały kod, dobrze napisany kod masz na GH i filmik na YT (autor G. Coldwind) - masz tam kod w Python i C++. Polecam bo jest fachowo napisany.

0
# 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):
    """Poproś o podanie liczby z odpowiedniego zakresu."""
    response = None
    while response not in range(low, high):
        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."""

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)
        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ń..." )

moves = []
for square in range(NUM_SQUARES):
    if board[square] == EMPTY:
        moves.append(square)
        return moves


    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)




          


0

Jest kilka błędów w kodzie. Najpierw rozwiąż błąd z wcięciami. Na poczatku dobrze masz wcięcia ale od lini
def computer_move(board, computer, human): Zaczynają się losowe wcięcia.

0

Aby nie zakładać nowego tematu podepnę się tutaj :P
Chciałem przerobić kod z książki na "spolszczony" i coś nie pykło xD
Sprawdzałem już z 10 razy linijka po linijce z tym zamieszczonym przez autora i poza podmianą nazw zmiennych oraz layoutu planszy do gry niby wszystko gra ale mimo wszystko nie działa :(
Problem pojawia się przy wyborze pola - jakiego by się nie wybrało to wyrzuca że jest zajęte, oraz wywala
"TypeError: list indices must be integers or slices, not NoneType"
dla funkcji main.
Pomocy

X = "X"
O = "O"
PUSTE = " "
REMIS = "Remis!"
LICZBA_POL = 10


def instrukcja():
    print(
        """
        instrukacja do gry w kółko i krzyżyk vs komputer:
        Dostępne pola zostały oznaczone cyframi od 1 do 9 jak na schemacie poniżej:
        
        7  8  9
        4  5  6
        1  2  3
        
        wybierając liczbe zaznaczasz pole
        
        """
    )

def t_czy_n(pytanie):
    odpowiedz = None
    while odpowiedz not in ("t", "n"):
        print("Odpowiedź niepoprawna!")
        odpowiedz = input(pytanie).lower()
    return odpowiedz

def zapytaj_o_numer(pytanie, low, high):
    odpowiedz = None
    while odpowiedz not in range(low, high):
        odpowiedz = int(input(pytanie))
    return odpowiedz

def kto_pierwszy():
    odpowiedz = t_czy_n("Czy chcesz rozpocząć grę jako pierszy(X)? wybierz t/n ")
    if odpowiedz == "t":
        print("ok zaczynasz pierwszy jako X")
        human = X
        comp = O
    else:
        print("komputer zacznie pierwszy jako X")
        comp = X
        human = O
    return comp, human

def nowa_plansza():
    plansza = []
    for pole in range(LICZBA_POL):
        plansza.append(PUSTE)
    return plansza

def wyswietl_plansze(plansza):
    print("\n\t", plansza[7], "|", plansza[8], "|", plansza[9])
    print("\t", "---------")
    print("\t", plansza[4], "|", plansza[5], "|", plansza[6])
    print("\t", "---------")
    print("\t", plansza[1], "|", plansza[2], "|", plansza[3], "\n")

def poprawne_ruchy(plansza):
    ruchy = []
    for pole in range(LICZBA_POL):
        if plansza[pole] == PUSTE:
            ruchy.append(pole)
        return ruchy

def zwyciezca(plansza):
    DROGI_DO_ZWYCIESTWA = ((7,8,9),
                           (4,5,6),
                           (1,2,3),
                           (7,4,1),
                           (8,5,2),
                           (9,6,3),
                           (7,5,3),
                           (9,5,1))
    for rzad in DROGI_DO_ZWYCIESTWA:
        if plansza[rzad[0]] == plansza[rzad[1]] == plansza[rzad[2]] != PUSTE:
            zwyciezca = plansza[rzad[0]]
            return zwyciezca
    if PUSTE not in plansza:
        return REMIS

    return None

def ruch_czlowieka(plansza, human):
    poprawne = poprawne_ruchy(plansza)
    ruch = None
    while ruch not in poprawne:
        ruch = zapytaj_o_numer("jaki chcesz wykonać ruch?", 0, LICZBA_POL)
        if ruch not in poprawne:
            print("\nTo pole jest zajęte, wybierz inne!")
    print("OK wybrałeś: ",ruch)
    return ruch

def ruch_kompa(plansza, comp, human):
    """Spowoduje ruch komputera"""
    #utwórz kopię roboczą, ponieważ funkcja będzie zmieniać listę
    plansza = plansza[:]
    #najlepsze pozycje do zajecia według kolejności
    NAJLEPSZE_RUCHY = (5, 1, 3, 7, 9, 2, 4, 6, 8)
    print("Wybieram pole nr:", end=" ")
    #jeśli komputer może wygrać, wykonaj ten ruch
    for ruch in poprawne_ruchy(plansza):
        plansza[ruch] = comp
        if zwyciezca(plansza) == comp:
            print(ruch)
            return ruch
        #ten ruch został sprawdzony, wycofaj go
        plansza[ruch] = PUSTE
    #jeśli człowiek moze wygrać, zablokuj ten ruch
    for ruch in poprawne_ruchy(plansza):
        plansza[ruch] = human
        if zwyciezca(plansza) == human:
            print(ruch)
            return ruch
        #ten ruch został sprawdzony, wycofaj go
        plansza[ruch] = PUSTE
    #ponieważ nikt nie może wygrać w następnym ruchu, wybierz najlepsze pole
    for ruch in NAJLEPSZE_RUCHY:
        if ruch in poprawne_ruchy(plansza):
            print(ruch)
            return ruch

def nastepna_kolejka(kolejka):
    """Zmień wykonawcę ruchu"""
    if kolejka == X:
        return O
    else:
        return X

def gratulacje(winner, comp, human):
    """Pogratuluj zwyciezcy"""
    if winner != REMIS:
        print(winner, "wygrał!")
    else:
        print("Remis!")
    if winner == comp:
        print("wygrał Komputer")
    elif winner == human:
        print("Wygrał człowiek")
    elif winner == REMIS:
        print("REMIS!")

def main():
    instrukcja()
    comp, human = kto_pierwszy()
    kolejka = X
    plansza = nowa_plansza()
    wyswietl_plansze(plansza)

    while not zwyciezca(plansza):
        if kolejka == human:
            ruch = ruch_czlowieka(plansza, human)
            plansza[ruch] = human
        else:
            ruch = ruch_kompa(plansza, comp, human)
            plansza[ruch] = comp
        wyswietl_plansze(plansza)
        kolejka = nastepna_kolejka(kolejka)

    winner = zwyciezca(plansza)
    gratulacje(winner, comp, human)



main()
input("enter?")

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