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

Błąd w grze "KÓŁKO I KRZYŻYK"
IG
  • Rejestracja:prawie 3 lata
  • Ostatnio:prawie 2 lata
  • Postów:27
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?

Kopiuj
("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)
~~~
edytowany 1x, ostatnio: Riddle
HE
ruch = int(input("Podaj cyfre od 0 do 8 - gracz X: ")) - wprowadzasz int jako ruch, if plansza[ruch] == "-" and plansza[ruch] !="X": - sprawdzasz string
WY
  • Rejestracja:prawie 3 lata
  • Ostatnio:prawie 2 lata
  • Postów:13
0

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

edytowany 4x, ostatnio: Wylluzowany
AO
  • Rejestracja:około 3 lata
  • Ostatnio:4 miesiące
  • Postów:36
0

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

edytowany 1x, ostatnio: AlanOGLL
IG
  • Rejestracja:prawie 3 lata
  • Ostatnio:prawie 2 lata
  • Postów:27
0

@AlanOGLL:
Poprawiłem, ale dalej jest problem

Kopiuj
    else:
        print("zajęte")
        ruch = int(input("Podaj cyfre od 0 do 8 - gracz O: "))
        plansza[ruch] = gracz2
edytowany 1x, ostatnio: Riddle
AO
Teraz to działa tak, że jeżeli komputer wylosuje dla gracza2 zajęte pole, to użytkownik musi je wpisać.
SE
  • Rejestracja:około 6 lat
  • Ostatnio:4 dni
  • Postów:321
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.

AO
  • Rejestracja:około 3 lata
  • Ostatnio:4 miesiące
  • Postów:36
0

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

Kopiuj
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()
_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:3 miesiące
0

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

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

Bo sprawdzasz wygraną wewnątrz ruchu.

Kopiuj
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")

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
edytowany 1x, ostatnio: _13th_Dragon
SE
W zasadzie to sie zastanawiam po cosprawdz_wygrana_gracza jest wolane w tej petli, skoro funkcje ruch tez sprawdzaja wygrana za pomoca tych funkcji :P.
_13th_Dragon
Pewnie dodał w funkcjach po tym jak dwa wywołania na końcu źle działały

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.