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#!/usr/bin/env python
 2# -*- coding: utf-8 -*-
 3
 4import os
 5import local.minecraft as minecraft  # import modułu minecraft
 6import local.block as block  # import modułu block
 7import local.minecraftturtle as mcturtle
 8from local.vec3 import Vec3  # klasa reprezentująca punkt w MC
 9
10os.environ["USERNAME"] = "Steve"  # nazwa użytkownika
11os.environ["COMPUTERNAME"] = "mykomp"  # nazwa komputera
12
13mc = minecraft.Minecraft.create("")  # połaczenie z symulatorem
14start = Vec3(0, 1, 0)  # pozycja początkowa
15turtle = mcturtle.MinecraftTurtle(mc, start)  # obiekt "żółwia"
16
17
18def plac(x, y, z, roz=10, gracz=False):
19    """
20    Funkcja tworzy podłoże i wypełnia sześcienny obszar od podanej pozycji,
21    opcjonalnie umieszcza gracza w środku.
22    Parametry: x, y, z - współrzędne pozycji początkowej,
23    roz - rozmiar wypełnianej przestrzeni,
24    gracz - czy umieścić gracza w środku
25    Wymaga: globalnych obiektów mc i block.
26    """
27
28    podloga = block.STONE
29    wypelniacz = block.AIR
30
31    # podloga i czyszczenie
32    mc.setBlocks(x, y - 1, z, x + roz, y - 1, z + roz, podloga)
33    mc.setBlocks(x, y, z, x + roz, y + roz, z + roz, wypelniacz)
34    # umieść gracza w środku
35    if gracz:
36        mc.player.setPos(x + roz / 2, y + roz / 2, z + roz / 2)
37
38
39def kwadraty():
40    # Funkcja rysuje dwa kwadraty w poziomie
41    turtle.speed(0)  # szybkość budowania
42    turtle.penblock(block.SAND)  # typ bloku
43    for i in range(4):
44        turtle.forward(10)  # do przodu 10 "króków"
45        turtle.right(90)  # w prawo o 90 stopni
46    turtle.left(90)  # w lewo o 90 stopni
47    for i in range(4):
48        turtle.forward(10)
49        turtle.left(90)
50
51
52def main():
53    mc.postToChat("Biblioteka minecraftturtle")  # wysłanie komunikatu do mc
54    plac(-15, 0, -15, 30)
55    kwadraty()
56
57    return 0
58
59
60if __name__ == '__main__':
61    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
52def okna():
53    # Funkcja rysuje kształt okien w pionie
54    turtle.penblock(block.WOOD)
55    turtle.setposition(10, 2, 0)
56    turtle.up(90)
57    turtle.forward(14)
58    turtle.down(90)
59    turtle.setposition(-10, 2, 0)
60    turtle.up(90)
61    turtle.forward(14)
62    turtle.down(90)
63    turtle.right(90)
64    turtle.forward(19)
65    turtle.setposition(0, 2, 0)
66    turtle.up(90)
67    turtle.forward(13)
68    turtle.setposition(9, 10, 0)
69    turtle.down(90)
70    turtle.left(180)
71    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
74def szlaczek():
75    # Funkcja rysuje przerywaną linię
76    turtle.penblock(block.MELON)
77    turtle.setx(-15)
78    turtle.sety(2)
79    turtle.setz(15)
80    turtle.left(180)
81    for i in range(8):
82        if (i % 2 == 0):
83            turtle.forward(1)
84        else:
85            turtle.forward(3)
86        turtle.penup()
87        turtle.forward(2)
88        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
 91def slonce():
 92    turtle.setposition(-20, 3, 0)
 93    turtle.speed(0)
 94    turtle.penblock(block.GOLD_BLOCK)
 95    while True:
 96        turtle.forward(80)
 97        turtle.left(165)
 98        x, y, z = turtle.position
 99        print max(x, z)
100        if abs(max(x, z)) < 1:
101            break
102
103
104def wielokat(n):
105    turtle.setposition(15, 3, -18)
106    turtle.speed(0)
107    turtle.penblock(block.OBSIDIAN)
108    for i in range(n):
109        turtle.forward(10)
110        turtle.right(360 / n)
111
112
113def main():
114    mc.postToChat("Biblioteka minecraftturtle")  # wysłanie komunikatu do mc
115    # plac(-15, 0, -15, 30)
116    # kwadraty()
117    # okna()
118    # szlaczek()
119    plac(-80, 0, -80, 160)
120    slonce()
121    wielokat(10)
122    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:

2025-04-12 o 10:21 w Sphinx 7.3.7

Autorzy:

Patrz plik „Autorzy”