To delo je na voljo pod pogoji slovenske licence Creative Commons 2.5:
priznanje avtorstva - nekomercialno - deljenje pod enakimi pogoji.
Celotna licenca je na voljo na spletu na naslovu http://creativecommons.org/licenses/by-nc-sa/2.5/si/. V skladu s to licenco je dovoljeno vsakemu uporabniku delo razmnoževati, distribuirati, javno priobčevati, dajati v najem in tudi predelovati, vendar samo v nekomercialne namene in ob pogoju, da navede avtorja oziroma avtorje in izdajatelja tega dela. Če uporabnik delo predela, kar pomeni, da ga spremeni, preoblikuje, prevede ali uporabi to delo v svojem delu, lahko predelavo dela ponudi na voljo le pod pogoji, ki so enaki pogojem iz te licence oziroma pod enako licenco.
import simplegui import random # Definicija konstant VEL = (86, 120) # Velikost posamezne karte SRED = (43, 60) # Središče posamezne karte slike_kart = simplegui.load_image("https://i.imgur.com/02fPJzJ.gif") # Definicija globalnih spremenljivk za karte BARVE = ("S", "H", "D", "C") # Spade/Heart/Diamond/Club ZNAKI = ("♠", "♥", "♦", "♣") OPISI = ("A", "2", "3", "4", "5", "6", "7", "8", "9", "X", "J", "Q", "K") VREDNOSTI = {"A":1, "2":2, "3":3, "4":4, "5":5, "6":6, "7":7, "8":8, "9":9, "X":10, "J":10, "Q":10, "K":10} # Definicija razreda 'Karta' class Karta: def __init__(self, barva, opis): """ Inicializator """ if (barva in BARVE) and (opis in OPISI): self._barva = barva self._opis = opis else: self._barva = None self._opis = None print("Neveljavna karta: ", barva, opis) def __str__(self): """ Vrne niz, ki predstavlja karto """ znak = BARVE.index(self._barva) opis = self._opis if opis == "X": opis = "10" return ZNAKI[znak] + opis def vrni_barvo(self): """ Vrne barvo karte """ return self._barva def vrni_opis(self): """ Vrne opis ali rang karte """ return self._opis def narisi(self, platno, poz, hrbet=True): """ Nariše sliko karte na platnu, na danem položaju """ if hrbet: polozaj = (SRED[0]+VEL[0] * 0, SRED[1]+VEL[1] * 4) else: polozaj = (SRED[0]+VEL[0] * OPISI.index(self._opis), SRED[1]+VEL[1] * BARVE.index(self._barva)) platno.draw_image(slike_kart, polozaj, VEL, [poz[0]+SRED[0], poz[1]+SRED[1]], VEL) # Definicija razreda 'Komplet' class Komplet: def __init__(self): """ Inicializator """ self._karte = [] for barva in BARVE: for opis in OPISI: self._karte.append(Karta(barva, opis)) def __str__(self): """ Vrne niz, ki predstavlja komplet kart """ sporocilo = "Komplet vsebuje" for karta in self._karte: sporocilo += " " + str(karta) return sporocilo def premesaj(self): """ Premeša karte v kompletu """ random.shuffle(self._karte) def deli_karto(self): """ Deli naslednjo karto iz kompleta """ return self._karte.pop() # Definicija razreda 'Igralec' class Igralec(Komplet): def __init__(self, delivec=False): """ Inicializator """ self._karte = [] # Karte, ki jih igralec odloži/vrže med igro self._zaloga = [] def __str__(self): """ Vrne niz, ki predstavlja igralčeve karte """ sporocilo = "V roki drži" for karta in self._karte: sporocilo += " " + str(karta) return sporocilo def dodaj_karto(self, karta): """ Igralcu doda nov objekt 'Karta' na konec """ self._karte.append(karta) def vstavi_karto(self, karta): """ Igralcu doda objekt 'Karta' na začetek """ self._karte.insert(0, karta) def vrzi_karto(self): """ Igralcu odvzame objekt 'Karta' in ga doda v zalogo """ if self._karte: karta = self._karte.pop() self._zaloga.append(karta) def zadnja_vrzena_karta(self): """ Vrne zadnjo karto, ki jo je vrgel igralec """ # To pomeni zadnjo karto iz igralčeve zaloge return self._zaloga[-1]._opis def ima_karte(self): """ Vrne, ali ima igralec v roki karte, ali ne """ if self._karte: return True else: return False def ima_zalogo(self): """ Vrne, ali ima igralec zalogo kart, ali ne """ if self._zaloga: return True else: return False def zaloga(self): """ Vrne igralčevo zalogo kart """ return self._zaloga def sprazni_zalogo(self): """ Sprazni igralčevo zalogo kart """ self._zaloga = [] def stevilo(self): """ Vrne število kart, ki jih ima igralec """ # Pri tem šteje tako karte, ki jih ima igralec v roki, # kot tiste, ki jih je odložil ... return len(self._karte) + len(self._zaloga) def narisi_karte(self, platno, poz): """ Nariše karte - uporabi metodo narisi razreda 'Karta' """ # Izpis obrnjenih kart, ki jih ima igralec še v roki. # Vse karte so obrnjene. ROB = 1 i = 0 for karta in self._karte: karta.narisi(platno, [poz[0]+i*ROB, poz[1]], True) i += 1 # Izpis odvrženih kart ROB = 12 ODMIK = 180 i = 0 for karta in self._zaloga: # Ali prikaže sprednjo ali zadnjo stran karte obrni = i % 2 if i == len(self._zaloga)-1: obrni = False karta.narisi(platno, [ODMIK+poz[0]+i*ROB, poz[1]], obrni) i += 1 # Definicija razreda 'Vojna' class Vojna(): _igra_poteka = False _vojna_poteka = False _izid = "" _REZULTAT = {"SKUPAJ":0, "ZMAGE":0} def __init__(self): """ Inicializator """ # Ustvari okvir self.frame = simplegui.create_frame("Vojna", 650, 600) self.frame.set_canvas_background("green") # Ustvari gumbe in jih poveži z dogodkovnimi rokovalniki self.frame.add_button("Deli", self.deli, 200) self.frame.add_button("Vrzi", self.vrzi, 200) self.frame.set_draw_handler(self.narisi) # Dodaj igralca in delivca self._igralec = Igralec() self._delivec = Igralec(True) # Razdeli karte self.deli() # Zaženi animacijo okvirja (dogodkovno zanko) self.frame.start() def deli(self): """ Rokovalnik gumba 'Deli' """ # Ustvari nov komplet kart in ga premešaj self._komplet = Komplet() self._komplet.premesaj() # Dodaj igralca in delivca ter začni igro self._igralec._karte = [] self._delivec._karte = [] self._igra_poteka = True self._izid = "" # Izmenično razdeli 26 kart igralcu in delivcu for i in range(26): self._igralec.dodaj_karto(self._komplet.deli_karto()) self._delivec.dodaj_karto(self._komplet.deli_karto()) def vrzi(self): """ Rokovalnik gumba 'Vrzi' """ if self._igra_poteka: # Zadnja vržena karta delivca in igralca if self._delivec.ima_zalogo() and self._igralec.ima_zalogo(): karta_d = self._delivec.zadnja_vrzena_karta() karta_i = self._igralec.zadnja_vrzena_karta() # Če je vojna if karta_d == karta_i: self._vojna_poteka = True self._delivec.vrzi_karto() self._igralec.vrzi_karto() self._izid = "Vojna!" # Sicer (če ni vojne) else: # Delivec ima višjo karto, kar pomeni, # da dobi svoje in igralčeve karte self._vojna_poteka = False if VREDNOSTI[karta_d] > VREDNOSTI[karta_i]: for karta in self._igralec.zaloga(): self._delivec.vstavi_karto(karta) for karta in self._delivec.zaloga(): self._delivec.vstavi_karto(karta) if not self._igralec.ima_karte(): self._igra_poteka = False self._izid = "Jack je zmagal! Nova igra?" self._REZULTAT["SKUPAJ"] += 1 # Igralec dobi vse karte else: for karta in self._delivec.zaloga(): self._igralec.vstavi_karto(karta) for karta in self._igralec.zaloga(): self._igralec.vstavi_karto(karta) if not self._delivec.ima_karte(): self._igra_poteka = False self._izid = "Zmagal si! Nova igra?" self._REZULTAT["SKUPAJ"] += 1 self._REZULTAT["ZMAGE"] += 1 if not self._vojna_poteka: self._delivec.sprazni_zalogo() self._igralec.sprazni_zalogo() self._izid = "Vrzi karto..." if self._igra_poteka: self._delivec.vrzi_karto() self._igralec.vrzi_karto() def narisi(self, platno): """ Rokovalnik izpisa oz. izrisa """ self._igralec.narisi_karte(platno, [50, 220]) self._delivec.narisi_karte(platno, [50, 400]) _txt1 = "Vojna" _txt2 = "Tvoje karte (" + str(self._igralec.stevilo()) + ")" _txt3 = "Jackove karte (" + str(self._delivec.stevilo()) + ")" _txt4 = "STANJE: " + self._izid _txt5 = "REZULTAT: zmage: " + str(self._REZULTAT["ZMAGE"]) \ + ", skupaj: " + str(self._REZULTAT["SKUPAJ"]) platno.draw_text(_txt1, [50, 70], 40, "white") platno.draw_text(_txt2, [50, 200], 20, "white") platno.draw_text(_txt3, [50, 380], 20, "white") platno.draw_text(_txt4, [50, 140], 20, "white") platno.draw_text(_txt5, [50, 560], 20, "white") # Zaženemo igro Vojna()
# encoding: utf-8 import tkinter as tk import random VEL = (86, 120) # Velikost posamezne karte SRED = (43, 60) # Središče posamezne karte KARTE = {} # Slovar bo vseboval slike kart # Definicija globalnih spremenljivk za karte BARVE = ("S", "H", "D", "C") # Spade/Heart/Diamond/Club ZNAKI = ("♠", "♥", "♦", "♣") OPISI = ("A", "2", "3", "4", "5", "6", "7", "8", "9", "X", "J", "Q", "K") VREDNOSTI = {"A":1, "2":2, "3":3, "4":4, "5":5, "6":6, "7":7, "8":8, "9":9, "X":10, "J":10, "Q":10, "K":10} # Definicija razreda 'Karta' class Karta: # Ustvari objekt 'Karta' def __init__(self, barva, opis): if (barva in BARVE) and (opis in OPISI): self._barva = barva self._opis = opis else: self._barva = None self._opis = None print("Neveljavna karta: ", barva, opis) # Vrne dvo-znakovno predstavitev karte def __str__(self): return self._barva + self._opis # Vrne barvo karte def vrni_barvo(self): return self._barva # Vrne opis ali rang karte def vrni_opis(self): return self._opis # Izriše sliko karte na platnu, na danem položaju def izpis(self, platno, poz, hrbet=True): if hrbet: slika = KARTE["BG"] else: k = self._barva + self._opis slika = KARTE[k] platno.create_image(poz[0], poz[1], \ anchor=tk.NW, image=slika) # Definicija razreda 'Komplet' class Komplet: # Ustvari objekt 'Komplet', ki vsebuje vseh 52 kart def __init__(self): self._karte = [] for barva in BARVE: for opis in OPISI: self._karte.append(Karta(barva, opis)) # Premešaj komplet kart def premesaj(self): random.shuffle(self._karte) # Deli naslednjo karto iz kompleta def deli_karto(self): return self._karte.pop() # Vrne besedilno predstavitev kompleta kart def __str__(self): sporocilo = "Komplet vsebuje" for karta in self._karte: sporocilo += " " + str(karta) return sporocilo # Definicija razreda 'Igralec' class Igralec(Komplet): # Ustvari objekt 'Igralec' def __init__(self): self._karte = [] # Karte, ki jih igralec odloži/vrže med igro self._zaloga = [] # Vrne predstavitev kart, ki jih v roki drži igralec def __str__(self): sporocilo = "V roki drži" for karta in self._karte: sporocilo += " " + str(karta) return sporocilo # Igralcu doda nov objekt 'Karta' na konec def dodaj_karto(self, karta): self._karte.append(karta) # Igralcu doda objekt 'Karta' na začetek def vstavi_karto(self, karta): self._karte.insert(0, karta) # Igralcu odvzame objekt 'Karta' in ga doda v zalogo def vrzi_karto(self): if self._karte: karta = self._karte.pop() self._zaloga.append(karta) # Vrne zadnjo karto, ki jo je vrgel igralec # t.j. zadnjo karto iz igralčeve zaloge def zadnja_vrzena_karta(self): return self._zaloga[-1]._opis # Vrne, ali ima igralec v roki karte, ali ne def ima_karte(self): if self._karte: return True else: return False # Vrne, ali ima igralec zalogo kart, ali ne def ima_zalogo(self): if self._zaloga: return True else: return False # Vrne igralčevo zalogo kart def zaloga(self): return self._zaloga # Sprazni igralčevo zalogo kart def sprazni_zalogo(self): self._zaloga = [] # Vrne število kart, ki jih ima igralec: # tistih v roki in odloženih def stevilo(self): return len(self._karte) + len(self._zaloga) # Izriše karte - uporabi metodo izpis razreda 'Karta' def narisi_karte(self, platno, poz, delivec=False): # Izpis obrnjenih kart, ki jih ima igralec # še v roki. Vse karte so obrnjene ROB = 1 i = 0 for karta in self._karte: karta.izpis(platno, [poz[0]+i*ROB, poz[1]], True) i += 1 # Izpis odvrženih kart ROB = 12 ODMIK = 180 i = 0 for karta in self._zaloga: # Ali prikaže sprednjo ali zadnjo stran karte obrni = i % 2 if i == len(self._zaloga)-1: obrni = False karta.izpis(platno, [ODMIK+poz[0]+i*ROB, poz[1]], obrni) i += 1 # Definicija razreda 'Vojna' class Vojna(): _igra_poteka = False _vojna_poteka = False _izid = "Vrzi karto..." _REZULTAT = {"SKUPAJ":0, "ZMAGE":0} def __init__(self): """ Inicializator """ # Ustvari okno, okvir in platno self.okno = tk.Tk() self.okno.title("Vojna") self.okno.geometry("840x640") self.okvir = tk.Frame(self.okno) self.okvir.grid(row=0, column=0, pady=20) self.platno = tk.Canvas(self.okno, width=650, height=600) self.platno.configure(bg="darkgreen") self.platno.grid(row=0, column=1, pady=20) # Naloži slike kart. Slike kart so v podmapi 'karte', ki je v isti # mapi kot datoteka 'vojna.py' global KARTE KARTE = {'BG': tk.PhotoImage(file="karte/BG1.gif")} for barva in BARVE: for opis in OPISI: karta = barva + opis datoteka = "karte/" + karta + ".gif" KARTE[karta] = tk.PhotoImage(file=datoteka) # Ustvari gumbe in jih poveži z dogodkovnimi rokovalniki self.gumb1 = tk.Button(self.okvir, text="Deli", command=self.deli) self.gumb1.configure(width=10) self.gumb1.grid(row=0, column=0, padx=45) self.gumb2 = tk.Button(self.okvir, text="Vrzi", command=self.vrzi) self.gumb2.configure(width=10) self.gumb2.grid(row=1, column=0, padx=45) # Dodaj igralca in delivca self._igralec = Igralec() self._delivec = Igralec() # Razdeli karte self.deli() # Zaženi dogodkovno zanko self.okno.mainloop() def deli(self): """ Rokovalnik gumba 'Deli' """ # Ustvari nov komplet kart in ga premešaj self._komplet = Komplet() self._komplet.premesaj() # Dodaj igralca in delivca ter začni igro self._igralec._karte = [] self._delivec._karte = [] self._igra_poteka = True self._izid = "" # Izmenično razdeli 26 kart igralcu in delivcu for i in range(26): self._igralec.dodaj_karto(self._komplet.deli_karto()) self._delivec.dodaj_karto(self._komplet.deli_karto()) # Nariši karte igralca in delivca self.narisi() def vrzi(self): """ Rokovalnik gumba 'Vrzi' """ if self._igra_poteka: # Zadnja vržena karta delivca in igralca if self._delivec.ima_zalogo() and self._igralec.ima_zalogo(): karta_d = self._delivec.zadnja_vrzena_karta() karta_i = self._igralec.zadnja_vrzena_karta() # Če je vojna if karta_d == karta_i: self._vojna_poteka = True self._delivec.vrzi_karto() self._igralec.vrzi_karto() self._izid = "Vojna!" # Sicer (če ni vojne) else: # Delivec ima višjo karto, kar pomeni, # da dobi svoje in igralčeve karte self._vojna_poteka = False if VREDNOSTI[karta_d] > VREDNOSTI[karta_i]: for karta in self._igralec.zaloga(): self._delivec.vstavi_karto(karta) for karta in self._delivec.zaloga(): self._delivec.vstavi_karto(karta) if not self._igralec.ima_karte(): self._igra_poteka = False self._izid = "Jack je zmagal! Nova igra?" self._REZULTAT["SKUPAJ"] += 1 # Igralec dobi vse karte else: for karta in self._delivec.zaloga(): self._igralec.vstavi_karto(karta) for karta in self._igralec.zaloga(): self._igralec.vstavi_karto(karta) if not self._delivec.ima_karte(): self._igra_poteka = False self._izid = "Zmagal si! Nova igra?" self._REZULTAT["SKUPAJ"] += 1 self._REZULTAT["ZMAGE"] += 1 if not self._vojna_poteka: self._delivec.sprazni_zalogo() self._igralec.sprazni_zalogo() self._izid = "Vrzi karto..." if self._igra_poteka: self._delivec.vrzi_karto() self._igralec.vrzi_karto() # Nariši karte igralca in delivca self.narisi() def narisi(self): """ Rokovalnik izpisa oz. izrisa """ # Izbriši vsebino platna self.platno.delete("all") # Nariši karte igralca in delivca self._igralec.narisi_karte(self.platno, [50, 220]) self._delivec.narisi_karte(self.platno, [50, 400]) # Skrij prvo karto delivca, če igra poteka #if self._igra_poteka: # self._delivec.obrni_karto(self.platno, [50, 400]) _txt1 = "Vojna" _txt2 = "Tvoje karte (" + str(self._igralec.stevilo()) + ")" _txt3 = "Jackove karte (" + str(self._delivec.stevilo()) + ")" _txt4 = "STANJE: " + self._izid _txt5 = "REZULTAT: zmage: " + str(self._REZULTAT["ZMAGE"]) \ + ", skupaj: " + str(self._REZULTAT["SKUPAJ"]) self.platno.create_text(50, 50, fill="white", anchor=tk.NW, \ text=_txt1, font=("Times", 30)) self.platno.create_text(50, 180, fill="white", anchor=tk.NW, \ text=_txt2, font=("Times", 15)) self.platno.create_text(50, 360, fill="white", anchor=tk.NW, \ text=_txt3, font=("Times", 15)) self.platno.create_text(50, 120, fill="white", anchor=tk.NW, \ text=_txt4, font=("Times", 15)) self.platno.create_text(50, 540, fill="white", anchor=tk.NW, \ text=_txt5, font=("Times", 15)) # Zaženemo igro Vojna()
6
Dopolni GUI program za igranje igre s karatmi vojna (za dva igralca). Igro dopolni tako, da bo omogočala igranje igralca proti računalniku. Dopolniti moraš funkcijo vrzi
na določenih mestih, ki so v kodi označena z oznako # DOPOLNI
in navodilom, kako moraš dopolniti kodo.
Tisti, ki vrže višjo karto, pobere obe. Če sta karti enaki, potem oba odložita dodatni dve karti ter primerjata zadnji karti. Tisti, ki ima višjo karto pobere vse odložene karte itd. Zmagovalec je tisti, ki pobere vse karte.
Slike kart, ki jih lahko uporabiš pri programiranju z modulom simplegui
, najdeš na naslovu https://i.imgur.com/02fPJzJ.gif
. Slike kart, ki jih uporabiš pri programiranju z modulom tkinter
dobiš, če klikneš spodnji gumb.
Pomagaj si z diagramom razredov: