Creació de jocs amb PyBadge

Programació Dades pràctiques     Recursos CITCEA
Tutorial Exemples Projectes   Inici

Snake

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.

imatge

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

 

 

 

 

 

 

 

 

 

 

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