En aquest joc tenim una serp situada en un taulell rectangular que comença amb un tamany mínim i ha d'anar movent-se per aquest per menjar les pomes que van apareixent i en conseqüència augmentar de tamany i obtenir punts. L'objectiu del joc és menjar totes les pomes per tal que la serp acabi ocupant tot el taulell possible. El joc pot finalitzar quan el cap de la serp xoca contra la vora del tauler o contra el seu propi cos.
Les imatges que fa servir el joc són les que es mostren tot seguit. També tenim un fitxer de valors separats per comes, taulell.csv, que indica la distribució dels elements quan comença la partida.

El programa és el següent:
import board import ugame import displayio import adafruit_imageload from random import randint import neopixel import time import terminalio from adafruit_display_text import label
cadena = neopixel.NeoPixel(board.NEOPIXEL, 5, brightness=0.1)
# Creem un objecte per a la pantalla
pant = board.DISPLAY
# Carreguem el fitxer amb la imatge
imatge, palette = adafruit_imageload.load("/terreny.bmp",
bitmap=displayio.Bitmap,
palette=displayio.Palette)
# Creem els sprites
def dib_taulell():
global sprites, coord_sprites, grup, cdn, cdn_p, poma, grup_serp, grup_taulell, grup_poma, grups
sprites = [] # Llista d'sprites
coord_sprites = [] # Llista de coordenades dels sprites
for k in range(0, 4):
if k == 0:
spt = 18 # Cap
cdn = [5, 3]
if k == 1:
spt = 5 # Cos 1
cdn = [4, 3]
if k == 2:
spt = 5 # Cos 2
cdn = [3, 3]
if k == 3:
spt = 8 # Cos 3
cdn = [2, 3]
spr = displayio.TileGrid(imatge, pixel_shader=palette,
width = 1, height = 1,
tile_width = 16, tile_height = 16)
spr[0] = spt
sprites.append(spr)
coord_sprites.append(cdn)
poma = displayio.TileGrid(imatge, pixel_shader=palette,
width = 1, height = 1,
tile_width = 16, tile_height = 16)
poma[0] = 9
cdn_p = [7, 3]
# Creem un mosaic per al taulell
taulell = displayio.TileGrid(imatge, pixel_shader=palette,
width = 10, height = 8,
tile_width = 16, tile_height = 16)
# Definim un grup per als sprites
grup_serp = displayio.Group(scale=1, max_size=48)
grup_poma = displayio.Group(scale=1, max_size=1)
for sprt in sprites:
grup_serp.append(sprt)
grup_poma.append(poma)
# Definim un grup per al taulell
grup_taulell = displayio.Group(scale=1)
grup_taulell.append(taulell)
# Creem un grup per englobar-ho tot
grup = displayio.Group()
# Afegim els grups anteriors al global
grup.append(grup_taulell) # Primer el taulell
grup.append(grup_serp) # Despres els sprites
grup.append(grup_poma)
# Fem que el fons dels personatges sigui transparent
palette.make_transparent(8)
# Dibuixem el taulell
# Llegim el fitxer CSV
fit = open("taulell.csv", "r")
cont_fit = fit.read()
fit.close()
# Descomposem el fitxer en una llista de linies
llista_fit = cont_fit.replace("\r", "").split("\n")
# Bucle que recorre totes les linies
for vy in range(0, len(llista_fit)):
# Creem una llista amb els elements de la linia
linia = llista_fit[vy].split(",")
# Bucle que recorre tots els elements de la línia
for vx in range(0, len(linia)):
# Dibuixem el taulell
taulell[vx, vy] = int(linia[vx])
# Mostra el grup a la pantalla
pant.show(grup)
def noves_coord():
coord_anterior=[]
for k in range(0,len(coord_sprites)-1):
coord_anterior.append([])
for e in [0,1]:
coord_anterior[k].append(coord_sprites[k][e])
for k in range(1,len(coord_sprites)):
for e in [0,1]:
coord_sprites[k][e]=coord_anterior[k-1][e]
if moviment[0]==16:
coord_sprites[0][0] += 1
if moviment[0]==128:
coord_sprites[0][0] -= 1
if moviment[0]==32:
coord_sprites[0][1] += 1
if moviment[0]==64:
coord_sprites[0][1] -= 1
def sprite_cap(k):
global cap
if moviment[k]==16:
cap = 18
if moviment[k]==128:
cap = 3
if moviment[k]==32:
cap = 13
if moviment[k]==64:
cap = 23
def sprite_cos(k):
global cos
if (moviment[(k-1)] == 32 and moviment[k] == 32) or (moviment[(k-1)] == 64 and moviment[k] == 64):
cos[k-1] = 0
if (moviment[(k-1)] == 16 and moviment[k] == 16) or (moviment[(k-1)] == 128 and moviment[k] == 128):
cos[k-1] = 5
if (moviment[(k-1)] == 16 and moviment[k] == 64) or (moviment[(k-1)] == 32 and moviment[k] == 128):
cos[k-1] = 1
if (moviment[(k-1)] == 128 and moviment[k] == 64) or (moviment[(k-1)] == 32 and moviment[k] == 16):
cos[k-1] = 2
if (moviment[(k-1)] == 64 and moviment[k] == 128) or (moviment[(k-1)] == 16 and moviment[k] == 32):
cos[k-1] = 6
if (moviment[(k-1)] == 64 and moviment[k] == 16) or (moviment[(k-1)] == 128 and moviment[k] == 32):
cos[k-1] = 7
def sprite_cua(k):
global cua
if moviment[k-1]==16:
cua = 8
if moviment[k-1]==128:
cua = 19
if moviment[k-1]==32:
cua = 24
if moviment[k-1]==64:
cua = 14
def noves_sprites():
global cos, cap, cua
for k in range(0,len(sprites)):
if k==0:
noves_coord()
sprite_cap(k)
if k>0 and k<(len(sprites)-1):
sprite_cos(k)
if k==(len(sprites)-1):
sprite_cua(k)
for k in range(0,len(sprites)):
sprites[k].x = 16 * (coord_sprites[k][0])
sprites[k].y = 16 * (coord_sprites[k][1])
if k==0:
sprites[k][0]=cap
if k>0 and k<(len(sprites)-1):
sprites[k][0]=cos[k-1]
if k==(len(sprites)-1):
sprites[k][0]=cua
def xoc():
global estat
if coord_sprites[0] in coord_sprites[1:-1]:
estat = 2
return True
if coord_sprites[0][0] > 8 or coord_sprites[0][0]<1 or coord_sprites[0][1]>6 or coord_sprites[0][1]<1:
estat = 2
return True
return False
def afegir_sprite():
k=len(sprites)-1
cos.append(5)
sprite_cos(k)
sprites[k][0]=cos[k-1]
sprite_cua(k+1)
spt = cua
cdn = coord_sprites[k+1]
spr = displayio.TileGrid(imatge, pixel_shader=palette,
width = 1, height = 1,
tile_width = 16, tile_height = 16)
spr[0] = spt
sprites.append(spr)
moviment.append(16)
grup_serp.append(sprites[k+1])
sprites[k+1].x = 16 * (coord_sprites[k+1][0])
sprites[k+1].y = 16 * (coord_sprites[k+1][1])
coord_sprites.append([1,1])
temps_led=0
def comprobar_punt():
global punts, temps_led
if temps > (temps_led + 0.1):
cadena[0] = (0,0,0)
if coord_sprites[0] == cdn_p:
punts += 1
cadena[0] = (0,250,0)
temps_led = temps
return True
def punt():
global cdn_p, punts, velocitat
afegir_sprite()
proxima_p()
cdn_p=list(possible_p[randint(0,len(possible_p)-1)])
poma.x = 16 * cdn_p[0]
poma.y = 16 * cdn_p[1]
if punts == 3:
velocitat = 0.58
elif punts == 6:
velocitat = 0.53
elif punts == 10:
velocitat = 0.48
elif punts == 17:
velocitat = 0.4
def proxima_p():
global possible_p
possible_p=[]
no_possible_p=[]
for x in range(1,9):
for y in range (1,7):
possible_p.append((x,y))
for k in coord_sprites:
no_possible_p.append((k[0], k[1]))
a=set(possible_p)
b=set(no_possible_p)
possible_p=list(a-b)
def dib_taulell_ini():
dib_taulell()
global deixa, abans, punts, moviment, cap, cua, cos, n, auto, temps_auto, temps, velocitat
velocitat = 0.63
auto=16
temps = 0
temps_auto=0
temps_led=0
n=0
cap=18
cos=[5,5]
cua=8
moviment=[16,16,16,16,16]
coord_sprites.append([1,3])
deixa = 0
abans = 16
punts=0
for sprt in sprites:
sprt.x = 16 * (coord_sprites[n][0])
sprt.y = 16 * (coord_sprites[n][1])
n += 1
poma.x = 16 * cdn_p[0]
poma.y = 16 * cdn_p[1]
#Fi funció
dib_taulell_ini() record = 0 estat = 0
while True:
if estat == 0:
dib_taulell_ini()
cadena.brigthess = 0.1
while estat == 0:
boto = ugame.buttons.get_pressed()
if not abans & ugame.K_START and boto & ugame.K_START:
estat = 1 # Inici del joc
abans = boto
while estat == 1:
boto = ugame.buttons.get_pressed()
temps = time.monotonic()
# Lectura actual dels polsadors
# A cada if ens assegurem que el boto s'havia deixat anar
if not deixa == ugame.K_RIGHT and boto == ugame.K_RIGHT:
if not abans == ugame.K_LEFT:
auto=boto
if not deixa == ugame.K_LEFT and boto == ugame.K_LEFT:
if not abans == ugame.K_RIGHT:
auto=boto
if not deixa == ugame.K_DOWN and boto == ugame.K_DOWN:
if not abans == ugame.K_UP:
auto=boto
if not deixa == ugame.K_UP and boto == ugame.K_UP:
if not abans == ugame.K_DOWN:
auto=boto
if temps > (temps_auto + velocitat):
temps_auto = temps
if auto == ugame.K_RIGHT:
movi_anterior=[]
for mov in moviment:
movi_anterior.append(mov)
for k in range(1,len(moviment)):
moviment[k]=movi_anterior[k-1]
moviment[0]=auto
noves_sprites()
xoc()
if comprobar_punt():
if punts == 44:
estat = 2
poma[0] = 4
afegir_sprite()
else:
punt()
abans = auto
if auto == ugame.K_LEFT:
movi_anterior=[]
for mov in moviment:
movi_anterior.append(mov)
for k in range(1,len(moviment)):
moviment[k]=movi_anterior[k-1]
moviment[0]=auto
noves_sprites()
xoc()
if comprobar_punt():
if punts == 44:
estat = 2
poma[0] = 4
afegir_sprite()
else:
punt()
abans = auto
if auto == ugame.K_DOWN:
movi_anterior=[]
for mov in moviment:
movi_anterior.append(mov)
for k in range(1,len(moviment)):
moviment[k]=movi_anterior[k-1]
moviment[0]=auto
noves_sprites()
xoc()
if comprobar_punt():
if punts == 44:
estat = 2
poma[0] = 4
afegir_sprite()
else:
punt()
abans = auto
if auto == ugame.K_UP:
movi_anterior=[]
for mov in moviment:
movi_anterior.append(mov)
for k in range(1,len(moviment)):
moviment[k]=movi_anterior[k-1]
moviment[0]=auto
noves_sprites()
xoc()
if comprobar_punt():
if punts == 44:
estat = 2
poma[0] = 4
afegir_sprite()
else:
punt()
abans = auto
deixa = boto
if estat == 2:
cadena.brigthess = 0.9
if punts > record:
record = punts
if punts >= 44:
color = 0x00C000
led = (0,255,0)
text = 'Vicotria!'
temps_sleep = 1
else:
color = 0xFFFF00
led = (255,0,0)
text = 'Derrota!'
temps_sleep = 0.5
for n in range(0,2):
cadena[0] = led
time.sleep(temps_sleep)
cadena[0] = (0,0,0)
time.sleep(temps_sleep)
pant = board.DISPLAY
font = terminalio.FONT
# Creem un requadre de text i el situem a la part superior
req_text = label.Label(font, text=' '+text+'\n Puntuacio = '+str(punts)+
'\n Record = '+str(record)+'\n\nPrem START per reiniciar', color=color)
req_text.x = 9
req_text.y = 43
# Mostrem el text
pant.show(req_text)
while estat == 2:
cadena[0] = led
boto = ugame.buttons.get_pressed()
if not abans & ugame.K_START and boto & ugame.K_START:
cadena[0] = (0,0,0)
estat = 0 # Inici del joc
while not boto == 0:
boto = ugame.buttons.get_pressed()
abans = boto

Esta obra de Oriol Boix está licenciada bajo una licencia no importada Creative Commons Reconocimiento-NoComercial-SinObraDerivada 3.0.