Python probatzeko, hasi partida Minecraften menuan eta abiarazi zorizko mundu berri bat. Era berean, zabaldu programazio-ingurunea ere, partidan zuzen-zuzenean eragiteko. Izan ere, programa bat aldatzeko, haren programazio-lengoaia zein den ezagutu behar da aurrena (honako hau Python izenekoarekin egin da). Lengoaia interpretatua deitzen zaio, tarteko prozesurik gabe egiten delako idaztetik abiarazterako bidea, eta kodea lerroz lerro idatzi ahala ikusten delako duen eragina. Hots, exekutatzen doan heinean, ikusi egiten da nola eragiten duen Minecraft munduan.
Dena den, programatzeko erosoagoa da testu-fitxategi batean (programan) agindu guztiak bildu eta batera bidaltzea aginduak banaka bidaltzea baino. Horrela, ordenan deitzen eta egikaritzen dira eginkizunak, eta, bide batez, hurrengo batean berrerabiltzeko balio dute.
Idazteko, bestalde, edozein testu-prozesatzailek balio du, baina egokiena da programazio-ingurune batean egitea, honako abantaila hauek dituelako: gako-hitzak kolorez bereizten ditu; eskuragarri dauden kode-zatiak idatzi ahala erakusten ditu; eta idatzitakoa zuzenean martxan jarri edo exekutatzeko aukera ematen du. Pythonek, gainera, IDLE programazio-ingurunea du, eta irekitzeko, Programazioa menuan programaren azken bertsioa bilatu behar da. Erosoago lan egiten da pantaila bitan zatituta: ireki alde batean IDLEa, eta, bestean, bideo-jokoaren leihoa. Idatzitakoaren eragina errazago ikusten laguntzen du horrela egiteak.
Raspbianen Stretch izeneko azken bertsioan, hala ere, Python programatzeko hainbat aukera daude, Thonny izenekoa, esaterako. IDLEak ere, gauza guztiek bezala, baditu desabantailak: fitxategiak idazteko leiho berriak zabaltzen ditu, eta bereizita gelditzen da agindu solteak bidaltzeko eta exekutatzeko behar den agindu-lerroa. Thonnyrekin erosoago jarduten da, idazten den kodearen azpian baitarama agindu-lerroa. Hala ere, zabalduagoa den IDLEa erabiliko da ikastaro honetan.
Fitxategi berria sortzeko, jo File > New window eta File > Save atalera. Sortu karpeta bat mahaigainean edo norbere erabiltzailearen karpetan, "minecraft-python" izendatu eta bertan gorde fitxategiok aurrerantzean.
Minecraft programatzeko, berriz, pauso hauek jarraitu behar dira: kodea hasi beti Minecraften liburutegia inportatuz, eta, ondoren, sortu jokoarekin lotura. Adibide gisa, idatzi “Kaixo, mundua!”:
from mcpi import minecraft
mc = minecraft.Minecraft.create()
mc.postToChat("Kaixo, mundua!")
Fitxategia osorik gordetzeko, sakatu CTRL + S eta eman F5 botoiari egikaritzeko. Bestela, arestian esanda bezala, Python leihoan bertan sartu daitezke aginduak komando-lerrotik banaka sartu daitezke, agindu bakoitza idatzi ostean ENTER sakatuta.
Mezua zuzen kargatzen bada, prest gara hurrengo pausorako.
Lan-ohitura on gisa, komeni da jarraibide hauek gogoan izatea:
Alexen uneko posizioa ezagutzeko, honatx idatzi beharrekoa:
pos = mc.player.getPos()
Horrek uneko koordenatu kartesiarra (x,y,z)
itzultzen du. Oso datu baliagarria da ekintza guztiak Alexen aurrean gertatzen direla ziurtatzeko. Bestela, ikusten ez den mapako beste muturrean jaso daiteke agindutakoa eta egin gabetzat pasa. Ikusten denez, pos
izendatutako aldagaian gordetzen da balioa. Koordenatua xeheago nahi bada, aldiz, pos.x
, pos.y
eta pos.z
gisara erabili ahal izango dira.
Dena den, beste era honetara ere jaso daiteke balioa, zuzenean, nahi beste aldagaitan:
x,y,z = mc.player.getPos()
Horrela idatzita, koordenatuaren balio bakoitza aldagai bati eransten zaio zuzenean, eta x
, y
eta z
gisara gelditzen dira erabilgarri. Adi egon, x
eta z
balioek oinezko norabidea adierazten dutelarik (aurrera/atzera eta ezkerrera/eskuinera), y
balioak altuera (gora/behera) adierazten baitu. Bestetik, esan gabe doa getPos()
funtzioari deitu eta Alex mugitzen bada, ez dela uneko posiziora itzuliko eta berriz deitu beharko zaiola posizio berrian eguneratzeko. Aurretik gordetako posizioa erabiltzekotan, aintzat hartu aldaketak gertatu diren.
Uneko posizioa eskuratu daitekeen era berean, Alex ere nahi den posizioan agerrarazi daiteke, supituki. Horretarako, idatzi honako hau agindu-lerroan:
x, y, z = mc.player.getPos()
mc.player.setPos(x,y+100,z)
Kode hori egikarituz gero, 100 posizio gorago agerrarazten da Alex, eta ikusten da airean agertzen, lurreraino erortzen, eta, azkenik, abiapuntura itzultzen.
Saiatu Alex beste kokaleku batzuetara teleportatzen!
setBlock
funtzioak adierazitako koordenatuan ezartzen du agindutako bloke mota:
x,y,z = mc.player.getPos()
mc.setBlock(x+1,y,z, 1)
Hori exekutatzean, harrizko bloke bat agertzen da Alexen aldamenean. Aurrera jarraitzeko, balio hauek eman behar zaizkio funtzioari: alde batetik, mapan ezartzeko bloke berriaren koordenatuak, eta, bestetik, zein bloke mota den (1
edo haitza, oraingo honetan).
Egin proba bloke hauekin:
0: airea
2: belarra
3: lokatza
Lokatz blokea da hau.
Bideo-joko eta aplikazio gehienak bezala, hainbat programak osatzen du Minecraft. Programa horietako guztietako fitxategiak, arestian ikusi denez, karpeta batean desordenatuta gorde beharrean, beste modu batera antolatzen dira. Erosotasun kontuez gain, funtsezkoena da erraz berrerabiltzeko moduan izatea, eta, horretarako, liburutegiak izeneko multzoetan pilatzen dira antzerako zereginak dituzten programak.
Scratch edo App Inventor inguruneetan motxilak egiten duena egiten dute liburutegiek, haien ahaideak edo baliokideak baitira. Barruan dutena erabiltzeko, hauxe besterik ez da egin behar: lehenik, idatzi liburutegiaren izena; ondoren, puntu bat; eta, azkenik, erabili nahi den funtzioaren izena. Batzuetan, ordea, konstanteak izeneko balio berezi batzuk ere gordetzen dituzte. Konstanteak liburutegian egoten dira eta erabili nahi direnean, besteen izen bera ematen zaie, liburutegiarena aurretik erantsita.
Minecraftek, gainera, identifikazio-zenbakiak (id
) erabiltzen ditu blokeak bereizteko, nahiz eta bere liburutegietan ere bloke batzuk izendatzen dituen. Bloke ID zerrenda erlaitzean dago erabili litezkeen id
horien zerrenda. Beraz, beste import
lerro bat gehitu behar da Minecraften erabiltzen diren lehentasunezko blokeen izenak idazteko:
from mcpi import block
Hori txertatu ostetik, honako hau egin daiteke bloke bakoitzari dagokion zenbakia gogoratzeko beharrik gabe:
mc.setBlock(x+3,y,z,block.STONE.id)
Nahiko erraza da id
bloke horien izenak asmatzea. Hori bai, gogoan izan letra larriz adierazi behar direla. Hona hemen probak egiteko adibide batzuk:
WOOD_PLANKS
WATER_STATIONARY
GOLD_ORE
GOLD_BLOCK
DIAMOND_BLOCK
NETHER_REACTOR_CORE
Aurretik ikusitako moduan ere gorde daitezke aldagaien zenbakizko balioak, bloke mota barne. Beraz, asmatu izena gorde nahi den balioaren edukiontziarentzat, eta eman balioa. Honela, adibidez:
lokatza = 3
mc.setBlock(x,y,z,lokatza)
Horren baliokideak dira honako hauek ere, biek emaitza bera itzultzen baitute:
lokatza = block.DIRT.id
mc.setBlock(x,y,z,lokatza)
Bloke batzuek besteek ez dituzten berezitasunak dituzte. Esate baterako, artilearen barne-aldagaiak aukera ematen du kolorea ezartzeko:
artilea = 35
mc.setBlock(x,y,z,artilea,1)
Azken balio horretan, 1 balioarekin laranja izan behar duela adierazi zaio. Ezer idatzi ezean, lehentasunez 0 balioa jasotzen du eta zuriz agertzen da.
Hona hemen beste kolore batzuen lagin txiki bat:
2: magenta
3: urdin argia
4: horia
Egin proba eta asmatu beste kolore batzuk!
Aitzitik, TNT edo dinamita-blokea ere berezia da, zenbakien bidez bi egoera izan baititzake: desgaituta edo lehertzeko prest. 0 du lehentasunezko balioa, desgaituta, alegia, eta ezpataz jota ere ez du eztandarik egiten. 1
balioa jarriz gero, aldiz, kolpe bat jaso bezain laster lehertzen da.
setBlock
aginduak blokeak banaka jartzen ditu, eta setBlocks
aginduak aukera ematen du lana aurreztu eta hainbat bloke elkarri lotuta jartzeko. Adibidez:
haitza = 1
x,y,z = mc.player.getPos()
mc.setBlocks(x+1,y+1,z+1,x+11,y+11,z+11,haitza)
Horrela eginda, 10 x 10 x 10 neurriko kubo solido bat sortzen da erabiltzailearen aldamenean eta lurzorutik at.
Hainbat forma eta neurritako bolumenak sortu daitezke, baina denbora luzeagoa behar dute sortzeko eta sistema eragilea blokeatzeko arriskua dago.
Programatzaile onenek ere akatsak egiten dituzte tarteka. Programa bat aurrenekoan idaztea abilezia ederra da, baina gaizki egindakoa zuzentzen jakitea ere bai! Sarritan blokeatu egiten gara, eta hoberena izaten da beste pertsona bati zuzentzen uztea edo atseden hartu eta beste egun batean berrekitea. Okerrak bilatze horri debugging esaten zaio, ingelesez erroreak bug baitira. Informatika-testuinguruan debugeatu ere erabiltzen da.
Zomorroak martxan dagoen programa gelditu egin dezake, edo espero ez den moduan funtzionatzen jarri. Pythonek mezu bidez adierazten ditu oker nabarmenak (gorriz), eta mezu horietako informazioa nahikoa izaten da akatsa konpontzen asmatzeko. Erreparatu, bestela, mezu honi:
Pythonek ezagutzen ditu funtzio horrek eskatzen dituen aldagaiak, liburutegian definitu baitzaizkio. Aldagai baten balioa hasieratu ez denez, exekuzioa geratu egin du eta azkeneko lerroan erantsi du zergatik (NameError: name 'x' is not defined
). Errore hori arrunta da, eta Pythonek badu mekanismoa ahalik eta kalterik gutxien eragiteko; izan ere, aldagai horrek zorizko balio bat hartuko balu, programak ere ausaz jardungo luke, eta ez erabiltzaileak espero bezala. Konponbidea, hortaz, x
aldagaia hasieratzea da, y
eta z
-rekin batera.
Beste batzuetan, errorea ez da hain nabarmena izaten: akatsa programazio-ideian edo planteamenduan egon daiteke edo, besterik gabe, erabiltzailea oharkabean nahastu daiteke idaztean. Adibidez, ondo idatzita dago programa hau, baina programatzaileak buruan duena (eta egiten ikusi nahi duena) eta jasotzen duena ez datoz bat:
from mcpi.minecraft import Minecraft
mc = Minecraft.create()
x = 78
z = 20
y = mc.getHeight(x, z) #lur azpira ez teleportatzeko, (x,z) koordenatuetako altuera jaso!
mc.player.setPos(x, z, y)
Goiko scriptean, erroreak funtzionamenduan eragiten du.
Debugging egiteko programazio-ingurune batzuek exekuzio-fluxua erakusten dute: geldituz joaten dira aginduz agindu eta programatzaileari pausoz pauso erakusten diete programak nola funtzionatzen duen. Aldagai bakoitzaren uneko balioa zein den jakin daiteke horrela. Gainera, Python lengoaia interpretatua denez, martxan dagoen programaren barruko aldagaiak kontsultatu daitezke eta, horretarako, nahikoa da agindu-lerrotik bertatik haien izena idaztea.
Bada akatsak topatzeko beste modu eroso bat ere: kodean gehitzea programatzaileak jasotzeko mezuak eta geldiuneak. Egia esan, ez da oso ohitura zintzoa, eta kontuan izan behar da bukatzean aztarna horiek guztiak ezabatu egin behar direla. Esate baterako, time.sleep(20)
jartzen bada, denbora dago puntu horretan aldagaien balioei buruz galdetzeko. Exekuzioa non gelditu den jakin ezean, berriz, mc.postToChat("1")
(edo agindu-lerroan ikusteko print ("1")
) agindu artean txertatu daiteke, exekuzioa non trabatu den zehazteko.