V projekte Scrable sa pokúsime naprogramovať slovnú hru Scrable. Popritom sa oboznámite so základnými príkazmi a vlastnosťami jazyka Python.
Hrací plán
Vašou prvou úlohou bude nakresliť hrací plán, ktorý vyzerá takto:
Začneme vykreslením základnej mriežky 16 vodorovných a 16 zvislých bielych čiar. Prvé tri riadky sú príkazy, ktoré používame vo všetkých programoch používajúcich modul tkinter:
import tkinter
platno=tkinter.Canvas(height=700,width=700,bg=“green“)
platno.pack()
Nech strana jedného štvorčeka má dĺžku 40 bodov. Potrebujeme si nechať priestor na číslice a písmená popisujúce súradnice štvorčekov, vynechajme preto 40 bodov zhora a zľava. Prvá vodorovná čiara potom bude začínať v bode 40,40, súradnica y sa nemení, vzdialenosť medzi čiarami je 40, 15 krát 40 je 600, koncový bod prvej vodorovnej čiary bude 640, 40. Túto čiaru vytvoríme príkazom:
platno.create_line(40,40,640,40,fill=“white“,width=3)
Ten istý príkaz by sme použili 16 krát, pričom súradnice a by boli vo všetkých príkazoch rovnaké a súradnice by postupne mali hodnoty 40, 80, 120, …640. Mohli by sme mechanicky skopírovať príkaz pre prvú čiaru a zmeniť iba hodnoty , ale programovací jazyk Python a všetky programovacie jazyky, majú k dispozícii efektívnejší nástroj a to je cyklus for. Ak má premenná nadobudnúť hodnoty z nejakého rozsahu použije sa konštrukcia:
for i in range(odkiaľ, pokiaľ): a za ňou blok rovnako odsadených príkazov, ktoré sa s takouto hodnotou majú vykonať. Pôvodný príkaz create_line mierne upravíme a vytvoríme aj príkaz pre zvislé čiary. Pre zvislé čiary sa použijú rovnaké hodnoty, ale hodnoty súradníc x a y prehodíme. Výsledný tvar pre nakreslenie mriežky bude:
for i in range(1,17):
platno.create_line(40,i*40,640,i*40,fill=“white“,width=3)
platno.create_line(i*40,40,i*40,640,fill=“white“,width=3)
Pozor: Premenná i postupne nadobnudne hodnoty 1, 2 až 17, ale telo cyklu sa pre hodnotu 17 už nevykoná, preto sme použili range(1,17) a nie range(1,16), lebo 16. čiara by sa nevykreslila.
Rovnakú mriežku by sme mohli nakresliť aj jednoduchšie nasledujúcim cyklom:
for i in range(40,680,40):
platno.create_line(40,i,640,i,fill=“white“,width=3)
platno.create_line(i,40,i,640,fill=“white“,width=3)
Namiesto for i in range(1,17) máme for i in range(40,680,40), kde tretí parameter je krok, ktorým sa mení premenná i. Ak tento krok nie je použitý, krok je implicitne 1. Potom sme v tele cyklu nemuseli násobiť i. Druhé riešenie bude pravdepodobne o niekoľko tisícin sekundy rýchlejšie.
Označenie súradníc urobíme ďalším cyklom, v ktorom použijeme príkaz create_text. Číslo i potrebujeme previesť na reťazec, na to slúži funkcia str a číslo i potrebujeme previesť aj na znaky. V kódovaní ASCII má veľké A hodnotu 65, takže ku i pripočítame 64 a funkcia, ktorá prevádza číslo na znak je chr. Aby boli číslice a písmená vycentrované, musíme ich posunúť o polovicu dĺžky štvorca. Blok príkazov pre popis osí potom bude vyzerať takto:
for i in range(1,16):
platno.create_text(i*40+20,20,text=str(i),fill=“white“,font=“arial 16″)
platno.create_text(20,i*40+20,text=chr(i+64),fill=“white“,font=“arial 16″)
Zárodok hracieho plánu vyzerá zatiaľ takto:
Prémiové štvorce
Začnime prvým štvorcom so súradnicami 1A (uvedomte si, že A zodpovedá jednotke). Potrebujeme nakresliť červený štvorec s rozmermi 40×40, s vonkajším bielym obvodom a s textom 3 x S. Nakreslíme ho dvoma príkazmi:
platno.create_rectangle(40,40,80,80,text=’3 x S‘,fill=’red‘, outline=’white‘,width=3)
platno.create_text(60,60,text=’3 x S‘,fill=’white‘)
To isté, ale s inými súradnicami, by sme zopakovali 8 krát pre červené štvorce, 17x pre žlté štvorce a tak ďalej. Znova by sme mali mať prostriedok, ktorým si opakované vykonávanie takmer rovnakých príkazov výrazne zjednodušíme. Takýmto zjednodušením bude za prvé vytvorenie funkcie stvorec, ktorá bude mať parametre: dvojica súradníc štvorca, farba štvorca, text vo štvorci. Funkcia môže vyzerať napríklad takto:
def stvorec(x,y,txt,farba):
platno.create_rectangle(x*40,y*40,x*40+40,y*40+40,fill=farba,outline=“white“,width=3)
platno.create_text(x*40+20,y*40+20,text=txt,fill=“white“,font=’arial 12′)
Ako druhé zjednodušenie využijeme príkaz cyklu, ktorý bude prechádzať zoznamom dvojíc súradníc prémiových štvorcov. Vytvoríme si štyri zoznamy dvojíc súradníc cervene, zlte, modre a svetlomodre. Predvediem iba zakreslenie červených štvorcov, rovnako urobíte ostatné, len s inými parametrami:
cervene=[(1,1),(8,1),(15,1),(1,8),(15,8),(1,15),(8,15),(15,15)]
for sur in cervene:
stvorec(sur[0],sur[1],’3 x S‘,’red‘ )
Vytvorili sme zoznam s ôsmymi dvojicami súradníc, dvojice (či n-tice všeobecne), sa indexujú (čísľujú) od indexu nula, rovnako ako boli indexované reťazce.
Doplňte ďalšie tri cykly a tri zoznamy pre ďalšie prémiové polia!
Vieme nahradiť tieto štyri cykly jediným cyklom, ktorý by prechádzal iba jedným zoznamom všetkých prémiových bodov?