Advertisement
Guest User

Untitled

a guest
Dec 8th, 2019
110
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.06 KB | None | 0 0
  1. # Ristinolla peli
  2. # Otto Peltola
  3. # opiskelijanumero 281969
  4. # Ohjelma on 3x3 ristinollapeli joka hyödyntää graaffista käyttöliittymää
  5.  
  6. from tkinter import *
  7. import tkinter.messagebox
  8.  
  9.  
  10. class Ristinolla:
  11.  
  12.     def __init__(self):
  13.         self.__window = Tk()
  14.         self.__window.title("Ristionolla")
  15.  
  16.         # Määritellään muuttujia, joita hyödynnetään pelin kulun seuraamisessa.
  17.         self.__merkki = "X"
  18.         self.__vuoronumero = 0
  19.  
  20.         # luodaan napit, jotka tulevat esiin pelin loputtua.
  21.         self.__lopeta_nappi = Button(self.__window, text="Lopeta peli",
  22.                                      command=self.__window.destroy)
  23.         self.__uudestaan = Button(self.__window, text="Pelaa uudestaan",
  24.                                   command=self.uusipeli)
  25.  
  26.         # Luodaan pelaajien nimikentät
  27.         pelaaja1_label = Label(self.__window, text="Pelaaja 1:")
  28.         pelaaja1_label.grid(row=1, column=0)
  29.         self.__pelaaja1_entry = Entry(self.__window, bd=5)
  30.         self.__pelaaja1_entry.grid(row=1, column=1, columnspan=8)
  31.         pelaaja2_label = Label(self.__window, text="Pelaaja 2:")
  32.         pelaaja2_label.grid(row=2, column=0)
  33.         self.__pelaaja2_entry = Entry(self.__window, bd=5)
  34.         self.__pelaaja2_entry.grid(row=2, column=1, columnspan=8)
  35.  
  36.         # luodaan tyhjä 3x3 ristinolla taulukko nappeja käyttäen
  37.         # Tallennetaan napit listaan
  38.  
  39.         self.napit = []
  40.         for i in range(9):
  41.             uusinappi = Button(self.__window, disabledforeground="white",
  42.                                activebackground='black', bg="black",
  43.                                text="", height=5, width=10,
  44.                                command=lambda nappi=i:
  45.                                self.nappia_painetaan(nappi))
  46.             if i < 3:
  47.                 uusinappi.grid(row=i + 3, column=1)
  48.             elif i < 6:
  49.                 uusinappi.grid(row=i, column=2)
  50.             elif i <= 9:
  51.                 uusinappi.grid(row=i - 3, column=3)
  52.  
  53.             self.napit.append(uusinappi)
  54.  
  55.     def peli_ohi_lukitus(self):
  56.         # Kun peli päättyy napit lukitaan,
  57.         # jotta samaa peliä ei voi jatkaa voittajan löytyessä.
  58.         for nappi in self.napit:
  59.             nappi["state"] = DISABLED
  60.  
  61.     def nappia_painetaan(self, nappi):
  62.         # toteutetaan napin painaminen eli ristin tai nollan sijoitus ruudukkoon
  63.         self.__vuoronumero = self.__vuoronumero + 1
  64.         if self.napit[nappi]["text"] == "":
  65.             self.napit[nappi]["text"] = self.__merkki
  66.             self.napit[nappi]["state"] = DISABLED
  67.  
  68.             if self.__merkki == "X":
  69.                 self.__merkki = "O"
  70.             else:
  71.                 self.__merkki = "X"
  72.  
  73.             # tarkistetaan loppuuko peli ruudun aina valinnan jälkeen
  74.             self.tarkista_voitto()
  75.  
  76.     def tarkista_voitto(self):
  77.         # käydään läpi kaikki mahdolliset voitto tilanteet
  78.         # ja nostetaan pop up joka ilmoittaa voittajan
  79.         if self.napit[0]["text"] == self.napit[1]["text"] \
  80.                 == self.napit[2]["text"] != "" \
  81.                 or self.napit[0]["text"] == self.napit[3]["text"] \
  82.                 == self.napit[6]["text"] != "" \
  83.                 or self.napit[0]["text"] == self.napit[4]["text"] \
  84.                 == self.napit[8]["text"] != "" \
  85.                 or self.napit[3]["text"] == self.napit[4]["text"] \
  86.                 == self.napit[5]["text"] != "" \
  87.                 or self.napit[6]["text"] == self.napit[7]["text"] \
  88.                 == self.napit[8]["text"] != "" \
  89.                 or self.napit[6]["text"] == self.napit[4]["text"] \
  90.                 == self.napit[2]["text"] != "" \
  91.                 or self.napit[1]["text"] == self.napit[4]["text"] \
  92.                 == self.napit[7]["text"] != "" \
  93.                 or self.napit[2]["text"] == self.napit[5]["text"] \
  94.                 == self.napit[8]["text"] != "":
  95.  
  96.             # Voittaja päätellään siitä, kenen vuorolla voitto tapahtui
  97.             if self.__vuoronumero % 2 == 0:
  98.                 pelaaja = self.__pelaaja2_entry.get()
  99.                 if pelaaja == "":
  100.                     # Jos nimikenttä jätetään tyhjäksi
  101.                     # niin voittajan nimeksi tulee vain Pelaaja 2 tai Pelaaja 1
  102.                     pelaaja = "Pelaaja 2"
  103.                 voittoviesti = str(pelaaja) + " voitti!"
  104.                 tkinter.messagebox.showinfo("Ristinolla", voittoviesti)
  105.             if self.__vuoronumero % 2 == 1:
  106.                 pelaaja = self.__pelaaja1_entry.get()
  107.                 if pelaaja == "":
  108.                     # Jos nimikenttä jätetään tyhjäksi
  109.                     # niin voittajan nimeksi tulee vain Pelaaja 2 tai Pelaaja 1
  110.                     pelaaja = "Pelaaja 1"
  111.                 voittoviesti = str(pelaaja) + " voitti!"
  112.                 tkinter.messagebox.showinfo("Ristinolla", voittoviesti)
  113.  
  114.             # sijoitetaan 2 uutta nappulaa jolla pelin voi aloittaa alusta
  115.             # tai ohjelman voi sulkea
  116.             self.__lopeta_nappi.grid(row=6, column=1, columnspan=8)
  117.             self.__uudestaan.grid(row=7, column=1, columnspan=8)
  118.             self.peli_ohi_lukitus()
  119.  
  120.         # Jos voittajaa ei ole löytynyt vuoroon 9 mennessä tulee tasapeli
  121.         elif self.__vuoronumero == 9:
  122.             # sijoitetaan 2 uutta nappulaa jolla pelin voi aloittaa alusta
  123.             # tai ohjelman voi sulkea
  124.             tkinter.messagebox.showinfo("Ristinolla", "Tasapeli !")
  125.             self.__lopeta_nappi.grid(row=6, column=1, columnspan=8)
  126.             self.__uudestaan.grid(row=7, column=1, columnspan=8)
  127.  
  128.     def uusipeli(self):
  129.         # Metodi aloittaa uuden pelin nollaamalla laskurit
  130.         # ja palauttamalla napit tyhjiksi ja aktiivisiksi
  131.         for nappi in self.napit:
  132.             nappi["text"] = ""
  133.             nappi["state"] = ACTIVE
  134.         self.__vuoronumero = 0
  135.         self.__merkki = "X"
  136.         self.__lopeta_nappi.grid_remove()
  137.         self.__uudestaan.grid_remove()
  138.  
  139.     def start(self):
  140.         self.__window.mainloop()
  141.  
  142.  
  143. def main():
  144.     ui = Ristinolla()
  145.     ui.start()
  146.  
  147.  
  148. main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement