Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # Ristinolla peli
- # Otto Peltola
- # opiskelijanumero 281969
- # Ohjelma on 3x3 ristinollapeli joka hyödyntää graaffista käyttöliittymää
- from tkinter import *
- import tkinter.messagebox
- class Ristinolla:
- def __init__(self):
- self.__window = Tk()
- self.__window.title("Ristionolla")
- # Määritellään muuttujia, joita hyödynnetään pelin kulun seuraamisessa.
- self.__merkki = "X"
- self.__vuoronumero = 0
- # luodaan napit, jotka tulevat esiin pelin loputtua.
- self.__lopeta_nappi = Button(self.__window, text="Lopeta peli",
- command=self.__window.destroy)
- self.__uudestaan = Button(self.__window, text="Pelaa uudestaan",
- command=self.uusipeli)
- # Luodaan pelaajien nimikentät
- pelaaja1_label = Label(self.__window, text="Pelaaja 1:")
- pelaaja1_label.grid(row=1, column=0)
- self.__pelaaja1_entry = Entry(self.__window, bd=5)
- self.__pelaaja1_entry.grid(row=1, column=1, columnspan=8)
- pelaaja2_label = Label(self.__window, text="Pelaaja 2:")
- pelaaja2_label.grid(row=2, column=0)
- self.__pelaaja2_entry = Entry(self.__window, bd=5)
- self.__pelaaja2_entry.grid(row=2, column=1, columnspan=8)
- # luodaan tyhjä 3x3 ristinolla taulukko nappeja käyttäen
- # Tallennetaan napit listaan
- self.napit = []
- for i in range(9):
- uusinappi = Button(self.__window, disabledforeground="white",
- activebackground='black', bg="black",
- text="", height=5, width=10,
- command=lambda nappi=i:
- self.nappia_painetaan(nappi))
- if i < 3:
- uusinappi.grid(row=i + 3, column=1)
- elif i < 6:
- uusinappi.grid(row=i, column=2)
- elif i <= 9:
- uusinappi.grid(row=i - 3, column=3)
- self.napit.append(uusinappi)
- def peli_ohi_lukitus(self):
- # Kun peli päättyy napit lukitaan,
- # jotta samaa peliä ei voi jatkaa voittajan löytyessä.
- for nappi in self.napit:
- nappi["state"] = DISABLED
- def nappia_painetaan(self, nappi):
- # toteutetaan napin painaminen eli ristin tai nollan sijoitus ruudukkoon
- self.__vuoronumero = self.__vuoronumero + 1
- if self.napit[nappi]["text"] == "":
- self.napit[nappi]["text"] = self.__merkki
- self.napit[nappi]["state"] = DISABLED
- if self.__merkki == "X":
- self.__merkki = "O"
- else:
- self.__merkki = "X"
- # tarkistetaan loppuuko peli ruudun aina valinnan jälkeen
- self.tarkista_voitto()
- def tarkista_voitto(self):
- # käydään läpi kaikki mahdolliset voitto tilanteet
- # ja nostetaan pop up joka ilmoittaa voittajan
- if self.napit[0]["text"] == self.napit[1]["text"] \
- == self.napit[2]["text"] != "" \
- or self.napit[0]["text"] == self.napit[3]["text"] \
- == self.napit[6]["text"] != "" \
- or self.napit[0]["text"] == self.napit[4]["text"] \
- == self.napit[8]["text"] != "" \
- or self.napit[3]["text"] == self.napit[4]["text"] \
- == self.napit[5]["text"] != "" \
- or self.napit[6]["text"] == self.napit[7]["text"] \
- == self.napit[8]["text"] != "" \
- or self.napit[6]["text"] == self.napit[4]["text"] \
- == self.napit[2]["text"] != "" \
- or self.napit[1]["text"] == self.napit[4]["text"] \
- == self.napit[7]["text"] != "" \
- or self.napit[2]["text"] == self.napit[5]["text"] \
- == self.napit[8]["text"] != "":
- # Voittaja päätellään siitä, kenen vuorolla voitto tapahtui
- if self.__vuoronumero % 2 == 0:
- pelaaja = self.__pelaaja2_entry.get()
- if pelaaja == "":
- # Jos nimikenttä jätetään tyhjäksi
- # niin voittajan nimeksi tulee vain Pelaaja 2 tai Pelaaja 1
- pelaaja = "Pelaaja 2"
- voittoviesti = str(pelaaja) + " voitti!"
- tkinter.messagebox.showinfo("Ristinolla", voittoviesti)
- if self.__vuoronumero % 2 == 1:
- pelaaja = self.__pelaaja1_entry.get()
- if pelaaja == "":
- # Jos nimikenttä jätetään tyhjäksi
- # niin voittajan nimeksi tulee vain Pelaaja 2 tai Pelaaja 1
- pelaaja = "Pelaaja 1"
- voittoviesti = str(pelaaja) + " voitti!"
- tkinter.messagebox.showinfo("Ristinolla", voittoviesti)
- # sijoitetaan 2 uutta nappulaa jolla pelin voi aloittaa alusta
- # tai ohjelman voi sulkea
- self.__lopeta_nappi.grid(row=6, column=1, columnspan=8)
- self.__uudestaan.grid(row=7, column=1, columnspan=8)
- self.peli_ohi_lukitus()
- # Jos voittajaa ei ole löytynyt vuoroon 9 mennessä tulee tasapeli
- elif self.__vuoronumero == 9:
- # sijoitetaan 2 uutta nappulaa jolla pelin voi aloittaa alusta
- # tai ohjelman voi sulkea
- tkinter.messagebox.showinfo("Ristinolla", "Tasapeli !")
- self.__lopeta_nappi.grid(row=6, column=1, columnspan=8)
- self.__uudestaan.grid(row=7, column=1, columnspan=8)
- def uusipeli(self):
- # Metodi aloittaa uuden pelin nollaamalla laskurit
- # ja palauttamalla napit tyhjiksi ja aktiivisiksi
- for nappi in self.napit:
- nappi["text"] = ""
- nappi["state"] = ACTIVE
- self.__vuoronumero = 0
- self.__merkki = "X"
- self.__lopeta_nappi.grid_remove()
- self.__uudestaan.grid_remove()
- def start(self):
- self.__window.mainloop()
- def main():
- ui = Ristinolla()
- ui.start()
- main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement