Python coding for Minecraft (7 / 17 steg)
Steg 7: Avancerade sköldpadda-baserade ritning
Med de left(), right(), up() och down() metoderna för sköldpaddan är lätt. Men för några ritningar behöver vi mer sofistikerad 3D kontroll. Exempelvis kanske du vill rita en donut lutar 45 grader upp. Det är frestande att ta glas donut skriptet från föregående steg, och lägga till före loopen:
t.up(45)
Men som producerar ett oväntat resultat--se bilden. Anledningen till detta är att sköldpaddan kommer att klättra upp hela tiden, medan metoden d.left() roterar det runt den vertikala axeln, och så att du får en spiral.
I stället, vad vi behöver göra är gir/pitch/rulle rotatins sköldpaddan. Se bild från NASA (amerikanska regeringen verk är allmän egendom) förklarar hur de tre vinklarna gå, och bara tro att flygplan är din sköldpadda. (Tyvärr, Minecraft begränsningarna gör rulle vinkeln påverkar inte hur sköldpaddan ser eller perspektiv som du tittar på.) Vad vi behöver göra för att fästa våra sidledes donut är först rulla vår sköldpadda av 45 grader med t.roll(45), och sedan rita donut när använda t.yaw(-angle) istället för t.left(angle). Den reviderade koden finns i skärmdumpen.
Vad är trevligt om de gir/pitch/rulle rotationer är att de är alltid i förhållande till var sköldpaddan pekar, medan left() och right() är i förhållande till Minecraft världen.
Slutligen, här är ett mycket mer avancerat exempel. Låt oss Rita ett träd. Detta innebär att göra en rekursiv funktion. Börja med att se till att ritningen är klar så fort som möjligt
från turtle importera *
t = Turtle()
t.pendelay(0)
t.Turtle(none)
Nu gör vi våra rekursiv trädet funktion. Den grundläggande tanken bakom detta är att en gren är bara ett mindre träd. Så gör vi en funktion som tar en räknare och en grenlängd. Räknaren anger hur många iterationer trädet kommer att gå. Till exempel räknare = 1 innebär bara stammen kommer att dras, och räknare = 1 innebär stammen och en uppsättning grenar kommer att dras.
def tree(counter,branchLen):
om counter == 0:
returnera
t.go(branchLen)
för i i range(4):
t.pitch(30)
Tree(Counter-1,branchLen*0.75)
t.pitch(-30)
t.roll(90)
t.Back(branchLen)
Koden kontrollerar först om våra counter har springa ner till noll. I så fall har inte vi något att dra. Sedan drar vi en stam. Sedan drar vi fyra grenar som sticker upp ur det med en enkel slinga. För att utforma denna bit av koden, jag bara föreställa mig själv som sköldpaddan, har precis flyttat längs stammen. Om du vill rita en gren, jag luta mig själv upp med 30 grader (dvs. t.pitch(30)) och rita ett nytt träd av mindre storlek: dess counter är mindre av en, och dess stam kommer att vara 3/4 av längden på min nuvarande koffert. Jag tror tilt mig själv tillbaka ner med 30 grader. Jag själv roteras 90 grader och upprepa övningen. Slutligen, när jag är klar med grenar, jag gå tillbaka ner stammen.
Slutligen måste jag bara åberopa denna kod. Jag kommer att göra ett träd med en disk i 6 och en inledande grenlängd 20. Och för bra åtgärd, blir nog göra det av trä, och naturligtvis vertikalt uppåt:
t.penblock(Wood)
t.verticalangle(90)
Tree(6,20)
Detta fractal träd ser inte mycket realistisk. Vi bör göra den tjocka stammen och grenarna få tunnare och tunnare eftersom de går utåt (säga, få hälften så tjock, tills de når en enda block), och vi bör växla från trä till lämnar block när vi går ut. Men mest av allt, riktiga träd är inte så vanlig. Vi behöver lite slumpmässighet. Den enklaste formen av slumpmässighet är bara för att ge varje gren en chans att misslyckas att växa, säger 20% chans. Jag genomfört alla dessa i mitt fancytree.py skript. Resulterande trädet ser förvånansvärt realistisk för något produceras av en sådan relativt enkel bit kod. En rolig bieffekt av hur jag genomfört det är att det finns en 20% chans att ingenting kommer att dras--dvs, trädet har en chans att växa, som också är realistiska. Och varje gång du kör skriptet, du får något annat.
En annan användbar funktion i klassen sköldpadda ritning är att kunna rita inte bara linjer utan månghörnigt ytor. Det gör bara göra t.startface(), rita din yta och gör sedan t.endface(). När du är i ansiktet läge, varje gång du drar en linje, koden faktiskt ritar en triangel: en vertex är sköldpaddan var när t.startface() anropades och linjen är den motsatta kanten. Detta drar en pentagon lutas på dess sida vid 45 grader:
t.roll(45)
t.startface()
för i i range(5):
t.go(20)
t.Yaw(360/5)
t.endface()