IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Pomoc s zjednodušením programu

V předchozím kvízu, Online test znalostí Python 2.7, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Jan Janeček
Člen
Avatar
Jan Janeček:3.2.2020 23:23

Ahoj, mohl by mi někdo nějak poradit jak zjednodušit tento program na pár řádků ?
díky

Zkusil jsem:

import turtle
okno = turtle.Screen()
z = turtle.Turtle()


z.up()
z.setpos(-272,-156)
z.down()

a = 100
p = 5
m = 6
e = a + m

for i in range(4):
    z.forward(a)
    z.left(90)

z.up()
z.setpos(-166,-156)
z.down()

for i in range(4):
    z.forward(a)
    z.left(90)

z.up()
z.setpos(-60,-156)
z.down()

for i in range(4):
    z.forward(a)
    z.left(90)

z.up()
z.setpos(46,-156)
z.down()

for i in range(4):
    z.forward(a)
    z.left(90)

z.up()
z.setpos(152,-156)
z.down()

for i in range(4):
    z.forward(a)
    z.left(90)




#dddddddddddd







z.up()
z.setpos(-272,-50)
z.down()

for i in range(4):
    z.forward(a)
    z.left(90)

z.up()
z.setpos(-166,-50)
z.down()

for i in range(4):
    z.forward(a)
    z.left(90)

z.up()
z.setpos(-60,-50)
z.down()

for i in range(4):
    z.forward(a)
    z.left(90)

z.up()
z.setpos(46,-50)
z.down()

for i in range(4):
    z.forward(a)
    z.left(90)

z.up()
z.setpos(152,-50)
z.down()

for i in range(4):
    z.forward(a)
    z.left(90)



# dddddddddddddddd


z.up()
z.setpos(-272,56)
z.down()

a = 100
p = 5
m = 6
e = a + m

for i in range(4):
    z.forward(a)
    z.left(90)

z.up()
z.setpos(-166,56)
z.down()

for i in range(4):
    z.forward(a)
    z.left(90)

z.up()
z.setpos(-60,56)
z.down()

for i in range(4):
    z.forward(a)
    z.left(90)

z.up()
z.setpos(46,56)
z.down()

for i in range(4):
    z.forward(a)
    z.left(90)

z.up()
z.setpos(152,56)
z.down()

for i in range(4):
    z.forward(a)
    z.left(90)

z.up()
z.setpos(0,0)
z.down()

Chci docílit: Zjednodušit na pár řádků, a abych nemusel souřadnice počítat na kalkulačce.

 
Odpovědět
3.2.2020 23:23
Avatar
Lubomír Tosek:4.2.2020 0:35

V 1. lekci VS bije do očí, jak je neaktuální - koční rokem 2015. Mohl by to autor aktualizovat? Lubek

 
Nahoru Odpovědět
4.2.2020 0:35
Avatar
Lu Kiss
Člen
Avatar
Odpovídá na Jan Janeček
Lu Kiss:4.2.2020 6:50

když se na to podíváš tak vidíš že tam máš x-krát sekvenci. která se liší pouze v parametrech fce setpos(x,y);

for i in range(4):
    z.forward(a)
    z.left(90)

z.up()
z.setpos(-166,-156)
z.down()

asi by bylo dobré i toto zkusit dát do nějakého cyklu, který by iteroval nad polem obsahující ty souřadnice, které jsou parametry fce setpos() např. [(-272,-156), (-166,-156)]. Nevím co má přesně kód dělat, takže toto je první co mě napadá co vidím.

Editováno 4.2.2020 6:50
 
Nahoru Odpovědět
4.2.2020 6:50
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:4.2.2020 11:08

Z toho kodu se neda poznat vic. Schazi link na stranku, priklad nebo, odkud to je.

Jenom tipuji, jedna se o pohyb telesa Turtle po obrazovce.
up = smaz obrazek, set = zmen x,y, down = kresli obrazek
To ostatni se neda odhadnout, co to dela.

Jestli chapu kod toho programu, tak v objektu zelva neni ulozena pozice zelvy.
A v objektu zelva nejsou funkce pro zmeny smeru.
Takze ve vysledku musis pokazde zadavat souradnice. Coz je uplne napikacu. V php (do vs si to prepis) lepsi reseni by bylo:

class Turtle
        {
        var x, y;
        function __construct()
                {
                $this->x = 200;
                $this->y = 200;
                $this->speed = 10;
                $this->direction = 'left';
                }
        function move($direction)
                {
                $this->hide();
                switch ($direction)
                        {
                        case 'left' :  $this->x -=  $this->speed; break;
                        case 'right' : $this->x += $this->speed; break;
                        case 'top' :    $this->y -= $this->speed; break;
                        case 'bottom' : $this->y += $this->speed; break;
                        case 'forward' : case 'backward' : $this->move($this->direction); break;
                        default: break;
                        }
                if ($direction!=='forward' || $direction!=='backward') {$this->direction = $direction;}
                $this->show();
                }
        function hide()
                {}
        function show()
                {}
        }

$t = new Turtle();
$t->move('left');
$t->move('top');
$t->move('right');
for($i=0; $i<4; $i++) {$t->move('forward');}

Nicmene, takhle se to taky nedela. Je dobre oddelit data od funkci.

$data = [new zelva, new zelva]; // souradnice a dalsi parametry objektu mas v tom poli
foreach ($data as $zelva) {$zelvaFunkce->move($zelva, 'forward');} // a funkce volas pro kazdy objekt zvlast, predavas funkci objekt a dalsi parametry

Vyhoda je, ze kdyz to pak chces ulozit, tak ulozis jenom pole $data a nemusis to vycucavat za struktur typu, jake jsem pouzil nahore.

Editováno 4.2.2020 11:10
 
Nahoru Odpovědět
4.2.2020 11:08
Avatar
Odpovídá na Jan Janeček
Stanislav Kozák:13.2.2020 18:36

Všimni si, že pokaždé v z.setpos() měníš souřadnice vždy o e (= 106). K tomu se výborně hodí cyklus for (který jsi už použil při malování každého čtverečku).
Tedy: jeden cyklus použiješ k namalování jedné řady 5 čtverečků a vždy na konci změníš souřadnici x. Jelikož potřebuješ namalovat 3 řady, tak tenhle cyklus obalíš ještě jedním, v kterém na konci změníš souřadnici y.
Doufám, že tomu je rozumět a že už nebudeš potřebovat kalkulačku. :-)

import turtle
okno = turtle.Screen()
z = turtle.Turtle()

a = 100  # Délka strany čtverce
p = 5  # Netuším, k čemu tohle číslo je, dál v kódu ho nepoužíváš
m = 6  # Mezera mezi čtverci
e = a + m  # Vzdálenost mezi "začátky" čtverců

# Určení počateční pozice želvy - proměnné se můžou pojmenovat jakkoliv
x_coordinate = -272
y_coordinate = -156

for row in range(3):  # Tenhle cyklus vytvoří tři řady čtverců
    x_coordinate = -272  # Na začátku malování řady se x změní zpátky na -272
    for rectangle in range(5):
        z.up()
        z.setpos(x_coordinate, y_coordinate)  # Nastaví souřadnice želvy na "začátek" nového čtverce
        z.down()

        for i in range(4):  # Kreslení čtverce
            z.forward(a)
            z.left(90)

        x_coordinate += e  # Po namalování čtverce se změní souřadnice x
    y_coordinate += e  # Po namalování 5 čtverců se změní souřadnice y

turtle.done() # Aby se program na konci nevypnul
 
Nahoru Odpovědět
13.2.2020 18:36
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 5 zpráv z 5.