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:

Kod nr
 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ę:

Kod nr
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():

Kod nr
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ż metoda position(), która zwraca pozycję;
  • penup(), pendown() – podniesienie/opuszczenie “pędzla”, dodatkowo funkcja isdown() sprawdza, czy pędzel jest opuszczony.

Po wywołaniu kolejno w funkcji głównej wszystkich powyższych funkcji otrzymamy następującą budowlę:

../../_images/mcsim-turtle.png

Ćwiczenia

  1. Napisz kod, który zbuduje napis “KzK” podobny do pokazanego niżej.
../../_images/mcsim-turtKzK.png
  1. 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.

Kod nr
 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
../../_images/mcpi-slonko.png

Licencja Creative Commons 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”