Kakskümmend kaks

Põnevamaid programmeerimisülesandeid võib leida näiteks Informaatikaolümpiaadide tööde hulgast. Need on teinekord küll üsna keerukad, vaadata võib põhikooli ja algajate töid.

Olümpiaadi esimese ülesande jõhker ja kindlasti paremaks tehtav versioon oleks selline:
#!/usr/bin/python
# -*- coding: utf-8 -*-
sisu = []
numbrid = []
# Kiire faili sisu lugemine
for joon in open("vaadid.sis", "r"):
sisu=joon.split()
numbrid.append(int(sisu[0]))
numbrid.append(int(sisu[1]))

fh = open("vaadid.val", 'a')

if (numbrid[0]2\n")
else :
fh.write("1--2\n")
else :
if (numbrid[1]>numbrid[3]) :
fh.write("1<-2\n") else : fh.write("1--2\n") if (numbrid[0]3\n")
else :
fh.write("1--3\n")
else :
if (numbrid[1]>numbrid[3]) :
fh.write("1<-3\n") else : fh.write("1--3\n") if (numbrid[2]3\n")
else :
fh.write("2--3\n")
else :
fh.write("2--3\n")

fh.close()

Vaatame järgmisel korral edasi kuidas olümpiaadi näidislahendus välja näeb ja püüame selle Pythoniks “tõlkida”.

Tegutsesin edasi ka meie Galaktika programmiga, selle tulemus võiks olla selline:
galaktika7

Rubriigid: Uncategorized | Lisa kommentaar

Väike enesekontrolli test

Rubriigid: Uncategorized | Lisa kommentaar

Kakskümmend üks

Täna teeme oma programmi liikuvamaks. Vaatame animatsiooni võimalusi lähemalt.

Leidsin veel ühe hea Pythoni mänguprogrammeerimise veebilehe http://thepythongamebook.com. Vaatame esmalt viiendat näided. Oluline on programm “tiksuma” panna.

Meie senises programmis oli tegemata üks oluline asi: taustapildi lisamine. Kui iga kaadri alguses kenasti taustapilt alla panna, siis saab ka animatsioonid kenasti toimima.

Näiteks võib lisada “musta” pildi:

taust = pygame.Surface(self.ekraan.get_size())
taust.fill((0,0,0))
taust = taust.convert()
self.ekraan.blit(taust, (0,0))

Pildi laadimiseks:

minupilt = pygame.image.load("pildifail.jpg")

Või alamkaustast:

import sys
try:
   # laadi kaustast 'data'
    taust = pygame.image.load(os.path.join("data","taust.jpg"))
   pall = pygame.image.load(os.path.join("data","madu.gif"))
except:
   sys.exit("Ei leia üles! ")

Kui seda ei teeks, siis joonistaks PyGame eelmise kaadri joonistuse üle ainult selles osas, mis öeldakse, et juurde tuleb teha.

Proovime nüüd siis panna oma tähed osalt vilkuma. Selleks tuleks osadel tähtedel näiteks kõige suurematel panna läbimõõt muutuma suvaliselt vähemalt 1-3 ühiku piires.

Lõpptulemus.

Rubriigid: Uncategorized | Lisa kommentaar

Kakskümmend

Hohoo, kakskümmend?! Jah, nii see on.

Teeme täna ümber meie Galaktikaprogrammi.
Nüüd on meil juba rohkem kogemusi ja võiksime asju paremini laiali jagada. Eesmärk on mängu sisu ja välimus (otsene joonistamine) eraldi failidesse panna. Lisaks tahaks võimalust, et kui programm käima läheb on üks menüü oma seadetega (võibolla salvestamine, laadimine, uus mäng jne). Sealt saaks aga valida siis mängu enda. Ehk siis graafika osa jaotuks vähemalt kahte moodusesse: menüümoodus ja mängumoodus. Tulevikus võiks muidugi mängumooduses olla mitmeid alaüksusi: tähtede väli, tähtede nimekiri, planeetide/kolooniate nimekiri, laevade/laevastike nimekiri jne. Aga esmalt asume kallale …

galaktika5

Rubriigid: Uncategorized | Lisa kommentaar

Üheksateist

Täna võtame ette taas pooleli jäänud galaktikaprogrammi viimise PyGame moodulile. Võtame aluseks eelmise korra tulemuse.

Enne veel võime lihtsustada tähekeste joonistamise meetodi:

def taheke(x, y, s):
n=int((1+s)/3)
return ((x-s, y),(x-n, y-n), (x, y-s), (x+n, y-n), (x+s, y), (x+n, y+n), (x, y+s), (x-n, y+n))

Sedasi hoiame kokku arvuti “võhma” puhtal arvutamisel – muidu peaks iga numbri n (väiksem haarake) kasutamise juhul väljakirjutama valemi ja jooksma neli-viis operatsiooni, nüüd haaratakse tähte joonistades see kaasa vaid üks kord ja numbrit tarvitades pole vaja lisaks arvutada.

Et pilti põnevamaks teha, siis saame küllalt lihtsalt lisada võimaluse kasutada mitut erinevat suurust tähti. Siin toodud tähe joonistaja sobib selleks suurepäraselt, aga lisada tuleks galaktika moodulisse tähe objekti alla suuruse väli, samasugune täisarvuline muutuja kui värv. Lisaks luua või muuta tähe loomismeetodit (__init__) nii, et ka selles suurus määrataks ja suuruse parameetrit kasutada saaks. Viimaks peab tähtede kuvamisel, taheke(x, y, s) meetodit väljakutsudes praegune ettekirjutatud suurus asendada tähe enda omaga.

Edasi lisame programmile nupud.
Selleks tuleks uue muutujana kaasata mõni ristkülik.

Näiteks:
nupp1 = Rect(10, 560, 90, 30)

Joonistada see koos muude asjadega.
Viimaks tuleb lisada sündmuste haldusesse kontroll hiire kohta, näiteks umbes nii saaks jätkata olemasolevat if lauset:
elif event.type == MOUSEBUTTONUP:
if (nupp1.collidepoint(pygame.mouse.get_pos())) :

Teksti lisamine:
kiri = pygame.font.Font(None, 24)
tekst = kiri.render("niinii", 1, (110, 210, 10))
ekraan.blit(tekst, ristkylik)

Nuppude tegemise moodul:

#!/usr/bin/python
# -*- coding: utf-8 -*-
# nupud.py

import pygame, sys
from pygame.locals import *

class Nupp():

    ristkylik = Rect(1, 1, 10, 10)
    tekst = u""
    varv = (0, 0, 0)

    def __init__(self, koordX, koordY, mootX, mootY, tekst, (r, g, b)) :
        self.ristkylik = Rect(koordX, koordY, mootX, mootY)
        self.tekst=tekst
        self.varv=(r, g, b)

    def pihtas(self):
        if self.ristkylik.collidepoint(pygame.mouse.get_pos()):
            return true
        else:
            return false

Faili koos seda kasutama muudetud programmiga saab siit.

Rubriigid: Uncategorized | Lisa kommentaar

Kaheksateist

Vaatasime eelmisel korral PyGame graafikamoodulit, mis võimaldab kiiresti reageerivaid ja ilusaid programme teha, näiteks mänge.

Selliste programmide põhituum (akna loomise protseduur ja vajalikud lisateegid) on selline:

#!/usr/bin/python
# -*- coding: utf-8 -*-
# PyGmTest.py
import pygame, sys
from pygame.locals import *
pygame.init()
ekraan=pygame.display.set_mode((800,600),0,32)
while True:
    for event in pygame.event.get():
       if event.type == QUIT:
          pygame.quit()
          sys.exit()
          #siia vahele käiks joonistamine või sündmused, mida 17. ringitunnis proovisime
    pygame.display.update()

The New Boston räägib joonistamisest nii:

Seega, tõlgitult ja veidi teiste parameetritega võiks joonistama panna näiteks nii (eelmisel koodil kommenteeritud kohta lisada):
ekraan.lock()
pygame.draw.rect(ekraan, (140, 140, 230), Rect((610, 10), (180, 580)))
ekraan.unlock()

Järgmises videos räägitakse kuidas joonistada hulknurki (polügon/polygon – tuleneb Kreeka keelest):

Sealne näide ei ole ehk kõige efektiivsem. Kui tahame joonistada palju hulknurki, siis selle asemel oleks asjalikum pigem teha eraldi funktsioon nende loomiseks. Püüame nüüd meie oma Galaktika programmi portida ümber PyGame graafikale.

Selleks haarame kaasa Galaktika moodulid ja lisame eraldi uue funktsiooni, mis annab ühele koordinaadile vastava tähe joonistamiseks sobiva hulknurga vastu.

Näiteks kõige lihtsam koordinaatide nimekirja (hulknurga tarbeks) koostaja:

def taheke(x, y):
return ((x-5, y), (x-1, y-1), (x, y-5), (x+1, y-1), (x+5, y), (x+1, y+1), (x, y+5), (x-1, y+1))

Märkus: PyGame ei toeta kuueteistkümnendsüsteemis ehk #FF9900 tüüpi RGB värvide kirja panekut. Selle asemel peab olema kümnendsüsteemis ja sulgudes: (255, 99, 0). Kuueteistkümnendsüsteemis suurim kahekohaline number oli FF ehk 255. Ka kümnendsüsteemis ei saa ühegi värvi väärtus olla sellest suurem ega nullist väiksem. Samuti mitte komakohtadega arv.

Viimaks vaatame paari näidet failis.

Rubriigid: Uncategorized | Lisa kommentaar

Seitseteist

Kuidas üles ehitada programmi?

See on alati vaat et kõige raskem küsimus.

Üks joonis selleks mõtteaineks.

Edasi vaatame lihtsa PyGame graafikamoodulit kasutava programmi ehitamist thenewboston.com videote näidetel. Seal kasutatavaid piltide asemel võime kasutada järgnevaid:

Veel Pythoni Pygame sündmustest.

Video ise:

Rubriigid: Uncategorized | Lisa kommentaar

Kuusteist

Pythoni õppimiseks on päris häid Youtube’ i videoid tehtud. Kuna me ei ole ise Windowsis Pythonit kasutanud, siis võib kasuks tulla näiteks Pythoni installiõpetus Windowsile:

See ja 57 muud Pythoni õppevideot (neist 14 akenderaamistiku wxPython kasutamiseks) on leitavad veebilehel www.thenewboston.com.

Rääkisime juba korra objektorienteeritusest. Oleme objekte näinud eriti graafilisi elemente sisaldavates programmides – eelmisel korral vaadatud programmidest oli PyForce rohkem objekte kasutav. Meie oma näidetest olid põhjalikumad objekte kasutavad programmid kooli andmebaas, kus oli eraldi objektid õpilane (Opilane) ja aine (Aine) vastavalt moodulites Inimesed.py ja Oppeained.py. Programm ise (KooliAndmebaas.py) tegi uue õpilaste nimekirja: luges selleks eraldi nimede failidest hunniku nimesid ja valis suvalised neist välja kasutamiseks, pani huupi õpilastele vanused, ained ja hinded ainetesse.

Meenutamaks objektorienteerimist võime vaadata ühe video TheNewBostonist:

Kui objektorienteeritusega kaugemale minna, siis tuleb rääkida kahest lähenemisest – otsesest õiguste saamisest ja kapseldamisest läbi vahekihi.

Kui meil on ühe objekti all teine objekt (nagu õpilase all oli aine ja aine all hinded – viimased küll nimekirja, mitte eraldi objektina), siis kaugemalt millegi muutmise võib ära keelata tehes allobjektid eraviisilisteks. Sellisel juhul tuleb vahekihis luua meetodid vajalike operatsioonide tegemiseks, seal võib ka näiteks kontrollida üle, et sisestatavad andmed ikka vastavad meie eesmärkidele.

Meie detsembris tehtud ja pooleli jäänud Galaktika programm.

Rubriigid: Uncategorized | Lisa kommentaar

Viisteist

Võtame veel mõned Sourceforge’i projektid ette, mida proovime muuta.

Näiteks: Arkathon
PyForce

Keerulisem on veel:
Rectangular Fusion 2 (vaja andmepakki DATA ja programmifaile kaustast Version 2: rf2-config.py ja
rf2.py

Kui Eric ütleb, et midagi on puudu, siis võib selle installida käsurealt (ülalt vasakult Rakendused > Tarvikud > Terminaal) ja sealt käsud:
sudo aptitude update (enter) – see uuendab programmipakkide loendi
sudo aptitude search pakinimi – otsida on vaja siis kui täpselt ei tea paki nime, milles Pythoni moodul asub
sudo aptitude install pakinimi – paketi allalaadimine ja paigaldamine

Näiteks: sudo aptitude install python-pygame

Rubriigid: Uncategorized | Lisa kommentaar

Neliteist

Uuel aastal uue hooga. Kuna meil on eeldatavasti uusi liikmeid ringis, siis kordame üle vanu teadmisi ja vaatame mõningaid mitte nii otseselt varem õpituga seonduvaid asju.

Kui programmeerida avatult – nii, et arvutiprogrammid vabalt kasutatavaks teha ka teistele kasutajatele, isegi vabalt muudetavaks, siis on hea kasutada mõnd avalikku programmide maardlat.

Kõige tuntum selline veebileht on Sourceforge.net. Vasakult äärelt saab valida otsitava programmi kategooria (näiteks mängud ja meelelahutus), seejärel ilmub vasakule alla poole programmeerimiskeele valik, meie puhul Python. Nüüd näitab Sourceforge Pythoni keeles kirjutatud mänge.

Lihtsamatest programmidest võiks näiteks alla tõmmata, vaadata ja uurida Beasties või Neverending.

Avatud programmide koodiladusid on teisigi, näiteks Tigris.org, launchpad.net (viimase veeb on kirjutatud Pythonis), põhjalikuma võrdluse leiab Wikipediast.

Rubriigid: Uncategorized | Lisa kommentaar