Stap 9: Dag drie: Part One: Magic brug
De magische brug is een geweldig idee van de walvis en O'Hanlon boek. Het maakt een brug die zich onder de speler uitstrekt, laten de speler lopen op het water en in de lucht, en u kunt het weergeven van de kinderen hoe een programma groeit uit een eenvoudige tot meer complexe vorm.
Hier is de eenvoudigste versie:
from mc import * from time import * mc = Minecraft() while True: position = mc.player.getTilePos() mc.setBlock(position.x, position.y-1, position.z, STAINED_GLASS_BLUE) sleep(0.2)
Uitleggen van alle stappen zorgvuldig aan de kinderen, gericht op de oneindige spel lus (terwijl juist), en hoe mc.player.getTilePos() controleert de speler op de huidige positie, onderverdeeld in x, y- en z-coördinaten. Vertel ze dat het sleep(0.2) is om ervoor te zorgen dat de Minecraft is niet overweldigd met het doen van allerlei setBlocks, zodat er een 0.2 tweede wacht. Herinner dat u een script met /py vanzelf stoppen kunt.
Hebben alle kinderen maken een brug werken, en dan praten met hen over de tekortkomingen. Bijvoorbeeld, schaadt de brug de grond lopen in. U u moet herzien zodat het alleen in de lucht wordt getrokken. Hiermee kunt u introduceren van de if -instructie:
from mc import * from time import * mc = Minecraft() while True: position = mc.player.getTilePos() belowBlock = mc.getBlock(position.x, position.y-1, position.z) if belowBlock == AIR.id: mc.setBlock(position.x, position.y-1, position.z, STAINED_GLASS_BLUE) sleep(0.2)
Het uitleggen van het verschil tussen de toewijzing = en de vergelijking ==. Het is belangrijk dat je AIR.id in plaats van gewoon lucht in de code. Dat komt omdat AIR is een blok maar getBlock() in de Minecraft Python PI API retourneert niet een blok maar een blok id-nummer, en AIR.id is dat blok id-nummer (nul, eigenlijk).
Natuurlijk, dit is niet perfect, ofwel, omdat het niet zal bruggen boven water trekken. Om dit te corrigeren die u introduceren of en verander de als regel aan:
if belowBlock == AIR.id or belowBlock == WATER_FLOWING.id or belowBlock == WATER_STATIONARY.id:
Als u wilt, kunnen kinderen zelfs magma toevoegen.
Er is één laatste beetje van magie, en dat is de meest magische van alle. De brug zou kunnen zelf achter de speler wissen. Te dien einde, zou u moeten invoeren van lijsten. Of u dit wilt doen, hangt af van het niveau van uw leerlingen. Als u wilt om het te doen, dan opslaan verleden speler posities in een lijst opgeslagen.
from mc import * from time import * mc = Minecraft() saved = [] while True: position = mc.player.getTilePos() belowBlock = mc.getBlock(position.x, position.y-1, position.z) if belowBlock == AIR.id or belowBlock == WATER_FLOW.id or belowBlock == WATER_STATIONARY.id: mc.setBlock(position.x, position.y-1, position.z, STAINED_GLASS_BLUE) saved.append(position) if len(saved) > 10: firstPosition = saved.pop(0) mc.setBlock(firstPosition.x, firstPosition.y-1, firstPosition.z, AIR) sleep(0.2)
Als u de code toevoegt, uitleggen. Je begint een lege lijst met opgeslagen = []. Dan u standpunt toe te aan het einde van de lijst voegen zijn, en als de lijst heeft meer dan 10 exemplaren in, je knallen uit het eerste item en tekening lucht eronder (u opslaat speler, geen brug, posities).
Er zijn nog onvolkomenheden. Bijvoorbeeld, als de brug op water wordt getekend, zal deze worden hersteld met lucht. Tot vaststelling van die misschien wel een uitdaging voor de slimmer studenten.