9.3. Żółw w przestrzeni¶
Biblioteka minecraftturtle implementuje tzw. grafikę żółwia (ang. turtle graphics) w trzech wymiarach. W praktyce ułatwia więc budowanie konstrukcji przestrzennych. Inspirowana jest wbudowaną w Pythona biblioteką turtle, często wykorzystywaną do nauki programowania najmłodszych. Poniżej pokażemy, jak poruszać się “żółwiem” w przestrzeni.
Instalacja
Symulator mcpi-sim
domyślnie nie działa z omawianą biblioteką i wymaga modyfikacji.
Zmienione pliki oraz omawianą bibliotekę umieściliśmy w archiwum
mcpi-sim-fix.zip
, które po ściągnięciu
należy rozpakować do katalogu ~/mcpi-sim/local
nadpisując oryginalne pliki.
9.3.1. Kwadraty¶
W pustym pliku mcsim-turtle.py
umieszczamy kod:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 | #!/usr/bin/env python
# -*- coding: utf-8 -*-
import os
import local.minecraft as minecraft # import modułu minecraft
import local.block as block # import modułu block
import local.minecraftturtle as mcturtle
from local.vec3 import Vec3 # klasa reprezentująca punkt w MC
os.environ["USERNAME"] = "Steve" # nazwa użytkownika
os.environ["COMPUTERNAME"] = "mykomp" # nazwa komputera
mc = minecraft.Minecraft.create("") # połaczenie z symulatorem
start = Vec3(0, 1, 0) # pozycja początkowa
turtle = mcturtle.MinecraftTurtle(mc, start) # obiekt "żółwia"
def plac(x, y, z, roz=10, gracz=False):
"""
Funkcja tworzy podłoże i wypełnia sześcienny obszar od podanej pozycji,
opcjonalnie umieszcza gracza w środku.
Parametry: x, y, z - współrzędne pozycji początkowej,
roz - rozmiar wypełnianej przestrzeni,
gracz - czy umieścić gracza w środku
Wymaga: globalnych obiektów mc i block.
"""
podloga = block.STONE
wypelniacz = block.AIR
# podloga i czyszczenie
mc.setBlocks(x, y - 1, z, x + roz, y - 1, z + roz, podloga)
mc.setBlocks(x, y, z, x + roz, y + roz, z + roz, wypelniacz)
# umieść gracza w środku
if gracz:
mc.player.setPos(x + roz / 2, y + roz / 2, z + roz / 2)
def kwadraty():
# Funkcja rysuje dwa kwadraty w poziomie
turtle.speed(0) # szybkość budowania
turtle.penblock(block.SAND) # typ bloku
for i in range(4):
turtle.forward(10) # do przodu 10 "króków"
turtle.right(90) # w prawo o 90 stopni
turtle.left(90) # w lewo o 90 stopni
for i in range(4):
turtle.forward(10)
turtle.left(90)
def main():
mc.postToChat("Biblioteka minecraftturtle") # wysłanie komunikatu do mc
plac(-15, 0, -15, 30)
kwadraty()
return 0
if __name__ == '__main__':
main()
|
Początek kodu omawialiśmy już w Podstawach. W podświetlonym fragmencie
przede wszystkim importujemy omawianą bibliotekę oraz klasę Vec3 reprezentującą położenie
w MC. Polecenie turtle = mcturtle.MinecraftTurtle(mc, start)
tworzy obiekt “żółwia” w podanym
położeniu (start = Vec3(0, 1, 0)
).
Żółwiem sterujemy za pomocą m.in. następujących metod:
speed()
– ustawia prędkość budowania: 0 – brak animacji, 1 – b. wolno, 10 – najszybciej;penblock()
– określamy blok, którym rysujemy ślad;forward(x)
– idź do przodu o x “kroków”;right(x)
,left(x)
– obróć się w prawo/lewo o x stopni;
Wywołanie przykładowej funkcji kwadraty()
umieszczamy w funkcji głównej i testujemy kod.
9.3.2. Okna¶
Przed funkcją główną main()
dopisujemy kolejną przykładową funkcję:
52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | def okna():
# Funkcja rysuje kształt okien w pionie
turtle.penblock(block.WOOD)
turtle.setposition(10, 2, 0)
turtle.up(90)
turtle.forward(14)
turtle.down(90)
turtle.setposition(-10, 2, 0)
turtle.up(90)
turtle.forward(14)
turtle.down(90)
turtle.right(90)
turtle.forward(19)
turtle.setposition(0, 2, 0)
turtle.up(90)
turtle.forward(13)
turtle.setposition(9, 10, 0)
turtle.down(90)
turtle.left(180)
turtle.forward(19)
|
W podanym kodzie mamy kilka nowych metod:
setposition(x, y, z)
– ustawia “żółwia” na podanej pozycji;up(x)
– obróć się do góry o x stopni;down(x)
– obróć się w dół o x stopni;
Dopisz wywołanie funkcji okna()
do funkcji głównej i wykonaj skrypt.
9.3.3. Szlaczek¶
Jeszcze jedna funkcja przed funkcją main()
:
74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 | def szlaczek():
# Funkcja rysuje przerywaną linię
turtle.penblock(block.MELON)
turtle.setx(-15)
turtle.sety(2)
turtle.setz(15)
turtle.left(180)
for i in range(8):
if (i % 2 == 0):
turtle.forward(1)
else:
turtle.forward(3)
turtle.penup()
turtle.forward(2)
turtle.pendown()
|
Nowe metody to:
setx(x)
,setx(y)
,setx(z)
– metody ustawiają składowe pozycji; jest też metodaposition()
, która zwraca pozycję;penup()
,pendown()
– podniesienie/opuszczenie “pędzla”, dodatkowo funkcjaisdown()
sprawdza, czy pędzel jest opuszczony.
Po wywołaniu kolejno w funkcji głównej wszystkich powyższych funkcji otrzymamy następującą budowlę:

Ćwiczenia
- Napisz kod, który zbuduje napis “KzK” podobny do pokazanego niżej.

- Napisz kod, który zbuduje sześcian. Przekształć go w funkcję, która buduje sześcian o podanej długości boku z podanego punktu.
9.3.4. Przykłady¶
Prawdziwie widowiskowe efekty uzyskamy przy wykorzystaniu pętli.
Zapisz skrypt mcsim-turtle.py
pod nazwą mcpi-turtle.py
i dostosuj go do uruchomienia
na serwerze MC Pi. W tym celu zamień ciąg “local” w importach na “mcpi”
oraz podaj adres IP serwera MC Pi w poleceniu tworzącym połączenie.
Następnie umieść w pliku kody poniższych funkcji i po kolei je przetestuj dodając
ich wywołania w funkcji głównej.
91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 | def slonce():
turtle.setposition(-20, 3, 0)
turtle.speed(0)
turtle.penblock(block.GOLD_BLOCK)
while True:
turtle.forward(80)
turtle.left(165)
x, y, z = turtle.position
print max(x, z)
if abs(max(x, z)) < 1:
break
def wielokat(n):
turtle.setposition(15, 3, -18)
turtle.speed(0)
turtle.penblock(block.OBSIDIAN)
for i in range(n):
turtle.forward(10)
turtle.right(360 / n)
def main():
mc.postToChat("Biblioteka minecraftturtle") # wysłanie komunikatu do mc
# plac(-15, 0, -15, 30)
# kwadraty()
# okna()
# szlaczek()
plac(-80, 0, -80, 160)
slonce()
wielokat(10)
return 0
|

Materiały Python 101
udostępniane przez
Centrum Edukacji Obywatelskiej na licencji
Creative Commons Uznanie autorstwa-Na tych samych warunkach 4.0 Międzynarodowa.
Utworzony: | 2022-05-22 o 19:52 w Sphinx 1.5.3 |
---|---|
Autorzy: | Patrz plik “Autorzy” |