Creació de jocs amb PyBadge

Programació Gràfics     Recursos CITCEA
Tutorial Exemples Projectes   Inici

Tres en línia amb NeoPixels i sons

Aquest programa és bàsicament el del tres en línia amb NeoPixels però hi hem afegit alguns sons, en concret tres melodies que sonaran en moments concrets del joc. Hem canviat la forma de llegir els polsadors per evitar problemes de compatibilitat.

import audio_lib
import audioio
import digitalio
import board
import displayio
import neopixel
import time
import adafruit_imageload
from gamepadshift import GamePadShift
# Objecte per als NeoPixels
cadena = neopixel.NeoPixel(board.NEOPIXEL, 5, brightness=0.1)
# Configuracio de l'altaveu
altaveu = digitalio.DigitalInOut(board.SPEAKER_ENABLE)
altaveu.direction = digitalio.Direction.OUTPUT
sons = audioio.AudioOut(board.SPEAKER)
# Objecte per llegir els botons
pad = GamePadShift(digitalio.DigitalInOut(board.BUTTON_CLOCK),
                   digitalio.DigitalInOut(board.BUTTON_OUT),
                   digitalio.DigitalInOut(board.BUTTON_LATCH))
# Creem un objecte per a la pantalla
pant = board.DISPLAY
# Carreguem el fitxer amb la imatge
imatge, palette = adafruit_imageload.load("/tile.bmp",
                                                bitmap=displayio.Bitmap,
                                                palette=displayio.Palette)
# Creem l'sprite del cursor
curs = displayio.TileGrid(imatge, pixel_shader=palette,
                            width = 1, height = 1,
                            tile_width = 16, tile_height = 16)
# 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 a l'sprite
grup_curs = displayio.Group(scale=1)
grup_curs.append(curs)
# 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_curs)  # Despres el cursor
# Llista on guardarem les posicions de les fitxes
# 0 = lliure     1 = vermell     2 = verd
fitxes = [[0, 0, 0], [0, 0, 0], [0, 0, 0]]
# Llista que ens diu que es mostra a cada casella
caselles = [[0, 1, 4, 5], [8, 9, 12, 13], [10, 11, 14, 15]]
# Coordenades del cursor
coord_curs = [1, 1]
# Melodies
mel_inici = [262, 294, 330, 262]
mel_error = [294, 294]
mel_guanya = [349, 370, 330, 277, 415, 440, 392, 466, 494, 262, 294, 311]
# Constants dels botons
K_LEFT = 128
K_UP = 64
K_DOWN = 32
K_RIGHT = 16
K_SELECT = 8
K_START = 4
K_X = 2
K_O = 1
# Fem que el fons del cursor sigui transparent
palette.make_transparent(6)
# Llegim el fitxer CSV
fit = open("taulell.csv", "r")
cont_fit = fit.read()
fit.close()
# Funcio que toca una melodia
def toca_melodia(melod):
    altaveu.value = True
    for nota in melod:
        sinusoide = audio_lib.nota(nota, 1)
        sons.play(sinusoide, loop=True)
        time.sleep(0.1)
    sons.stop()
    altaveu.value = False
# Fi de la funcio
# Funcio que comprova si ja hem acabat
def comprova():
    acabat = 0
    suma = 0
    for xa in range(0, 3):
        for ya in range(0, 3):
            if fitxes[xa][ya] > 0:
                suma += 1
    if suma == 9:
        acabat = 3
    for jg in range(1, 3):
        if fitxes[0][0] == jg and fitxes[0][1] == jg and fitxes[0][2] == jg:
            acabat = jg  # Columna 1
        if fitxes[1][0] == jg and fitxes[1][1] == jg and fitxes[1][2] == jg:
            acabat = jg  # Columna 2
        if fitxes[2][0] == jg and fitxes[2][1] == jg and fitxes[2][2] == jg:
            acabat = jg  # Columna 3
        if fitxes[0][0] == jg and fitxes[1][0] == jg and fitxes[2][0] == jg:
            acabat = jg  # Filera 1
        if fitxes[0][1] == jg and fitxes[1][1] == jg and fitxes[2][1] == jg:
            acabat = jg  # Filera 1
        if fitxes[0][2] == jg and fitxes[1][2] == jg and fitxes[2][2] == jg:
            acabat = jg  # Filera 3
        if fitxes[0][0] == jg and fitxes[1][1] == jg and fitxes[2][2] == jg:
            acabat = jg  # Diagonal
        if fitxes[2][0] == jg and fitxes[1][1] == jg and fitxes[0][2] == jg:
            acabat = jg  # Diagonal
    return acabat
# Fi de la funcio
# Funcio que situa el cursor
def posa_cursor():
    cc = [0, 0]
    for xa in range(0, 3):
        for ya in range(0, 3):
            if fitxes[xa][ya] == 0:
                cc[0] = xa
                cc[1] = ya
    return cc
# Fi de la funcio
# Funcio que dibuixa el taulell
def dib_taulell():
    for xa in range(0, 3):
        for ya in range(0, 3):
            f = fitxes[xa][ya]
            xx = 1 + 2 * xa
            yy = 1 + 2 * ya
            taulell[xx, yy] = caselles[f][0]
            taulell[xx+1, yy] = caselles[f][1]
            taulell[xx, yy+1] = caselles[f][2]
            taulell[xx+1, yy+1] = caselles[f][3]
# Fi de la funcio
# Funcio que inicialitza el taulell
def ini_taulell():
    # 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 linia
        for vx in range(0, len(linia)):
            # Dibuixem el taulell
            taulell[vx, vy] = int(linia[vx])
# Fi de la funcio
# Mostra el grup a la pantalla
pant.show(grup)
abans = 0  # Lectura anterior dels polsadors
estat = 0  # De moment, estat inicial
while True:
    if estat == 0:  # Situacio inicial
        # Inicialitzem el taulell
        ini_taulell()
        # Apaga el NeoPixel
        cadena[0] = (0, 0, 0)
        # Fem invisible el cursor
        coord_curs = posa_cursor()
        curs[0] = 3
        for xa in range(0, 3):
            for ya in range(0, 3):
                fitxes[xa][ya] = 0
    while estat == 0:  # Esperem que es premi Start
        boto = pad.get_pressed()  # Lectura actual dels polsadors
        # A cada if ens assegurem que el boto s'havia deixat anar
        if not abans & K_START and boto & K_START:
            estat = 1  # Inici del joc
            jugador = 1  # Primer el jugador vermell
        abans = boto
    if estat == 1:  # Partida
        # Toquem una melodia
        toca_melodia(mel_inici)
        # Mostrem el cursor
        coord_curs = posa_cursor()
        curs[0] = 2
    while estat == 1:
        # Indiquem qui juga
        taulell[8, 3] = caselles[jugador][0]
        taulell[9, 3] = caselles[jugador][1]
        taulell[8, 4] = caselles[jugador][2]
        taulell[9, 4] = caselles[jugador][3]
        if jugador == 1:
            cadena[0] = (255, 0, 0)
        if jugador == 2:
            cadena[0] = (0, 255, 0)
        # Mirem els polsadors
        boto = pad.get_pressed()  # Lectura actual dels polsadors
        # A cada if ens assegurem que el boto s'havia deixat anar
        if not abans & K_RIGHT and boto & K_RIGHT and coord_curs[0] < 2:
            coord_curs[0] += 1
        if not abans & K_LEFT and boto & K_LEFT and coord_curs[0] > 0:
            coord_curs[0] -= 1
        if not abans & K_DOWN and boto & K_DOWN and coord_curs[1] < 2:
            coord_curs[1] += 1
        if not abans & K_UP and boto & K_UP and coord_curs[1] > 0:
            coord_curs[1] -= 1
        if not abans & K_SELECT and boto & K_SELECT:
            if fitxes[coord_curs[0]][coord_curs[1]] == 0:
                fitxes[coord_curs[0]][coord_curs[1]] = jugador
                coord_curs = posa_cursor()
                jugador +=1
                if jugador > 2:
                    jugador = 1
            else:
                # So d'error
                toca_melodia(mel_error)
                coord_curs = posa_cursor()
            dib_taulell()
            guanya = comprova()
            if guanya > 0:
                estat = 2
        abans = boto
        curs.x = 24 + 32 * coord_curs[0]
        curs.y = 24 + 32 * coord_curs[1]
    if estat == 2:  # Fi partida
        curs[0] = 3  # Amaga el cursor
        jugador = guanya
        if guanya == 3:
            jugador = 0
        taulell[8, 3] = 7
        taulell[9, 3] = 7
        taulell[8, 4] = 7
        taulell[9, 4] = 7
        taulell[8, 1] = caselles[jugador][0]
        taulell[9, 1] = caselles[jugador][1]
        taulell[8, 2] = caselles[jugador][2]
        taulell[9, 2] = caselles[jugador][3]
        taulell[8, 5] = caselles[jugador][0]
        taulell[9, 5] = caselles[jugador][1]
        taulell[8, 6] = caselles[jugador][2]
        taulell[9, 6] = caselles[jugador][3]
        # Toquem una melodia
        toca_melodia(mel_guanya)
        for i in range(0, 5):
            if jugador == 0:
                cadena[0] = (0, 0, 255)
            if jugador == 1:
                cadena[0] = (255, 0, 0)
            if jugador == 2:
                cadena[0] = (0, 255, 0)
            time.sleep(0.2)
            cadena[0] = (0, 0, 0)
            time.sleep(0.2)
    while estat == 2:
        boto = pad.get_pressed()  # Lectura actual dels polsadors
        # A cada if ens assegurem que el boto s'havia deixat anar
        if not abans & K_START and boto & K_START:
            estat = 0  # Inici del joc
        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.