slama.dev

Programování je Hra

Vítejte na stránce kurzu Programování je Hra!

Kurz bude vyučovaný online formou, každý čtvrtek od 15:30 do 17:00 na stránce https://meet.jit.si/programovani-je-hra. Cílem je se seznámit se základy programování v jazyce Python.

Kontakt

Pokud byste se chtěli na cokoliv zeptat, tak jsem k zastižení tady:

Příklady

Příklady jsou nepovinné, nejsme ve škole. Jsou tu hlavně pro to, abyste se lépe pochopili probíranou látku a rozhodně se nebudu zlobit, když za kurz nesplníte všechny. Na druhou stranu budu rád, když se alespoň část pokusíte vyřešit 🙂. Těžké příklady jsou označené hvězdičkou (⭐).

1. hodina (10. 12. 2020)

Proměnné

a = 123               # krabička a, která drží číslo 123
b = "Tohle je věta."  # krabička b, která drží větu
c = a                 # krabička c, která si uloží, co je v a

# print(...) vypíše cokoliv, co do něho dáte
# pro nás zatím magie
print(a)
print(b)
print(c)
123 = 1   # neplatné, jméno nesmí začínat číslem
a+b = 123 # neplatné, jméno nesmí obsahovat +
  1. Máte číselné proměnné a a b. Napište program, který prohodí jejich obsah. [řešení]
    • Zvládnete to bez použití pomocné proměnné (a bez použití a, b = b, a)? ⭐ [řešení]

Aritmetika

Zajímavost: místo a = a + 3 můžeme používat a += 3 (funguje i pro ostatní operátory). Zápis je tak stručnější a přehlednější.

a = 12 + 6 - 5   # a = 13
b = a / 2        # b = 6.5
c = -b           # c = -6.5
d = 2 + 2 * 2    # d = 6
e = (2 + 2) * 2  # e = 8
f = 2 ** 3       # f = 8

print(a)
print(b)
print(c)
print(d)
print(e)
print(f)
  1. Máte proměnnou a, která udává délku strany kostky. Vypište její obsah. [řešení]
    • Vypište její plochu. [řešení]
    • Vypište plochu největší koule, která se do kostky vejde. [řešení]
    • Vypište plochu největší koule, do které se kostka vejde. ⭐ [řešení]
  2. Máte proměnnou celsius s číselnou hodnotou. Vypište, kolik je to Fahrenheitů (odkaz na Wiki, pokud nevíte, jak převod vypadá). [řešení]

if, else

Zajímavost: existuje také elif, které je možné zapojit za if, které se zkusí vykonat jen pokud se if nevykoná.

a = 10

if a == 10:
	print("a je 10!")           # vykoná se

if a < 3:
	print("a je menší než 3!")  # nevykoná se
else:
	print("a je větší nebo rovno 3!")  # vykoná se
a = 10

if a < 100:
	if a < 50:
		print("a je menší než 50")
	else:
		print("a je mezi 50 a 100")
else:
	print("a je větší nebo rovno 100")
  1. Máte číselné proměnné a a b. Vypište <, > nebo = podle toho, zda je a menší/větší/rovné. [řešení]
  2. Máte číselnou proměnnou a. Napište program, který vypíše Sudé! když je a sudé a Liché!, když je a liché. Použijte operátor % (zbytek po dělení). [řešení]
    • Zvládnete to i bez operátoru %? [řešení]
  3. Máte číselné proměnné a, b a c, které mají různé hodnoty. Vypište tato čísla od nejmenšího po největší. Využijte toho, že ify mohou být vnořené. ⭐ [řešení]

2. hodina (17. 12. 2020)

Uživatelský vstup

veta  = input()       # čtení věty
cislo = int(input())  # čtení čísla

print(veta)
print(cislo)
  1. Chceme se uživatele zeptat, kolik mu je let. Vypište jeho věk a pokud mu je více než 20, napište Je ti více než 20!. [řešení]

Smyčky

i = 0

# vypíše čísla od 0 do 9
while i < 10:
	print(i)
	i = i + 1
i = 0

# vypíše dvojice čísel od 0 do 9
while i < 10:
	j = 0
	
	while j < 10:
		print(i, j)  # vypsání dvou věcí
		j = j + 1

	i = i + 1
  1. Máte číselnou proměnnou a. Vypište všechna čísla od 11 do a. [řešení]
  2. Máte číselnou proměnnou a. Vypište všechna čísla, která dělí a. [řešení]
    • Vypište její prvočíselný rozklad. ⭐ [řešení]
  3. Chceme napsat robota, který bude hádat čísla od 11 do 100100. Uživateli řekne číslo, které hádá, a zeptá se ho, zda je uživatelovo menší, nebo větší. ⭐ [řešení]

Pole

x = [0, 0, 0]

x[0] = 1
x[1] = 10
x[2] = 3

print(x[0])    # vypíše hodnotu na první pozici
print(x[1])    # vypíše hodnotu na druhé pozici
print(x[2])    # vypíše hodnotu na třetí pozici

print(x)       # vypíše pole: [1, 10, 3]
print(len(x))  # vypíše délku pole (3)
  1. Máte pole čísel pole. Vypište:

3. hodina (7. 1. 2021)

Processing

Instalace
  1. stáhni a nainstaluj následující soubor: https://download.processing.org/processing-3.5.4-windows64.zip
  2. po otevření aplikace Processing 3 v pravém horním rohu rozklikni, vyber Add Mode...
  3. nainstaluj z nabídky Python mód
  4. restartuj a Python mód vyber
Odbočka: funkce
def funkce(x):    # bere nějakou hodnotu
	y = x + 1
	return y      # a vrátí ji o 1 zvětšenou

print(funkce(4))  # vypíše 5
print(funkce(-3)) # vypíše -2
def funkce():     # žádnou hodnotu nebere
	return 42     # vrací vždy 42

print(funkce())   # vypíše 42
def funkce():
	print("jen vypisuju, nic neberu ani nevracím")
	
funkce()
Základní Processing program
def setup():  # kód, který se vykoná pouze jednou
	size(400, 400)   # nastavení velikosti okna
	background(255)  # nastavení pozadí na bílou

def draw():  # kód, který se dokola opakuje
	line(200, 100, 200, 230)
	line(200, 230, 220, 300)
	line(200, 230, 180, 300)
	line(200, 150, 180, 200)
	line(200, 150, 220, 200)
	ellipse(200, 100, 50, 50)
	rect(-1, 300, 401, 401)
  1. Přidejte panáčkovi domeček.
  2. Přidejte panáčkovi stylový klobouk.
Používání proměnných
x = 3   # definování proměnných
y = 20

def setup():
	size(400, 400)

def draw():
	global x, y  # použití proměnných ve funkci
	
	background(255)
	ellipse(x, y, 10, 10)
	
	# posouvaní míčku
	# pokud vyjede mimo obrazovku, vrátíme ho zpět
	x = (x + 3) % width
	y = (y + 5) % height
  1. Místo posouvání míčku simulujte “odrážení” od stěny. [řešení]
    • Přidejte gravitaci. ⭐ [řešení]
    • Přidejte více míčků. ⭐
Operace na canvasu
def setup():  # kód, který se vykoná pouze jednou
	size(400, 400)   # nastavení velikosti okna
	background(255)  # nastavení pozadí na bílou

def draw():  # kód, který se dokola opakuje
	translate(width/2, height/2)
	rotate(radians(45))
	translate(-width/2, -height/2)
	
	line(200, 100, 200, 230)
	line(200, 230, 220, 300)
	line(200, 230, 180, 300)
	line(200, 150, 180, 200)
	line(200, 150, 220, 200)
	ellipse(200, 100, 50, 50)
	rect(-1, 300, 401, 401)
  1. Naprogramuje animaci panáčka, jak:

4. hodina (14. 1. 2021)

  1. Naprogramujte vykreslení černobílé 8×88 \times 8 šachovnice. [řešení]

Zmáčknutí klávesy

def keyPressed():
	if key == 'a':
		# vykoná se po zmáčknutí klávesy 'a'
	else:
		# vykoná se po zmáčknutí jiné klávesy
		
	# pro speciální klávesy jako šipky používejte `keyCode`:
	if keyCode == LEFT:
		# vykoná se po zmáčknutí levé šipky
  1. Naprogramujte čtverec, který se hýbe po stisknutí wasd. [řešení]
    • udělejte pohyb plynulý (brždění, když pustíme klávesu) ⭐ [řešení]

Zmáčknutí myši

def mousePressed():
	if mouseButton == LEFT:
		# vykoná se po zmáčknutí levého tlačítka myši
	elif mouseButton == RIGHT:
		# vykoná se po zmáčknutí pravého tlačítka myši
  1. Naprogramujte kruh, který se vždy vykresuje na pozici myši. [řešení]
    • přidejte pohyb plynulý (aby se kruh plynule přibližoval k myši) [řešení]

Barvičky!

  1. Vytvořte červenou, zelenou, azurovou, bílou, černou, šedou, růžovou barvu.

5. hodina (21. 1. 2021)

  1. Naprogramujte Conwayovu „Game of Life“ (ovládání myší + klávesami) ⭐. [řešení]
    • přidejte barvičky! ⭐ [řešení]
    • přidejte ovládání držením levého/pravého tlačítka [řešení]

Alternativní smyčka

# následující smyčka:
x = 0
while x < 10:
	print(x)
	x += 1

# jde také zapsat jako:
for x in range(0, 10):
	print(x)

6. hodina (28. 1. 2021)

Třídy

Zajímavost: metodám tvaru __jméno__ se říká „magické.“ Umí s objekty dělat řadu věcí, jako např. definovat, co znamená je sčítat, násobit, apod.

# vytvoření třídy, která popisuje lidi
# každý člověk má jméno, věk a umí vyrůst
class Clovek:

	# speciální metoda, která se zavolá, když se objekt vytváří
	def __init__(self, jmeno, vek):
		self.jmeno = jmeno
		self.vek = vek

	# funkce, kterou má každý člověk
	# po zavolání zvýší jeho věk o 1
	def vyrost(self):
		self.vek += 1

# vytvoření objektů alice a bob, kteří jsou lidé
alice = Clovek("Alice Novotná", 20)
bob = Clovek("Bořek Stavitel", 34)

# zavolání vlastností na objekty
alice.vyrost()
bob.vyrost()
  1. Přidejte funkci vyrost_o, která bere parametr o a přidá danému člověku tolik let. [řešení]
  2. Přidejte člověku proměnnou vaha a funkce ztloustni a zhubni, které váhu o 1 zvyšují/snižují. [řešení]
  3. Vytvořte Processing sketch, kde bude po obrazovce létat míče (vytvořené myší). [řešení]
    • hint: vytvořte třídu Ptak, nově vytvořené ptáky ukládejte do pole; každé pole má funkci append(věc), která na jeho konec přidá věc
    • upravte pohyb tak, aby byl realistický ⭐⭐ [nedokončeno]

Text

def setup():
    size(400, 400)
    background(255)

    fill(0)                    # černý text
    textSize(32)               # velikost textu 32
    textAlign(CENTER, CENTER)  # vycentrování
    
    # vykreslení textu doprostřed obrazovky
    text('Ahoj!', width / 2, height / 2)

7. hodina (11. 2. 2021)

  1. Naprogramujte hru „Flappy bird“ ⭐⭐ [aktuální stav] [+kolize] [+grafika +gravitace]

Knihovny

math
random

Docstringy

def moje_funkce():
	"""Tahle moje funkce dělá moc cool věci."""
	# ...
	# kód funkce
	# ...

8. hodina (18. 2. 2021)

stringy

a = "Tohle je hezká věta."       # normální string
b = "Tohle" + " je " + "další."  # spojování více stringů do jednoho
c = "5^420 = " + str(5 ** 420)   # spojování a převádění čísel na string

print(a)
print(b)
print(c)

9. hodina (25. 2. 2021)

rekurze

def factorial(n):
	if n == 0:    # tzv. "base case" -- místo, kde se rekurze zastaví
		return 1
	else:
		# vycházíme z toho, že n * (n - 1)! = n!
		return n * factorial(n - 1)

print(factorial(5))
  1. Naprogramujte Fibonacciho čísla a porovnejte rychlost:
  2. Naprogramujte Hanoiské věže. ⭐ [řešení]

  1. Naprogramujte Sierpińského trojúhelník [řešení]
  2. Naprogramujte Mengerovu houbu ve 2D. [řešení]

10. hodina (4. 3. 2021)

PyQt5

Úvodní příklad
import sys
from PyQt5.QtWidgets import *  # import VŠEHO z Pyqt5.QtWidgets

class MyWindow(QWidget):
    def __init__(self):
        super().__init__()  # magie

		# vytvoření labelu (nápisu) a buttonu (tlačítka)
        self.label = QLabel('Ahoj, světe!')
        self.button = QPushButton('Stiskni mě!')

		# vytvoření vertikálního layoutu, který pokládá věci pod sebe
        layout = QVBoxLayout()
        layout.addWidget(self.label)
        layout.addWidget(self.button)

		# aplikování layoutu
        self.setLayout(layout)

		# ukázání widgetu
        self.show()

# magie
app = QApplication(sys.argv)
ex = MyWindow()
sys.exit(app.exec_())
QLabel [dokumentace]
QPushButton [dokumentace]
Signál

  1. naprogramujte Cookie Clicker. [řešení]
    • přidejte upgrady – zmáčknutí vygeneruje více sušenek! [řešení]

QLineEdit [dokumentace]
x = "Ahoj!"
x = x[:-1]  # x = Ahoj
x = x[:-1]  # x = Aho
# ...
  1. naprogramujte aplikaci s QLineEditem, která: [řešení]
    • bude ukazovat aktuální délku do něho zadaného textu (přes QLabel)
    • po stisknutí tlačítka přidá na konec textu lol
    • po stisknutí jiného tlačítka z textu ukousne poslední znak.
  2. naprogramujte aplikaci s QLineEditem, která ukazuje stav pole (přes QLabel) a obsahuje tlačítka: [řešení]
    • „Ukousni“ – odstraní poslední prvek pole (pokud má pole prvky)
    • „Přidej“ – přidá obsah lineEditu do pole
    • „Vyčisti“ – vyprázdní pole
    • „Obrať“ – obrátí pole

Materiály

Python

Programování

Algoritmy, datové struktury

Programování v kostce.