Bërja e vizatimeve më komplekse duke përdorur loops

Rregullsia që duam të përdorim në vizatime mund të jetë më komplekse, e krahasuar me problemet e mëparshme. Ketu jane disa shembuj:

../_images/repeat_alternating.png

Në të gjitha këto raste, rregullsia ende ekziston dhe mund të përdoret kur shkruani programe. Mund të vërejmë gjithashtu se shembujt në figurë të gjithë kanë diçka të përbashkët, që është se dy rregulla shfaqen në mënyrë alternative. Për shembull, në një vizatim me tulla, rreshti i parë i tullave fillon me tërë tullën, e dyta me gjysmë tullë, e treta përsëri me tërë tullën, etj. Në mënyrë të ngjashme, dritaret e ndriçuara dhe të lyera shfaqen në mënyrë alternative në vizatimin e ndërtesës.

Për shkak të alternimit të dy rregullave në të gjitha vizatimet, programet që vizatojnë ato do të kenë gjithashtu disa ngjashmëri. Le të shohim shembuj kodesh.

Shembull - zinxhir

Për të vizatuar një zinxhir të tillë, sigurisht që do t’i vizatojmë linjat në një loop. Vizatimi tregon se çdo rresht pasues është i njëjti numër pikselësh më i ulët se ai i mëparshmi, kështu që nuk duhet të ketë asnjë problem me llogaritjen e koordinatës y. Situata me koordinatat x është disi më e vështirë sepse ato ndryshojnë sipas një rregulli pak më të ndërlikuar.

Ne mund ta zgjidhim këtë problem duke përdorur deklaratën if në loop. Pas vizatimit të një rreshti, ne kontrollojmë se cila nga dy vlerat e mundshme \(x\) koordinata e fillimit të rreshtit ka. Nëse ka vlerën e parë - ia caktojmë asaj të dytën dhe anasjelltas. Ja si duket në program:

Një mundësi tjetër për të zgjidhur problemin me koordinatat x është të vizatoni dy rreshta në një loop, për shembull:

Shembull - Tulla

Ne kemi përmendur tashmë se rreshtat e tullave fillojnë në mënyrë alternative me tërë tullën dhe gjysmën e tullave. Kjo është arsyeja pse gjatë vizatimit të tullave mund të përdorim cilindo nga të njëjtat dy ide si në shembullin e mëparshëm.

Le të shënohet gjatësia e tullave nga \(a\) dhe lartësia e saj nga \(h\). Ne e marrim tërë tullën në fillim të rreshtit duke vizatuar një drejtkëndësh në një lartësi të caktuar, me \(x\) koordinatë e barabartë me zero. Gjysma e një tullë në fillim të një rreshti mund të merret duke vizatuar një tullë të tërë të zhvendosur nga \(a \ over 2\) në të majtë, domethënë duke vizatuar një drejtkëndësh me :math:` x` koordinatë e barabartë me -a // 2. Kështu, vetëm gjysma e djathtë e tullave është e dukshme. Mbetet për tu zgjidhur kur vizatojmë një tullë të zhvendosur dhe kur një të rregullt.

Një zgjidhje është që të ruani fillimin e rreshtit të tullave në një variabël, ta quajmë x_start *. Pasi të tërhiqet secila rresht, kontrollojmë se ndryshorja *x_start ka një vlerë zero ose :code: -a // 2. Ashtu si në shembullin e mëparshëm, cilindo prej dy vlerave që kemi, ne do t’i caktojmë vlerën tjetër në variabël, në mënyrë që në rreshtin tjetër vizatimi i tullave të fillojë ndryshe.

Kompletoni deklarimet e papërfunduara për vendosjen e variablës x_start

Ideja e dytë është që të vizatojmë dy tulla në secilën kalim nëpër loop-in e dyfishtë: atë që kemi vizatuar në zgjidhjen e parë, dhe tullën poshtë dhe gjysmës së majtë të saj. Vini re se në këtë rast lak nga y0 ka dy herë hapin, sepse loop i brendshëm vizaton dy rreshta tullash.

Deklarime të plota të papërfunduara për vizatimin e drejtkëndëshe

Ushtrime

Detyra - tabela e shahut

     Vizatoni një tabelë shahu në të gjithë dritaren (sheshet e bordit duhet të jenë 50x50 pixel). Sheshi i poshtëm i majtë duhet të jetë i errët.

Pjesa më e madhe e programit është e shkruar, përpiquni ta mbaroni.

Detyra - Ndërtesa

     Modifikoni programin më poshtë në mënyrë që dritaret të vizatohen në një lak të dyfishtë.

Pjesa që duhet të ndryshohet, pas ndryshimit, mund të fillojë si kjo:

for y in range(5):     # floor
    for x in range(2): # side of the building (0 - left, 1 - right)
        if (x+y) % 2 == 0:
            color = ...

Nëse nuk keni pasur ndonjë problem të madh me të gjitha këto detyra, përpiquni të zgjidhni edhe një detyrë më të vështirë.

Detyra - sfidë: parket

     Shkruani një program që tregon parketin (ju mund të shihni foton me parket kur klikoni në butonin “Luaj lojën”, dhe fotografia është e njëjtë si në fillim të kësaj faqe, apo jo). Qëllimi, natyrisht, është të vizatoni dërrasat e dyshemesë në një loop të shumëfishtë. Dimensionet e bordit janë 10x60 dhe ngjyrat janë të arta dhe kafe.

Skeleti i programit përafërsisht duket si ky:

for row ...
    for column ...
        if ...
            for floorboard in range(6):
                pg.draw.rect(...)
        else:
            for floorboard in range(6):
                pg.draw.rect(...)