Programació | Gràfics | Recursos CITCEA | ||
Tutorial | Exemples | Projectes | Inici |
Anem a fer un programa per jugar al tres en línia. Comencem per definir el mosaic que s'emprarà per fer el taulell i els sprites. Hem optat per tenir un únic sprite que indica la posició del cursor. Quan es posi una fitxa canviarà el taulell per mostrar la fitxa posada al lloc escollit. El nostre mosaic tindrà setze rajoles de 16 ⨯ 16 píxels. Cada casella del taulell estarà formada per quatre rajoles. El fitxer d'imatge tile.bmp és aquest:
Per entendre com el farem servir, el trossejarem en les corresponents rajoles de 16 ⨯ 16 píxels.
La següent taula mostra el número d'ordre que correspon a cada una de les parts:
0 | 1 | 2 | 3 |
4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 |
La següent taula ens indica per a què serveix cada part:
Casella buida | 0 | 1 |
4 | 5 | |
Casella jugador vermell | 8 | 9 |
12 | 13 | |
Casella jugador verd | 10 | 11 |
14 | 15 | |
Voltant del taulell | 6 | |
Cursor | 2 | |
Transparent (per amagar el cursor) | 3 | |
Lateral dret | 7 |
La figura següent mostra l'estat del taulell en un moment donat de la partida. Sobre d'aquest apareixerà, sobreposat, el cursor.
Al lateral del taulell se'ns indica a quin jugador li correspon tirar en cada moment. La distribució de les parts per formar el taulell està definida en el fitxer taulell.csv, que conté nombres enters (que representen les diferents parts) separats per comes. Quan creem el nostre fitxer, és important que ens assegurem que no hi ha cap línia en blanc al final. És recomanable obrir-lo amb la llibreta de Windows, anar al final del fitxer i comprovar-ho.
El programa és una mica similar al de combinant sprites i mosaic. Hem definit dos grups per guardar el taulell i l'sprite (cursor) i un grup global que és el que es mostrarà. Tenim una llista en la que guardarem quina fitxa hi ha a cada casella. Atès que l'aspecte de les caselles anirà variant, tenim una llista on guardem què hi ha a cada casella.
Tenim quatre funcions. Una d'elles comprova si s'ha acabat la partida. Primer mira si ja està el taulell ple i després mira si hi ha tres fitxes iguals en les fileres, columnes o diagonals. Ho fa en aquest ordre perquè podria ser que el taulell estigués ple però hi hagués un guanyador. La funció de situar el cursor busca una casella buida perquè queda millor que posar-lo sobre una plena. Hi ha dues funcions més, una per dibuixar el taulell i una per inicialitzar-lo.
S'ha organitzat el programa al voltant de tres possibles estats: inicialització, jugant i fi de la partida; per a cada un hi ha un if que posa les coses a lloc i un while per desenvolupar el funcionament i gestionar la interacció de l'usuari.
La partida comença quan es prem el botó start. Cada jugador, quan li toca, situa el cursor (amb els botons de desplaçament) on vol situar la fitxa i pica el botó select. Quan acaba la partida s'indica al lateral qui ha guanyat i cal prémer el botó start per poder tornar a començar.
import board import displayio import ugame import adafruit_imageload
# 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
# Fem que el fons del cursor sigui transparent palette.make_transparent(6) # 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] # Llegim el fitxer CSV fit = open("taulell.csv", "r") cont_fit = fit.read() fit.close()
# 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() # Fem invisible el cursor coord_curs = posa_cursor() curs[0] = 3 # El cursor és la peça 3 (invisible) 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 = ugame.buttons.get_pressed() # Lectura actual dels polsadors # A cada if ens assegurem que el boto s'havia deixat anar if not abans & ugame.K_START and boto & ugame.K_START: estat = 1 # Inici del joc jugador = 1 # Primer el jugador vermell abans = boto if estat == 1: # Partida # Mostrem el cursor coord_curs = posa_cursor() curs[0] = 2 # El cursor és la peça 2 (creu, visible) 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] # Mirem els polsadors boto = ugame.buttons.get_pressed() # Lectura actual dels polsadors # A cada if ens assegurem que el boto s'havia deixat anar if not abans & ugame.K_RIGHT and boto & ugame.K_RIGHT and coord_curs[0] < 2: coord_curs[0] += 1 if not abans & ugame.K_LEFT and boto & ugame.K_LEFT and coord_curs[0] > 0: coord_curs[0] -= 1 if not abans & ugame.K_DOWN and boto & ugame.K_DOWN and coord_curs[1] < 2: coord_curs[1] += 1 if not abans & ugame.K_UP and boto & ugame.K_UP and coord_curs[1] > 0: coord_curs[1] -= 1 if not abans & ugame.K_SELECT and boto & ugame.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: 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] while estat == 2: boto = ugame.buttons.get_pressed() # Lectura actual dels polsadors # A cada if ens assegurem que el boto s'havia deixat anar if not abans & ugame.K_START and boto & ugame.K_START: estat = 0 # Inici del joc abans = boto
Esta obra de Oriol Boix está licenciada bajo una licencia no importada Creative Commons Reconocimiento-NoComercial-SinObraDerivada 3.0.