Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: Python: Mastermindin kaltainen peli

koodaaja [19.06.2022 10:17:34]

#

Tässä on Pythonilla tehty Mastermindin-kaltainen peli. Pelissä täytyy päätellä koodi käyttäen apuna tietoa oikeista väreistä ja siitä mitkä värit ovat oikessa paikassa. Tässä versiossa värejä on kuusi ja paikkoja neljä. Yrityskertojen määrää ei ole rajattu. Valinnat tehdään radiobuttoneilla.

import random
import math
from tkinter import *


root = Tk()

variYksi = IntVar()
variKaksi = IntVar()
variKolme = IntVar()
variNelja = IntVar()

#Luodaan kehykset
kehys1 = Frame(root,bd=10,relief=RIDGE)
kehys1.grid(row=0,column=0,padx=30)

kehys2 = Frame(root,bd=10,relief=RIDGE)
kehys2.grid(row=0,column=1,padx=30)


kehys3 = Frame(root,bd=10,relief=RIDGE)
kehys3.grid(row=0,column=2,padx=30)


kehys4 = Frame(root,bd=10,relief=RIDGE)
kehys4.grid(row=0,column=3,padx=30)

kehys_tekstit = Frame(root,bd=10,relief=RIDGE)
kehys_tekstit.grid(row=1,column=0,padx=30)

kehys_nappaimet = Frame(root,bd=10,relief=RIDGE)
kehys_nappaimet.grid(row=1,column=2,padx=30)

#Luodaan tekstit

varit_string = StringVar()
varit_string.set("1")

paikat_string = StringVar()
paikat_string.set("2")

teksti_varit = Label(kehys_tekstit,textvariable=varit_string,font=("arial",40)).pack()

teksti_paikat = Label(kehys_tekstit,textvariable=paikat_string,font=("arial",40)).pack()

oikeat_varit = 0
oikeat_paikat = 0
voitto = False
koodi = []
varit = []
paikat = []

def Koodi():
 global koodi
 #Arvotaan koodi
 for i in range(4):
   koodi.append(random.randint(1,6))


def Tarkistus():
  global oikeat_varit, oikeat_paikat,varit, koodi,voitto
  #Tarkistetaan koodi
  #Tarkistuksessa katsotaan oikeat värit ja mitkä värit ovat oikeassa paikassa
  temp = []
  temp2 = []
  temp.clear()
  for i in range(len(varit)):
   temp.append(varit[i])

  temp2.clear()
  for i in range(len(koodi)):
   temp2.append(koodi[i])

  oikeat_varit = 0
  oikeat_paikat = 0
  #Katsotaan oikeat paikat

  for i in range(len(temp)):
     if (temp[i] == temp2[i]):
       oikeat_paikat += 1
  #Katsotaan oikeat värit
  temp.sort()
  temp2.sort()

  for i in range(len(temp)):

    for j in range(len(temp2)):
      if  (temp[i] == temp2[j]):
        temp[i] = -1
        temp2[j] = -1
        oikeat_varit += 1
        break

  #Näytetään tulokset
  varit_string.set("Värit:"+str(oikeat_varit))
  paikat_string.set("Paikat:"+str(oikeat_paikat))
  if (oikeat_paikat == 4):
   paikat_string.set("Voitit")
   voitot = True


def Uudestaan():
 global voitto,koodi,oikeat_paikat
 #Aloitetaan alusta
 voitto = False
 oikeat_paikat = 0
 varit_string.set("Värit")
 paikat_string.set("Paikat")
 koodi.clear()

 Koodi()



def Arvaa():
 global voitto,koodi,varit,oikeat_paikat
 varit.clear()
 if (not voitto and oikeat_paikat < 4):
   #Tallennetaan varit ja paikat
   varit.append(variYksi.get())
   varit.append(variKaksi.get())
   varit.append(variKolme.get())
   varit.append(variNelja.get())
   Tarkistus()

#Luodaan näppäimet

uudestaan = Button(kehys_nappaimet,text="Uudestaan",bd=5,command=Uudestaan).pack()

arvaa = Button(kehys_nappaimet,text="Arvaa",bd=5,command=Arvaa).pack()

#Luodaan valinnat
radio1a = Radiobutton(kehys1,text="punainen",variable=variYksi,value=1)
radio1a.pack()

radio1b = Radiobutton(kehys1,text="keltainen",variable=variYksi,value=2)
radio1b.pack()

radio1c = Radiobutton(kehys1,text="vihreä",variable=variYksi,value=3)
radio1c.pack()

radio1d = Radiobutton(kehys1,text="sininen",variable=variYksi,value=4)
radio1d.pack()

radio1e = Radiobutton(kehys1,text="oranssi",variable=variYksi,value=5)
radio1e.pack()

radio1f = Radiobutton(kehys1,text="ruskea",variable=variYksi,value=6)
radio1f.pack()

#Toinen
radio2a = Radiobutton(kehys2,text="punainen",variable=variKaksi,value=1)
radio2a.pack()

radio2b = Radiobutton(kehys2,text="keltainen",variable=variKaksi,value=2)
radio2b.pack()

radio2c = Radiobutton(kehys2,text="vihreä",variable=variKaksi,value=3)
radio2c.pack()

radio2d = Radiobutton(kehys2,text="sininen",variable=variKaksi,value=4)
radio2d.pack()

radio2e = Radiobutton(kehys2,text="oranssi",variable=variKaksi,value=5)
radio2e.pack()

radio2f = Radiobutton(kehys2,text="ruskea",variable=variKaksi,value=6)
radio2f.pack()


#Kolmas valinta

radio3a = Radiobutton(kehys3,text="punainen",variable=variKolme,value=1)
radio3a.pack()

radio3b = Radiobutton(kehys3,text="keltainen",variable=variKolme,value=2)
radio3b.pack()

radio3c = Radiobutton(kehys3,text="vihreä",variable=variKolme,value=3)
radio3c.pack()

radio3d = Radiobutton(kehys3,text="sininen",variable=variKolme,value=4)
radio3d.pack()

radio3e = Radiobutton(kehys3,text="oranssi",variable=variKolme,value=5)
radio3e.pack()

radio3f = Radiobutton(kehys3,text="ruskea",variable=variKolme,value=6)
radio3f.pack()

#Neljäs valinta

radio4a = Radiobutton(kehys4,text="punainen",variable=variNelja,value=1)
radio4a.pack()

radio4b = Radiobutton(kehys4,text="keltainen",variable=variNelja,value=2)
radio4b.pack()

radio4c = Radiobutton(kehys4,text="vihreä",variable=variNelja,value=3)
radio4c.pack()

radio4d = Radiobutton(kehys4,text="sininen",variable=variNelja,value=4)
radio4d.pack()

radio4e = Radiobutton(kehys4,text="oranssi",variable=variNelja,value=5)
radio4e.pack()

radio4f = Radiobutton(kehys4,text="ruskea",variable=variNelja,value=6)
radio4f.pack()

Koodi()
root.mainloop()

Metabolix [20.06.2022 12:05:07]

#

Oletko harkinnut koodaamista ilman copy-pastea? Voisit muuttaa tuon 4x6 painikkeen luonnin toimimaan lyhyellä silmukalla, koska niissä vaihtuu vain teksti ja numero.

groovyb [20.06.2022 23:10:10]

#

Metabolix kirjoitti:

Oletko harkinnut koodaamista ilman copy-pastea? Voisit muuttaa tuon 4x6 painikkeen luonnin toimimaan lyhyellä silmukalla, koska niissä vaihtuu vain teksti ja numero.

Noh, osa koodaamisen opettelua on toki parannella ja refaktoroida koodia aina taitojen parantuessa. Se kuitenkaan ei ole automaatio, että jokainen ohjelmoinnin aloittava henkilö on välittömästi ammattilainen. Joten kyse tuskin on harkitsemisesta, vaan tuotos on sen hetkisten taitojen lopputulos ja saa olla ylpeä kun saa toimivaa aikaan.

Metabolix [21.06.2022 11:47:12]

#

groovyb kirjoitti:

Joten kyse tuskin on harkitsemisesta, vaan tuotos on sen hetkisten taitojen lopputulos

Kai siinä jotain harkintaa täytyy olla, jos on aikaa koodata näin paljon mutta koodi on tässä suhteessa ihan samanlaista kuin jo pari vuotta sitten. Jos aikoo edistyä, jossain vaiheessa pitää ihan tietoisesti tehdä uusia asioita.

Vastaus

Muista lukea kirjoitusohjeet.
Tietoa sivustosta