Creació de jocs amb PyBadge

Programació Gràfics     Recursos CITCEA
Tutorial Exemples Projectes   Inici

Tres en línia

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:

Fitxer

Per entendre com el farem servir, el trossejarem en les corresponents rajoles de 16 ⨯ 16 píxels.

Mosaic Espai Mosaic Espai Mosaic Espai Mosaic
Espai Espai Espai Espai Espai Espai Espai
Mosaic Espai Mosaic Espai Mosaic Espai Mosaic
Espai Espai Espai Espai Espai Espai Espai
Mosaic Espai Mosaic Espai Mosaic Espai Mosaic
Espai Espai Espai Espai Espai Espai Espai
Mosaic Espai Mosaic Espai Mosaic Espai Mosaic

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.

Taulell

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

 

 

 

 

 

 

 

 

 

 

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