Gra Kółko i krzyżyk

0

Witam
Chcę stworzyć prostą grę - kółko i krzyżyk
Wszystko działa oprócz tego że przy ponownym restarcie gry po wygranej lub remisie wyskakuje następujący błąd:
Traceback (most recent call last):
File "C:\Users\OneDrive\Pulpit_\Python\kolkokrzyzyk\kik\kik\kik.py", line 188, in <module>
RestartujGre()
File "C:\Users\OneDrive\Pulpit_\Python\kolkokrzyzyk\kik\kik\kik.py", line 172, in RestartujGre
SprawdzPole()
File "C:\Users\OneDrive\Pulpit_\Python\kolkokrzyzyk\kik\kik\kik.py", line 154, in SprawdzPole
SprawdzWygrana()
File "C:\Users\OneDrive\Pulpit_\Python\kolkokrzyzyk\kik\kik\kik.py", line 81, in SprawdzWygrana
if ((Plansza[Wiersz][0] == Plansza[Wiersz][1] == Plansza[Wiersz][2]) and (Plansza[Wiersz][0] is not None)):
IndexError: list index out of range

Oto kod:

import pygame as pg, sys, time
from pygame.locals import*

CzyjaTura = 'x'
KtoWygral = None
Remis = False

Szerokosc = 400
Wysokosc = 400

Bialy = (255, 255, 255)
Czarny = (0, 0, 0)
Czerwony = (255, 0, 0)

PunktyX = 0
PunktyO = 0

Plansza = [ [None] *3, [None] *3, [None] * 3]


pg.init()
FPS = 30
Zegar = pg.time.Clock()
Ekran = pg.display.set_mode((Szerokosc, Wysokosc +200), 0, 32)
pg.display.set_caption("Kolko i Krzyzyk")


PlanszaStartowa = pg.image.load('planszastartowa.jpg')
ObrazekX = pg.image.load('krzyzyk.jpg')
ObrazekO = pg.image.load('kolko.jpg')

ObrazekX = pg.transform.scale(ObrazekX, (80, 80))
ObrazekO = pg.transform.scale(ObrazekO, (80, 80))



def RysujPlansze():
    Ekran.blit(PlanszaStartowa, (0, 0))
    pg.display.update()
    time.sleep(1)
    Ekran.fill(Bialy)

    pg.draw.line(Ekran, Czarny, (Szerokosc /3, 0), (Szerokosc /3, Wysokosc), 7)
    pg.draw.line(Ekran, Czarny, (Szerokosc /3*2, 0), (Szerokosc /3*2, Wysokosc), 7)

    pg.draw.line(Ekran, Czarny, (0, Wysokosc /3), (Szerokosc, Wysokosc /3), 7)
    pg.draw.line(Ekran, Czarny, (0, Wysokosc /3*2), (Szerokosc, Wysokosc /3*2), 7)

    pg.display.update()
    RysujDodatkoweInformacje()

def RysujDodatkoweInformacje():
    global Remis

    if KtoWygral is None:
        TrescWiadomosci = "Twoja tura: " + CzyjaTura.upper()
    else:
        TrescWiadomosci = KtoWygral.upper() + " wygrales"
    if Remis:
        TrescWiadomosci = "Remis"

    Czcionka = pg.font.Font(None, 30)
    Wiadomosc = Czcionka.render(TrescWiadomosci, True, Bialy)

    Punkty = "X: " + str(PunktyX) + " <---> O: " + str(PunktyO)
    PunktyWiadomosc = Czcionka.render(Punkty, True, Czarny)

    ObramowanieNaWiadomosc = Wiadomosc.get_rect(center = (Szerokosc /2, 500 -50))
    ObramowanieNaPunkty = PunktyWiadomosc.get_rect(center = (Szerokosc /2, 600 -50))

    Ekran.fill((0, 0, 0), (0, 400, 500, 100))
    Ekran.blit(Wiadomosc, ObramowanieNaWiadomosc)
    Ekran.blit(PunktyWiadomosc, ObramowanieNaPunkty)

    pg.display.update()

def SprawdzWygrana():
    global Plansza, KtoWygral, Remis

    for Wiersz in range (0,3):
        if ((Plansza[Wiersz][0] == Plansza[Wiersz][1] == Plansza[Wiersz][2]) and (Plansza[Wiersz][0] is not None)):
            KtoWygral = Plansza[Wiersz][0]
            pg.draw.line(Ekran, (0, 0, 0), (0, (Wiersz +1) * Wysokosc /3 - Wysokosc /6), (Szerokosc, (Wiersz + 1) * Wysokosc /3 - Wysokosc /6), 4)
            break

    for Kolumna in range (0,3):
        if ((Plansza[0][Kolumna] == Plansza[1][Kolumna] == Plansza[2][Kolumna]) and (Plansza[0][Kolumna] is not None)):
            KtoWygral = Plansza[0][Kolumna]
            pg.draw.line(Ekran, (0, 0, 0), ((Kolumna +1) * Szerokosc /3 - Szerokosc /6, 0), ((Kolumna +1) * Szerokosc /3 - Szerokosc /6, Szerokosc), 4)
            break

    if ((Plansza[0][0] == Plansza[1][1] == Plansza[2][2] and Plansza[0][0] is not None)):
        KtoWygral = Plansza[0][0]
        pg.draw.line(Ekran, (0, 0, 0), (50,50), (350,350), 4)
    if ((Plansza[0][0] == Plansza[1][1] == Plansza[2][2]) and (Plansza[0][0] is not None)):
        KtoWygral = Plansza[0][0]
        pg.draw.line(Ekran, (0, 0, 0), (350,350), (50,50), 4)

    if(all ([all (Wiersz) for Wiersz in Plansza]) and KtoWygral is None):
        Remis = True

    RysujDodatkoweInformacje()

def NarysujSymbol(Wiersz, Kolumna):
    global Plansza, CzyjaTura

    if Wiersz == 1:
        PozycjaX = 30
    elif Wiersz == 2:
        PozycjaX = Szerokosc /3+30
    elif Wiersz == 3:
        PozycjaX = Szerokosc /3*2+30

    if Kolumna == 1:
        PozycjaY = 30
    elif Kolumna == 2:
        PozycjaY = Wysokosc /3+30
    elif Kolumna == 3:
        PozycjaY = Wysokosc /3*2+30

    Plansza [Wiersz - 1][Kolumna - 1] = CzyjaTura
    if  (CzyjaTura == 'x'):
        Ekran.blit(ObrazekX, (PozycjaY, PozycjaX))
        CzyjaTura = 'o'
    elif (CzyjaTura == 'o'):
        Ekran.blit(ObrazekO, (PozycjaY, PozycjaX))
        CzyjaTura = 'x'
    pg.display.update()

def SprawdzPole():
    X,Y = pg.mouse.get_pos()

    if (X < Szerokosc /3):
        Kolumna = 1
    elif (X < Szerokosc /3*2):
        Kolumna = 2
    elif (X < Szerokosc):
        Kolumna = 3
    else:
        Kolumna = None

    if (Y < Wysokosc /3):
        Wiersz = 1
    elif (Y < Wysokosc /3*2):
        Wiersz = 2
    elif (Y < Wysokosc):
        Wiersz = 3
    else:
        Wiersz = None

    if (Wiersz and Kolumna and Plansza[Wiersz - 1][Kolumna - 1] is None):
        global CzyjaTura
        NarysujSymbol(Wiersz, Kolumna)
        SprawdzWygrana()
        pg.display.update()

def RestartujGre():
    global Plansza, KtoWygral, CzyjaTura, Remis, PunktyX, PunktyO
    time.sleep(3)
    CzyjaTura = 'x'
    Remis = False

    if KtoWygral == 'x':
        PunktyX +=1
    elif KtoWygral == 'o':
        PunktyO +=1

    KtoWygral = None
    Plansza = [[None] *3, [None] *3]
    Ekran.fill(Bialy)
    RysujPlansze()
    SprawdzPole()

RysujPlansze()

pg.display.update()
Zegar.tick(FPS)

while (True):
    for Zdarzenie in pg.event.get():
        if Zdarzenie.type == QUIT:
            pg.quit()
            sys.exit()
        elif Zdarzenie.type == MOUSEBUTTONDOWN:
            if (Zdarzenie.button is 1):
                SprawdzPole()
                if (KtoWygral == 'x' or KtoWygral == 'o'or Remis == True):
                    RestartujGre()

Proszę o pomoc

0

Debugger do ręki i sprawdź co tam się dzieje, komunikat jest czytelny - wychodzisz poza zakres tablicy.

2

Funkcja RestartujGre() tworzy planszę w inny sposób, niż robisz to na początku skryptu.
Powinno być Plansza = [ [None] *3, [None] *3, [None] * 3], a nie Plansza = [[None] *3, [None] *3].


Żeby kod był trochę lepszy, dobrze by było uniknąć takich podwójnych inicjacji.
Po prostu po uruchomieniu skryptu trzeba wykonać RestartujGre(), żeby ustawić wartości wszystkich zmiennych.

Ponadto, żeby się pozbyć tego brzydkiego global w funkcjach, powinieneś zrobić klasę, inicjować jej pola w def __init__(self): i odwoływać się do nich self.Plansza, self.PunktyX itd.

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