Sjećate se Flappy Birda, mobilne videoigre koja se 2013. našla na pravom mjestu u pravo vrijeme i doživjela svojih pet minuta slave. Budući da micro:bit ima jednostavni ekran i akcelerometar, učinilo mi se zgodnim napraviti njenu inačicu za micro:bit. Zbog veličine ekrana ptica se svela na veličinu piksela pa sam igru prikladno nazvao Flappy Pixel.
Kao i kod originala, cilj igre pomicati je piksel gore/dolje i uredno prolaziti između prepreka koje se postupno približavaju. Piksel se pomiče naginjanjem micro:bita naprijed i natrag. Svaki prolazak između prepreka donosi jedan bod. Nakon određenog broja bodova, smanjuje se prolaz između prepreka te igra postaje izazovnija. Vještim pomicanjem igrač nastoji skupiti što više bodova.
Flappy Pixel prvotno je napisan u MicroPythonu, no kasnije je prebačen i u TypeScript MakeCoda. U nastavku ću prvo prikazati cijeli kod programa obje inačice, a zatim ću ukratko opisati dio po dio programa.
from microbit import * import random pixel_row = 2 gate_column = 4 gate_row = 1 gate_size = 3 gate_move = False score = 0 while True: y = accelerometer.get_y() if y > 600 and pixel_row < 4: pixel_row += 1 elif y <= 600 and pixel_row > 0: pixel_row -= 1 if gate_move: gate_column -= 1 gate_move = not gate_move display.clear() display.set_pixel(0, pixel_row, 8) for i in range(5): if i < gate_row or i > gate_row + gate_size - 1: display.set_pixel(gate_column, i, 5) if gate_column == 0: if pixel_row < gate_row or pixel_row > gate_row + gate_size - 1: break score += 1 if score in (1, 10): gate_size -= 1 gate_column = 4 gate_row = random.randint(0, 4 - gate_size + 1) sleep(400) sleep(800) display.scroll("You scored " + str(score) + " points!")
Program započinje inicijalizacijom varijabli koje sadrže stanje videoigre: položaj piksela, veličinu i položaj prolaza te rezultat. MicroPython dodatno sadrži uvoz modula micro:bita te modula za stvaranje slučajnih vrijednosti.
MicroPython:
from microbit import * import random pixel_row = 2 gate_column = 4 gate_row = 1 gate_size = 3 gate_move = False score = 0
TypeScript:
let pixel_row = 2 let gate_column = 4 let gate_row = 1 let gate_size = 3 let gate_move = false let score = 0 let y: number
Slijedi beskonačna petlja koja se izvodi sve dok se piksel ne sudari s preprekom. Na početku petlje očitava se vrijednost osi Y akcelerometra te ako je veća ili manja od predefinirane vrijednosti, piksel se pomiče za jedno mjesto gore ili dolje. U svakoj drugoj iteraciji pomiču se i prepreke, za jedno mjesto prema pikselu.
MicroPython:
while True: y = accelerometer.get_y() if y > 600 and pixel_row < 4: pixel_row += 1 elif y <= 600 and pixel_row > 0: pixel_row -= 1 if gate_move: gate_column -= 1 gate_move = not gate_move
TypeScript:
while (true) { y = input.acceleration(Dimension.Y) if (y > 600 && pixel_row < 4) { pixel_row += 1 } else if (y <= 600 && pixel_row > 0) { pixel_row -= 1 } if (gate_move) { gate_column -= 1 } gate_move = !gate_move
Zatim se ažurira sadržaj ekrana. Prvo se izbriše raniji sadržaj ekrana i zatim prikaže trenutni položaj piksela i prepreka.
MicroPython:
[codeblock lang=”markup” line=”20″] display.clear() display.set_pixel(0, pixel_row, 8) for i in range(5): if i < gate_row or i > gate_row + gate_size – 1: display.set_pixel(gate_column, i, 5)[/codeblock]
TypeScript:
[codeblock lang=”markup” line=”21″] basic.clearScreen() led.plotBrightness(0, pixel_row, 227) led.plot(0, pixel_row) for (let i = 0; i < 5; i++) { if (i < gate_row || i > gate_row + gate_size – 1) { led.plotBrightness(gate_column, i, 142) } }[/codeblock]
Ako su prepreke stigle do piksela, provjerava se je li igrač uspješno ušao u prolaz između prepreka. Ako se sudario, izlazi se iz petlje, a ako je ušao u prolaz, ostvareni rezultat uvećava se za jedan. Također se i, nakon što se kod rezultat ostvari jedan bod te deset bodova, ubuduće smanjuje prolaz između prepreka.
MicroPython:
[codeblock lang=”markup” line=”25″] if gate_column == 0: if pixel_row < gate_row or pixel_row > gate_row + gate_size – 1: break score += 1 if score in (1, 10): gate_size -= 1[/codeblock]
TypeScript:
[codeblock lang=”markup” line=”29″] if (gate_column == 0) { if (pixel_row < gate_row || pixel_row > gate_row + gate_size – 1) { break } score += 1 if (score == 1 || score == 10) { gate_size -= 1 }[/codeblock]
Nasumično se stvaraju nove prepreke i igra miruje djelić sekunde, prije nego započne s novom iteracijom. Ako smo prethodno imali sudar, izvan petlje se napravi kraća pauza izvođenja i zatim prikaže ostvareni rezultat.
MicroPython:
[codeblock lang=”markup” line=”31″] gate_column = 4 gate_row = random.randint(0, 4 – gate_size + 1) sleep(400) sleep(800) display.scroll(“You scored ” + str(score) + ” points!”)[/codeblock]
TypeScript:
[codeblock lang=”markup” line=”37″] gate_column = 4 gate_row = Math.random(4 – gate_size + 1) } basic.pause(400) } basic.pause(1000) basic.showString(“You scored ” + score + ” points!”)[/codeblock]
Kao i kod originala, izvedba je jednostavna i lako shvatljiva. Te možete vidjeti kako sve to skupa radi uživo.