Błąd w grze "KÓŁKO I KRZYŻYK"

0

Cześć,
Znalazłem błąd w zadaniu i nie wiem jak go naprawić. Grę napisałem w ten sposób, ze sami wybieramy pole gracza "X", natomiast pole gracza "O" powinno być losowe.
Błąd jest na pewno w kodzie, który opisuje ruch losowy gracza "O". Czasami zamiast wykonać ruch losowy nadpisuje mi ruch gracza "X". Troszkę cięzko to opisać, natomiast kopiując i uruchamiajac kod od razu mozna znalezc problem?

Mógłby mi ktoś proszę pomóc?

("Witaj w grze kolko i krzyzyk")
print("ZACZYNAMY")
import random
plansza = ["-","-","-","-","-","-","-","-","-",]
gracz1 = "X"
gracz2 ="O"
gra = True


def pole(plansza):
    print(plansza[0] + " | " + plansza[1] + " | " + plansza[2])
    print("---------")
    print(plansza[3] + " | " + plansza[4] + " | " + plansza[5])
    print("---------")
    print(plansza[6] + " | " + plansza[7] + " | " + plansza[8])
def ruch (plansza):
    ruch = int(input("Podaj cyfre od 0 do 8 - gracz X: "))
    if plansza[ruch] == "-" and plansza[ruch] !="O":
        plansza[ruch] = gracz1
        print("Udało ci sie")
        if sprawdz_wygrana_gracza1(plansza):
            print("WYGRANA!!! :) ")
            exit()
    else:
        print("zajęte")
        ruch = int(input("Podaj cyfre od 0 do 8 - gracz X: "))
        plansza[ruch] = gracz1


def ruch2 (plansza):
    ruch = random.randrange(0,8)
    if plansza[ruch] == "-" and plansza[ruch] !="X":
        plansza[ruch] = gracz2
        print("Udało ci sie")
        if sprawdz_wygrana_gracza2(plansza):
            print("WYGRANA!!! :) ")
            exit()
    else:
        print("zajęte")
        ruch = int(input("Podaj cyfre od 0 do 8 - gracz X: "))
        plansza[ruch] = gracz1


def sprawdz_wygrana_gracza1(plansza):
    if plansza[0] == "X" and plansza[1] == "X" and plansza[2] =="X":
        return True
    elif plansza[3] == "X" and plansza[4] == "X" and plansza[5] =="X":
        return True
    elif plansza[6] == "X" and plansza[7] == "X" and plansza[8] =="X":
        return True
    elif plansza[0] == "X" and plansza[3] == "X" and plansza[6] =="X":
        return True
    elif plansza[1] == "X" and plansza[4] == "X" and plansza[7] =="X":
        return True
    elif plansza[2] == "X" and plansza[5] == "X" and plansza[8] =="X":
        return True
    elif plansza[0] == "X" and plansza[4] == "X" and plansza[8] =="X":
        return True
    elif plansza[0] == "X" and plansza[6] == "X" and plansza[6] =="X":
        return True
def sprawdz_wygrana_gracza2(plansza):
    if plansza[0] == "O" and plansza[1] == "O" and plansza[2] =="O":
        return True
    elif plansza[3] == "O" and plansza[4] == "O" and plansza[5] =="O":
        return True
    elif plansza[6] == "O" and plansza[7] == "O" and plansza[8] =="O":
        return True
    elif plansza[0] == "O" and plansza[3] == "O" and plansza[6] =="O":
        return True
    elif plansza[1] == "O" and plansza[4] == "O" and plansza[7] =="O":
        return True
    elif plansza[2] == "O" and plansza[5] == "O" and plansza[8] =="O":
        return True
    elif plansza[0] == "O" and plansza[4] == "O" and plansza[8] =="O":
        return True
    elif plansza[0] == "O" and plansza[6] == "O" and plansza[6] =="O":
        return True
   
while gra:
    pole(plansza)
    ruch(plansza)
    ruch2(plansza)
    sprawdz_wygrana_gracza1(plansza)
    sprawdz_wygrana_gracza2(plansza)
~~~
0

if plansza[ruch] == "-" and plansza[ruch] !="O"
Nie wystarczy tu tylko jeden warunek?:
if plansza[ruch] == "-"

0

To else w ruch2 mi nie pasuje. Jeżeli natrafi na zajęte pole, program powinien generować na nowo losowe pole

0

@AlanOGLL:
Poprawiłem, ale dalej jest problem

    else:
        print("zajęte")
        ruch = int(input("Podaj cyfre od 0 do 8 - gracz O: "))
        plansza[ruch] = gracz2
0

@Ignacy
Tak na szybko pomijajac blad, ktory @AlanOGLL opisal.

Za pierwszym razem walidujesz czy mozesz nadpisac pole planszy if plansza[ruch] == "-" and plansza[ruch] !="O": (co prawda tutaj wystarczy tylko pierwsza czesc ifa, ale nieistotne w kwestii buga). W momencie kiedy trafisz na zajete, przechodzisz do bloku else, w ktorym tej walidacji juz nie ma.

0

Nie pisałem w sumie nigdy w pythonie, ale ja bym to zrobił jakoś tak:

def ruch2 (plansza):
    ruch = random.randrange(0,8)
    while(plansza[ruch] != "-"):
        ruch = random.randrange(0,8)
    plansza[ruch] = gracz2
    if sprawdz_wygrana_gracza2(plansza):
            print("WYGRANA!!! :) ")
            exit()
0

Tu jeszcze jeden błąd, powinno być:

while gra:
    pole(plansza)
    ruch(plansza)
    ruch2(plansza)

Bo sprawdzasz wygraną wewnątrz ruchu.

def ruch (plansza):
    while(True):
        ruch = int(input("Podaj cyfre od 0 do 8 - gracz X: "))
        if plansza[ruch] == "-" and plansza[ruch] !="O":
            plansza[ruch] = gracz1
            print("Udało ci sie")
            if sprawdz_wygrana_gracza1(plansza):
                print("WYGRANA!!! :) ")
                exit()
        else:
            print("zajęte")

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