2021-10-12: Minecraft ===================== .. sectnum:: Minecraft Pi Edition -------------------- Er is een gratis versie van Minecraft beschikbaar die werkt op de Raspberry Pi. Deze is beperkt in vergelijking met de meest recente Minecraft versies voor PCs en consoles, maar biedt wel een programmeerinterface. Deze versie van Minecraft is hier beschikbaar: https://www.minecraft.net/en-us/edition/pi De programmeerinterface is hier beschikbaar: https://github.com/martinohanlon/mcpi Oorspronkelijk kon deze interface enkel gebruikt worden met de Raspberry Pi Edition, maar achteraf werd ook ondersteuning toegevoegd voor de Java editie van Minecraft. Maak een nieuwe virtual environment, en installeer mcpi met pip:: pip install mcpi Het Minecraft object ----------------------- Met onderstaande code maken we een Minecraft object. Dit zorgt voor een connectie met de Minecraft server op localhost poort 4711:: from mcpi.minecraft import Minecraft mc = Minecraft.create() De spelerspositie opvragen -------------------------- Het Minecraft object (mc) bevat een property player, dat de speler voorstelt. Je kan diens positie opvragen met de getTilePos() methode:: from mcpi.minecraft import Minecraft mc = Minecraft.create() p = mc.player.getTilePos() print(p) # toont Vec3(2,1,12) Je kan de x, y en z positie opvragen via de overeenkomstige attributen "x", "y" en "z":: from mcpi.minecraft import Minecraft mc = Minecraft.create() p = mc.player.getTilePos() print(p.x) # toont 2 print(p.y) # toont 1 print(p.z) # toont 12 De spelerspositie instellen --------------------------- Je kan de speler positie aanpassen via de setTilePos() methode. Onderstaande code verplaatst te speler naar x-positie 4, y-positie 8, en z-positie 16:: from mcpi.minecraft import Minecraft mc = Minecraft.create() mc.player.setTilePos(4, 8, 16) Opgave ^^^^^^ Schrijf een Python-programma dat je speler 4 blokken omhoog plaatst. Het blok-type opvragen -------------------------- Het Minecraft object (mc) bevat een method getBlock(x, y, z) waarmee je het type blok kunt opvragen op coordinaten (x,y,z):: from mcpi.minecraft import Minecraft mc = Minecraft.create() b = mc.getBlock(0, 0, -1) print(b) # 3, dit komt overeen met "dirt" Opgave ^^^^^^ Schrijf een Python-programma dat toont welk blok-type 10 blokken onder de speler zit. Het blok-type instellen voor 1 blok ------------------------------------ Het Minecraft object (mc) bevat ook een method setBlock(x, y, z, type_id) waarmee je het type blok kunt aanpassen op coordinaten (x,y,z):: from mcpi.minecraft import Minecraft mc = Minecraft.create() mc.setBlock(0, 0, -1, 14) # 14 staat voor gold Opgave ^^^^^^ Schrijf een Python-programma dat een blok van type 10 naast de speler plaatst. Blok-namen ------------------------------------ Omdat het vrij onpraktisch is om via nummers het type blok in te geven, is er een class voorzien met namen voor alle bloktypes:: from mcpi.minecraft import Minecraft from mcpi import block mc = Minecraft.create() mc.setBlock(0, 0, -1, block.GOLD_ORE.id) Opgave ^^^^^^ Schrijf een Python-programma dat een blok van type diamant naast de speler plaatst. Het blok-type instellen voor vele blokken ----------------------------------------- Omdat het ook vrij onpraktisch is om grotere structuren per blok op te bouwen, kan je ook grote gebieden invullen met blokken via de setBlocks(x1, y1, z1, x2, y2, z2, type_id) methode. Dit maakt een balk van coordinaten (x1,y1,z1) tot en met (x2, y2, z2):: from mcpi.minecraft import Minecraft from mcpi import block mc = Minecraft.create() mc.setBlocks(0, 0, 0, 3, 1, 2, block.WOOD.id) Opgave ^^^^^^ Schrijf een Python-programma dat een blok van type STONE naast de speler plaatst met grootte 2x2x2. Opgave ^^^^^^ Schrijf een Python-programma dat een vijver maakt van grootte 3x3x3 door middel van het type water. Zorg ervoor dat het water _onder_ je eigen hoogte zit. Opgave ^^^^^^ Schrijf een functie tower_light(x,y,z) die een torentje van 1 blok breed, 3 blokken hoog maakt, en bovenop deze toren een LIT_PUMPKIN plaatst. Opgave ^^^^^^ Schrijf een functie cuboid(x,y,z, size) die een "cuboid" (balk) maakt, van size x size x size van type WOOD_PLANKS. Opgave ^^^^^^ Schrijf een functie hollow(x,y,z, size) die een "cuboid" (balk) maakt, van size x size x size van type WOOD_PLANKS. Deze balk dient hol te zijn. Dit kan je doen door de binnenkant te vullen met blokken van type AIR. Opgave ^^^^^^ Schrijf een functie room(x,y,z, size) die een kamer maakt (holle ruimte), met een deuropening. Opgave ^^^^^^ Pas je functie room(x,y,z, size) aan zodat er ook twee vensters (gaten) in de muren gemaakt worden. Opgave ^^^^^^ Pas je functie room(x,y,z, size) aan zodat in de twee vensters blokken van het type GLASS geplaatst worden. Opgave ^^^^^^ Pas je functie room(x,y,z, size) aan zodat de muren niet altijd van WOOD_PLANKS gemaakt worden, maar dat er een willekeurige keuze gemaakt worden tussen deze types:: WALL_MATERIALS = [ block.STONE, block.SANDSTONE, block.BRICK_BLOCK, block.STONE_BRICK, block.MOSS_STONE, block.COBBLESTONE, block.WOOD, block.WOOD_PLANKS, ] Opgave ^^^^^^ Maak een functie appartment(x,y,z, size, floors) die de functie room gebruikt om "floors"-aantal kamers boven elkaar te maken zodat je een flatgebouw kan maken. Opgave ^^^^^^ Je verdiepeningen van je flatgebouw hebben allemaal buitendeuren... Dat is een beetje onrealistisch. Pas je functie room(x,y,z, size) aan zodat er een parameter "door" bijkomt, dus room(x, y, z, size, door) waarmee je kan aangeven of er een deur moet inkomen of niet. Gebruik deze parameter om enkel in het onderste verdiep een deur te maken. Opgave ^^^^^^ Schrijf een functie draw_map_vertical(x,y,z, filename) die een bestand inleest, en iedere regel beschouwt als een rij blokken in Minecraft. Iedere letter op deze regel gelijk aan 1 komt overeen met een block van type GOLD_BLOCK. Dus, dit zou een torentje van 3 blokken hoog voorstellen:: 1 1 1 Dit zouden twee torentjes van 3 blokken hoog voorstellen:: 1 1 1 1 1 1 Dit zouden drie torentjes van hoogte 3, 2 en 1 hoog voorstellen:: 1 1 1 1 1 1 Dit zou de letter "T" kunnen voorstellen:: 1111111 1 1 1 Opgave ^^^^^^ Schrijf een functie draw_map_horizontal(x,y,z, heightmap). De eerste drie parameters geven de positie aan waar getekend zal worden. De parameter 'heightmap' geeft een bestand aan dat ingelezen dient te worden, en waarvan iedere regel beschouwd wordt als een rij blokken in Minecraft. Iedere letter op deze regel komt overeen met de hoogte van de blokken van type GOLD_BLOCK. Dus, dit zou een muur van 4 blokken hoog, 3 blokken lang voorstellen:: 4 4 4 Dit zou een omwalling van 4 blokken hoog voorstellen:: 4444 4 4 4444 Dit zou een schans voorstellen, 4 blokken breed, en op het hoogtste punt 5 blokken hoog:: 54321 54321 54321 54321 Opgave ^^^^^^ In de vorige opgave hadden we het probleem dat de maximale blokhoogte, 9 blokken, was omdat we voor hogere nummers het verschil tussen "10" en "1 en 0" niet kunnen zien. Pas functie draw_map_horizontal() aan, zodat in het ingelezen bestand de getallen door komma's gescheiden kunnen worden. Dus de schans uit de vorige opgave zou nu zo uitzien:: 5,4,3,2,1 5,4,3,2,1 5,4,3,2,1 5,4,3,2,1 Opgave ^^^^^^ Schrijf een functie draw_map_horizontal_textured(x,y,z, heightmap, texturemap). De eerste drie parameters geven de positie aan waar getekend zal worden. De parameter texturemap, geeft een bestand aan waarin iedere letter het type blok aangeeft. Dit zou een omwalling van 4 blokken hoog voorstellen:: 4,4,4,4 4, , ,4 4,4,4,4 Waarbij het tweede bestand aangeeft welk materiaal iedere blok heeft:: 15,15,15,15 14, , ,14 15,15,15,15