# Lag klassen Brett. Et brett er et rutenett på 3*3 ruter, hvor hver rute representeres ved et objekt av klassen Rute. Datastrukturen er en nøstet liste, og rute-objekter opprettes i konstruktøren. Konstruktøren oppretter også to referanser til spiller-objekter som i utgangspunktet settes til None. # Skriv en metode legg_til_spiller(self, symbol). Metoden oppretter et Spiller-objekt med symbolet gitt som parameter, og setter inn dette objektet i en ledig spiller-referanse. Om ingen spiller-referanser er ledig, printes en beskjed om at det allerede eksisterer to spillere. # Skriv en metode plasser_brikke(self, spiller, x, y). Spilleren gitt i parameteren forsøker å plassere en brikke i ruten på plass [x][y]. Sjekk om det er mulig å plassere en brikke på denne plassen, og send i så fall korrekt spiller-referanse til ruten i posisjonen. Om ruten allerede er tatt, printes en beskjed om dette. # Skriv en metode sjekk_vinner(self) i klassen Brett. Denne sjekker alle ruter horisontalt og vertikalt, og returnerer None dersom ingen har vunnet. Om en spiller har tre brikker på rad i noen av retningene, returnerer den symbolet til spilleren som har vunnet. Ekstra: Sjekk også om en spiller har tre brikker på rad diagonalt. # Skriv en metode spill(self) i klassen Brett. Denne gjør følgende: # Sjekker at det eksisterer to spillere. # I en løkke: # ● Lar spillerne vekselvis forsøke å plassere brikke ved input av x- og y-koordinat på spillebrettet. Om valget er ugyldig (utenfor brettet eller opptatt rute) skal spilleren få forsøke igjen. # ● Hver gang en brikke er plassert, sjekkes det om noen har vunnet. Om det finnes en vinner, printes vinnerens symbol og spillet er over. # ● Om alle ruter er utfylt og det ikke finnes en vinner, printes det «Ingen vinner», og spillet avsluttes. from rute import Rute from spiller import Spiller class Brett: def __init__(self): # Bruker hjelpemetoden for å opprette brettet self._brett = self._lag_brett() self._spiller1 = None self._spiller2 = None # Hjelpemetode for å opprette brettet def _lag_brett(self): brett = [[], [], []] for rad in brett: for i in range(3): rad.append(Rute()) return brett def legg_til_spiller(self, symbol): spiller = Spiller(symbol) if self._spiller1 is None: self._spiller1 = spiller elif self._spiller2 is None: # Sjekker om det er samme symbol som spiller1 før man setter spiller2 if self._spiller1.hent_symbol() == symbol: print("Det finnes allerede en spiller med dette symbolet") else: self._spiller2 = spiller else: print("Det er allerede 2 spillere") def plasser_brikke(self, spiller, x, y): # Om koordinatene er utenfor brettet if not ((0 <= x <= 2) and (0 <= y <= 2)): print("Ugyldige koordinater, oppgi 0, 1, eller 2 som koordinat") return False # Om ruten allerede er tatt elif self._brett[x][y].er_opptatt(): print("Denne ruten er allerede tatt") return False else: self._brett[x][y].plasser_brikke(spiller) return True def sjekk_vinner(self): # Sjekker om det er tre på rad horisontalt for rad in self._brett: if rad[0].hent_brikkeeier() == rad[1].hent_brikkeeier() == rad[2].hent_brikkeeier() is not None: return rad[0].hent_brikkeeier().hent_symbol() # Sjekker om det er tre på rad vertikalt for kol in range(3): if self._brett[0][kol].hent_brikkeeier() == self._brett[1][kol].hent_brikkeeier() == self._brett[2][kol].hent_brikkeeier() is not None: return self._brett[0][kol].hent_brikkeeier().hent_symbol() # Ekstra (sjekke diagonalt) if self._brett[0][0].hent_brikkeeier() == self._brett[1][1].hent_brikkeeier() == self._brett[2][2].hent_brikkeeier() is not None: return self._brett[0][0].hent_brikkeeier().hent_symbol() if self._brett[0][2].hent_brikkeeier() == self._brett[1][1].hent_brikkeeier() == self._brett[2][0].hent_brikkeeier() is not None: return self._brett[0][2].hent_brikkeeier().hent_symbol() # Alternativ løsning for ekstra-oppgaven ''' brikke = self._brett[1][1].hent_brikkeeier() if (brikke is not None) and ((brikke == self._brett[0][0].hent_brikkeeier() == self._brett[2][2].hent_brikkeeier()) or (brikke == self._brett[0][2].hent_brikkeeier() == self._brett[2][0].hent_brikkeeier())): return brikke.hent_symbol() ''' # Returnerer None hvis det ikke er tre på rad return None def spill(self): # Sjekker om det eksisterer to spillere if self._spiller1 is None or self._spiller2 is None: print("Det er ikke nok spillere for å spille") else: trekk = 0 spiller = self._spiller1 # Løkke som går så lenge brettet ikke er fullt (trekk == 9) og det ikke er noen vinner while trekk < 9 and self.sjekk_vinner() is None: print(f"\n{spiller.hent_symbol()} sin tur til å plassere en brikke") x = int(input("X-koordinater: ")) y = int(input("Y-koordinater: ")) plassert = self.plasser_brikke(spiller, x, y) # Hvis de får plassert (aka koordinater innenfor brettet og rute ikke tatt) bytter vi spiller og øker trekk med 1 if plassert: if spiller == self._spiller1: spiller = self._spiller2 else: spiller = self._spiller1 trekk += 1 self.print_brett() # Printer brettet (ikke egt en del av oppgaven!) if not self.sjekk_vinner(): print("Ingen vinner") else: print(f"{self.sjekk_vinner()} vant spillet!") # Metode for å printe brettet (ikke egt en del av oppgaven!!!) def print_brett(self): for i in range(0, 3): for j in range(0, 3): if self._brett[i][j].hent_brikkeeier(): print(self._brett[i][j].hent_brikkeeier().hent_symbol(), end=" ") else: print("-", end=" ") print()