Dnes bude
dokonˇcen´ı semestru
Ud´alostmi ˇr´ızen´e programov´an´ı (kdy jen ˇcek´ame, aˇz pˇrijde ud´alost, na kterou nastav´ıme ovladaˇc),
Tkinter (jakoˇzto knihovna umoˇzˇnuj´ıc´ı tvorbu formul´aˇrov´ych aplikac´ı),
demonstrace knihovny Tkinter k implementaci hry (o ˇstr˚udlu), uk´azka, co vˇsechno lze v Pythonu programovat.
Ud´ alostmi ˇr´ızen´ e programov´ an´ı
funguje ´uplnˇe jinak, neˇz jsme zvykl´ı
D˚ukladnˇeji bude v l´etˇe v C#, sledujte podobnosti a rozd´ıly v implementaci.
My jsme zvykl´ı program organizovat od zaˇc´atku do konce (co pˇresnˇe kdy se m´a st´at), jenˇze
ˇrada aplikac´ı vyˇzaduje vyplnˇen´ı ´udaj˚u, coˇz by se takto dˇelalo tˇeˇzko,
naopak samo vyplˇnov´an´ı ´udaj˚u n´as nezaj´ım´a, my chceme zaˇc´ıt pracovat, aˇz jsou data pohromadˇe.
O bˇeh programu se tedy chov´a prostˇred´ı, n´as vzbud´ı, aˇz nastane nˇejak´a ud´alost.
Ud´alosti: kliknut´ı myˇsi, pˇr´ıjezd myˇsi, odjezd, kliknut´ı prav´ym tlaˇc´ıtkem, dvojklik,...
Ud´ alostmi ˇr´ızen´ e programov´ an´ı
z technick´eho hlediska
Obstar´ame si formul´aˇr,
tomu (a jeho element˚um) nastav´ıme funkce jako ovladaˇce ud´alost´ı,
ˇrekneme ”plav”!
Tkinter
Je knihovna implementuj´ıc´ı ud´alostmi ˇr´ızen´e programov´an´ı
import tkinter
nebo l´epe from tkinter import *
Obsahuje formul´aˇr, tlaˇc´ıtka, textov´a pol´ıˇcka editovateln´a, - a needitovateln´a,...
Pouˇzijeme ji tak, ˇze postav´ıme formul´aˇr objekt tˇr´ıdy Tk, pomoc´ı atribut˚u nastav´ıme jeho vzhled, nastav´ıme ovladaˇce, postav´ıme ovl´adac´ı prvky, atributy jim nastav´ıme vzhled, nastav´ıme ovladaˇce, napl´ac´ame prvky na formul´aˇr, zavol´ame formul´aˇri metodumainloop
Prvky
kter´e se mezi verzemi nepochybnˇe mˇen´ı
Label (text k v´ypisu) Button (tlaˇc´ıtko) Entry (textov´e ok´enko) Checkbutton, Scale, Text LabelFrame, Canvas, Menu,...
Tkinter
pˇr´ıklad
from tkinter import *
formular=Tk() # udelej novy formular
formular.geometry("800x600+50+10")# velikost/um´ıstˇen´ı hlaseni=Label(formular,text="Nazdarek!")
hlaseni.pack()# Prilep hlaseni na formular formular.mainloop() # a jedeme!
#Pˇrekreslen´ı: formular.update()
Rozmist’ov´ an´ı: pack
a souvisej´ıc´ı atributy
pack d´a prvek na formul´aˇr dle defaultn´ıho zarovn´an´ı (na stˇred) co nejv´ıce k defaultn´ı hranˇe formul´aˇre (horn´ı).
Implicitn´ı atributy:
fillvyplnitX, Y, BOTH, potaˇzmotkinter.X, Y, resp.
BOTH.
expandnat´ahnout 0 – ne, jinak – ano (na celou dostupnou ˇ
c´ast okna)
sidekam pˇrit´ahnoutTOP, LEFT, BOTTOM, RIGHT.
Rozmist’ov´ an´ı
to skuteˇcn´e
grid vytvoˇr´ı tabulku a prvky strk´a do bunˇek.
Implicitn´ı argumenty:
row, columnberou cel´a ˇc´ısla (kam prvek d´at), rowspan, columnspankolik bunˇek pokr´yt, ...
place dej na urˇcen´e m´ısto.
x, y– kam,
width, heightvelikost prvku,
relx, rely, relheight, relwidth– relativn´ı jednotky (vzhledem k velikosti okna, argumenty jsou necel´e).
Spoleˇ cn´ e metody
prvk˚u, se kter´ymi budeme pracovat
config(parametr=hodnota) – nastav´ı dan´y atribut na dotyˇcnou hodnotu.
Pˇr´ıklad:l.config(text="Popiska").
Bez parametru vr´at´ı slovn´ık (asociativn´ı pole) vˇsech parametr˚u (s nastaven´ım).
cget("parametr") – zjist´ı hodnotu atributu jako string.
Zbytek n´am prozrad´ıconfig().
Spoleˇ cn´ e atributy
prvk˚u
zpracov´an´ı ud´alost´ı:mainloop, quit,
wait variable(var), wait visibility(window), wait window(window), update, update idletasks,...
mainloop lze opustit metodou quit, likvidaci okna provede destroy.
funkce s ud´alostmi:bind (udalost, funkce),
unbind(udalost),... nabinduje funkci na ud´alost (resp.
odbinduje).
ˇ
casovaˇce: after(cas, funkce), after idle(funkce), after cancel(id)
spr´ava oken:lift, lower– posunou okno nahoru/dol˚u.
Udalosti
a n´azory
Ud´alosti sebind/unbindpˇred´avaj´ı jako string.
Moˇzn´e ud´alosti souvisej´ıc´ı s myˇs´ı: <Button-1>,
<B1-Motion>, <ButtonRelease-1>,
<Double-Button-1>, <Enter>, <Leave>,
s kl´avesnic´ı:<Key>, <FocusIn>, <FocusOut>, konkr´etn´ı kl´avesy <Return>, <Control L>, <Alt L>, <Escape>,
<L>,...
Ud´alost souvisej´ıc´ı s myˇs´ı dost´av´a objekt (1. argument) popisuj´ıc´ı souˇradnice (x, y), ud´alosti s kl´avesnic´ı dost´avaj´ı objekt s atributem char (kter´y ud´alost zp˚usobil).
Moˇ zn´ e prvky
jak se do nich dostat uˇz v´ıme
Button, Canvas, Checkbutton, Entry, Frame, Label, LabelFrame, Listbox, Menu, Menubutton, Message, OptionMenu, PanedWindow, Radiobutton, Scale, Scrollbar, Spinbox, Text, Toplevel
Dialogov´e okno:
tkinter.messagebox.showwarning(’titulek’,’hlaseni’)
V´ yznaˇ cn´ e prvky – Button
a uk´azka pr´ace s nimi
from tkinter import * import tkinter.messagebox def prikliku():
print("Klikli jsme!") def prikliku2(eventa):
tkinter.messagebox.showwarning(’Ha!’) f=Tk()
b=Button(f,text="Popiska",command=prikliku) b.bind(’<Button-1>’,prikliku2)
b.pack() f.mainloop()
Checkbutton
a. k. a. Checkbox
from Tkinter import * f = Tk()
pchbx = IntVar()
chbx = Checkbutton(f, text="Vyber", variable=pchbx, onvalue=1, offvalue=0)
chbx.pack() mainloop()
Pˇri kliknut´ı nastavuje promˇennoupchbx, implicitn´ı argumenty onvalue, offvalue– hodnoty je-li vybr´ano resp. ne (pˇriˇrad´ı 1 resp. 0).
Textov´ e pole
je poˇr´ad stejn´e – ale chov´a se zase jinak...
t=Text(f) t.pack()
Obsah textov´eho pole najdeme v:
t.get(zacatek,konec)
Jenˇze pozor, lze pouˇz´ıt konstantyEND, CURRENT,.. – CURRENT je znak nejbl´ıˇze k myˇsi, ˇr´adek/sloupec: ’radek.sloupec’ , napˇr.
1.0),...
Radiobutton
aneb v´ybˇery z moˇznost´ı jsou podobn´e jako Checkbuttony
...
pohlavi=IntVar()
r1=Radiobutton(f, text="Muz", variable=pohlavi, value=1)
r1.pack()
r2=Radiobutton(f,text="Zena", variable=pohlavi, value=0)
r2.pack()
#krom IntVar je i StringVar (na stringy)
#hodnotu zjistime pohlavi.get()
Canvas
slouˇz´ı k malov´an´ı obr´azk˚u
c=Canvas(f,width=100,height=100) c.pack()
c.create line(0,0,100,100,fill="red", dash=(4,4)) c.create rectangle(25,25,75,75,fill="blue")
Bal´ıˇ cky
jsou dalˇs´ım prostˇredkem dˇelen´ı programu
K´od um´ıme dˇelit do funkc´ı, soubor˚u, modul˚u.
Moduly um´ıme importovat (import jmeno).
Bal´ıˇcek m˚uˇze sest´avat z nˇekolika soubor˚u (m˚uˇze b´yt obsaˇznˇejˇs´ı).
V adres´aˇri vytvoˇr´ıme soubor init .py(klidnˇe pr´azdn´y).
Ten je inicializ´atorem bal´ıˇcku.
V nˇem m˚uˇzeme definovat nˇekter´e poloˇzky a tak´e co se nahraje, ˇrekneme-li from balicek import *:
all =[ "pokus", "druhy pokus"]– v tomto pˇr´ıpadˇe importujeme tyto dvˇe poloˇzky. Ostatn´ı ne.
Pˇr´ıklad
bal´ıˇcku p
init .py:
all =[ "pokus", "druhy pokus"]
pokus.py:
def f():
print("Nazdarek") druhy pokus.py:
def g():
print("Funkce g") treti pokus.py:
def skrytejsi funkce():
print("Sem se dostat da trochu praci.")
Pˇr´ıklad
bal´ıˇcku p
program.py from p import * pokus.f()
druhy pokus.g()
#treti pokus.skrytejsi funkce() by spadlo import p.treti pokus
p.treti pokus.skrytejsi funkce()
# Ted uz to projde.
Hry s ohodnocen´ım
byly
Definition
Hra s ohodnocen´ım je takov´a hra, kdy c´ılov´e stavy jsou
ohodnoceny ˇc´ıslem. Jeden hr´aˇc se pokouˇs´ı v´ysledek maximalizovat, druh´y minimalizovat.
Definition
Hra s nulov´ym souˇctem je takov´a hra, ve kter´e zisk jednoho hr´aˇce je roven ztr´atˇe druh´eho hr´aˇce.
Nˇ ekter´ e hry
V´ylet s pˇr´ıtelkyn´ı do New Yorku:Chceme navˇst´ıvit co nejv´ıce hostinc˚u a technick´ych pamˇetihodnost´ı, pˇr´ıtelkynˇe chce vidˇet co nejv´ıce muze´ı a kadeˇrnictv´ı. Dohodnete se tud´ıˇz, ˇ
ze se budete stˇr´ıdat v rozhodov´an´ı kam j´ıt na jednotliv´ych kˇriˇzovatk´ach.
Traverzov´an´ı po matici: Prvn´ı hr´aˇc mˇen´ı sloupce, druh´y hr´aˇc mˇen´ı sloupce. Zaˇc´ın´ame v prvn´ım ˇr´adku, prvn´ı hr´aˇc vybere sloupec v prvn´ım ˇr´adku a hodnotu na jeho pozici z´ısk´av´a. Druh´y hr´aˇc vybere ˇr´adek a z´ısk´av´a hodnotu z vybran´eho ˇr´adku ve sloupci vybran´em prvn´ım hr´aˇcem. Takto se stˇr´ıdaj´ı (pˇredem zn´amou dobu).
Spoleˇcn´a ot´azka:Jak hr´at?
Algoritmus MINIMAX
Algoritmus lze pouˇz´ıt pro hry s ohodnocen´ım.
Postav´ıme strom hry.
Zaˇcneme od koncov´ych vrchol˚u.
Hodnota podstromu je minimum resp. maximum z hodnot syn˚u (podle toho, zda hraje minimalizuj´ıc´ı nebo maximalizuj´ıc´ı hr´aˇc).
Algoritmus NEGAMAX
Varianta algoritmu MINIMAX pro hry s nulov´ym souˇctem:
ind max
i∈S −f(i) = ind min
i∈S f(i).
Jde vlastnˇe o tot´eˇz, je ovˇsem jednoduˇsˇs´ı na naprogramov´an´ı.
Demonstrace Negamaxu
na hˇre o ˇstrudlu
Str˚ˇ udl bereme z kraje (lev´eho nebo prav´eho), chceme ho sn´ıst co nejv´ıce.
Vyzkouˇs´ıme vˇsechny moˇznosti a pod´ıv´ame se, co vyjde l´epe.
Pˇredvedeno pˇr´ımo na m´ıstˇe.
Heuristiky
Obvykle se pokouˇs´ıme neprohled´avat zbyteˇcnˇe vˇsechno, pokud najdeme jednu moˇznost v´yhry, nemus´ıme hledat i vˇsechny ostatn´ı.
α-β-proˇrez´av´an´ı: Um´ıme-li v nˇejak´em synu S vyhr´at aspoˇn α a najdeme v nˇekter´em n´asleduj´ıc´ım synu T, ˇze protihr´aˇc n´as um´ı dotlaˇcit na m´enˇe, nem´a smysl vrchol T d´ale zkoumat.
Pro opaˇcn´y pˇr´ıpad se pouˇz´ıv´a β: Pokud n´as nepˇr´ıtel um´ı zatlaˇcit na nejv´yˇsβ a v jin´em synu mu uteˇceme pˇres, nem´a smysl ten druh´y syn zkoumat d´ale.
Re´ aln´ e hry
ˇSachy, d´ama, halma, ml´yn...
M˚uˇzeme postavit strom hry, ten je ale pˇr´ıliˇs velk´y.
Nasad´ıme proto vˇselijak´e heuristiky. Ty dosavadn´ı ale stejnˇe daleko nevedou.
Statick´a ohodnocovac´ı funkce: Funkce, kter´a se pokouˇs´ı odhadnout, zda je pozice perspektivn´ı (dobr´a) nebo ne.
Prohled´av´ame strom hry jen po nˇejakou dobu (do nˇejak´e hloubky). Na nalezen´e (netermin´aln´ı) pozice nasad´ıme statickou ohodnocovac´ı funkci.
U ˇsach˚u napˇr´ıklad m˚uˇzeme poˇc´ıtat materi´aln´ı pˇrevahu a body za ohroˇzen´e figurky (Colossus na Atari kolem roku 1985).
Horizont, statick´ a ohodnocovac´ı funkce
Horizont stanov´ı, do jak´e hloubky graf hry (zpravidla realizovan´y stromem) prohled´av´ame.
Statick´a ohodnocovac´ı funkce nastoup´ı, pokud se dostaneme na horizont.
Dalˇs´ıho zrychlen´ı lze (zkusit) dos´ahnout tak, ˇze napˇred
prohled´av´ame perspektivn´ı vrcholy (kde statick´a ohodnocovac´ı funkce d´av´a lepˇs´ı v´ysledky).
Jde ovˇsem jen o heuristiku, kter´a nˇekdy funguje, jindy se dostane do probl´em˚u!
Koment´ aˇr k re´ aln´ ym hr´ am
Typicky stav´ıme strom hry. Graf stav´ıme aˇz v z´avˇereˇcn´e f´azi hry, do t´e doby budujeme strom (a ignorujeme moˇznost, ˇze nˇekter´e stavy se uˇz vyskytly).
Heuristick´e algoritmy lze pojmout dvˇema zp˚usoby:
Metoda, kter´a se pokouˇs´ı naj´ıt optimum co nejrychleji, metoda, jak naj´ıt aspoˇn nˇejak´e (suboptim´aln´ı) ˇreˇsen´ı.
Zat´ım bylo to prvn´ı. Jak pouˇz´ıt heuristiku k nalezen´ı suboptim´aln´ıho ˇreˇsen´ı?
α − β proˇrez´ av´ an´ı jako heuristika
Jsou dva moˇzn´e zp˚usoby:
Metoda ok´enka: Stanov´ıme krajn´ı hodnotyα a β a v´ysledky leˇz´ıc´ı mimo tento interval oˇreˇzeme.
Kask´adn´ı varianta – strom rozˇsiˇrujeme po hladin´ach (protoˇze pokud bychom ho stavˇeli prohled´av´an´ım do hloubky,
prozkoum´ame typicky nezaj´ımav´e vˇetve a zaj´ımav´e tahy n´am uniknou).
Minimaxov´ e vˇ ety
Vrat’me se k maticov´ym hr´am (stylu Al-Capone a Babinsk´y na sebe ud´avaj´ı).
M´a smysl uvaˇzovat nejen o deterministick´e variantˇe (tzv. ˇcist´a strategie – obzvl´aˇst’ pokud hr´aˇci t´ahnou nez´avisle, tedy na sebe nevid´ı), ale m´a smysl definovat pravdˇepodobnostn´ı distribuci (a podle t´e hr´at). Tomu ˇr´ık´ame mixovan´a strategie.
Theorem
Pro kaˇzdou kombinatorickou hru s nulov´ym souˇctem s koneˇcn´ymi strategiemi existuje hodnota V a mixovan´a strategie pro kaˇzd´eho hr´aˇce takov´a, ˇze:
Pokud podle sv´e strategie hraje druh´y hr´aˇc, prvn´ı hr´aˇc nem˚uˇze vyhr´at v´ıce neˇz V .
Pokud podle sv´e strategie hraje prvn´ı hr´aˇc, druh´y hr´aˇc nem˚uˇze vyhr´at v´ıce neˇz−V .
Nash equilibrium
Definition
Nashovou rovhov´ahou nazveme sadu mixovan´ych strategi´ı (pro kaˇzd´eho hr´aˇce jednu) v koneˇcn´ych hr´ach aspoˇn dvou
nespolupracuj´ıc´ıch hr´aˇc˚u, kde ˇz´adn´y z hr´aˇc˚u si nem˚uˇze pomoci t´ım, ˇze strategii zmˇen´ı.
Theorem (J. Nash)
Pro kaˇzdou hra n hr´aˇc˚u, kde kaˇzd´y hr´aˇc m´a koneˇcnˇe moˇzn´ych strategi´ı, existuj´ı strategie urˇcuj´ıc´ı Nashovu rovhov´ahu.
Programov´ an´ı robota
ze kter´eho tu drze prom´ıt´am slidy a na kter´em hrajeme hru o ˇstr˚udlu
Na Raspberry pi lze instalovat Linux (nejl´epe Raspbian).
Jak se pohybovat v UNIXu by mˇelo b´yt pˇredneseno na speci´aln´ım kurzu,
Linuxy b´yvaj´ı vybaven´e interpretem Pythonu.
Raspberry pi m´a nav´ıc GPIO, k ovl´ad´an´ı periferi´ı.
Do Pythonu je v Raspbianu vyveden bal´ık RPivybaven´y bal´ıkem GPIO, tedy jen ˇrekneme import RPi.GPIO as GPIO a m´ame dalˇs´ı knihovnu (ve kter´e jsou funkce tentokr´at pro vyp´ın´an´ı, pouˇstˇen´ı a mˇeˇren´ı proudu).
Pˇredv´est a okomentovatrobot tk.py,
a n´aslednˇe dalˇs´ı skripty (stop.py, robot manual.py, robot ir.py, robot sonar.py)
Konec
Dˇekuji za pozornost...