Aquesta és una versió ampliada de l'exemple anterior en la qual farem servir un NeoPixel de la placa per indicar qui juga i qui guanya.
El programa, en el qual hem marcat en groc les línies noves o modificades respecte la versió anterior, és el següent:
import board import random import analogio import ugame import stage import neopixel import time
# Objecte per als NeoPixels
cadena = neopixel.NeoPixel(board.NEOPIXEL, 5, brightness=0.1)
soroll = analogio.AnalogIn(board.A3)
random.seed(soroll.value)
banc = stage.Bank.from_bmp16("tile0.bmp")
spt = stage.Bank.from_bmp16("tile2.bmp")
fons = stage.Grid(banc, 10, 8) # 16 * 10 = 160
# 16 * 8 = 128
# Creem un sprite per al fons i un per a l'indicador de torn
cursor = stage.Sprite(spt, 3, 24, 24) # Inici a (24, 24)
torn = stage.Sprite(spt, 3, 136, 56)
# Creem les 9 fitxes, inicialment invisibles
fitxes = []
for i in range(3):
for j in range(3):
xf = 24 + 32 * i
yf = 24 + 32 * j
fitxes = fitxes + [stage.Sprite(spt, 3, xf, yf)]
joc = stage.Stage(ugame.display, 12)
# Creem els textos
text_dalt = stage.Text(20, 1)
text_dalt.move(6, 6)
text_baix = stage.Text(20, 1)
text_baix.move(6, 114)
# Llista on guardarem les posicions de les fitxes # 0 = lliure 1 = verd 2 = vermell caselles = [[0, 0, 0], [0, 0, 0], [0, 0, 0]] coord_curs = [1, 1] estat = 0 # Per començar, l'estat inicial abans = 0 # Lectura anterior dels polsadors jugador = random.randint(1, 2) # Jugador aleatori noms_jug = ["verd", "roig"] colors = [(0, 0, 0), (0, 64, 0), (64, 0, 0)]
# Funcio que comprova si ja hem acabat
# Torna el jugador que ha guanyat o 3 si hi ha empat
def comprova():
acabat = 0
suma = 0
for xa in range(3):
for ya in range(3):
if caselles[xa][ya] > 0:
suma += 1
if suma == 9:
acabat = 3
for jg in range(1, 3):
for k in range(3):
if caselles[k][0] == jg and caselles[k][1] == jg and caselles[k][2] == jg:
acabat = jg # Columna k
for k in range(3):
if caselles[0][k] == jg and caselles[1][k] == jg and caselles[2][k] == jg:
acabat = jg # Filera k
if caselles[0][0] == jg and caselles[1][1] == jg and caselles[2][2] == jg:
acabat = jg # Diagonal
if caselles[2][0] == jg and caselles[1][1] == jg and caselles[0][2] == jg:
acabat = jg # Diagonal
return acabat
# Fi de la funcio
# Funcio que amaga les fitxes
# 0 = invisible 1 = verd 2 = vermell
def amaga_fitxes():
for i in range(9):
fitxes[i].set_frame(3, 0)
# Fi de la funcio
# Funcio que mostra les fitxes
# 0 = invisible 1 = verd 2 = vermell
def mostra_fitxa(x, y, jug):
ind = 3 * x + y
if jug == 0:
torn.set_frame(3, 0)
elif jug < 3:
fitxes[ind].set_frame(jug - 1, 0)
# Fi de la funcio
# Funcio que mostra a qui li toca tirar
# 0 = no mostra 1 = verd 2 = vermell
def mostra_jugador(vis):
cadena[0] = colors[vis]
if vis == 0:
torn.set_frame(3, 0)
elif vis < 3:
torn.set_frame(vis - 1, 0)
# Fi de la funcio
# Funcio que escriu a qui li toca tirar
# 0 = no mostra 1 = verd 2 = vermell
def escriu_jugador(vis):
text_dalt.clear()
text_dalt.cursor(0, 0)
if 0 < vis < 3:
text_dalt.text("Tira " + noms_jug[vis - 1])
# Fi de la funcio
# Funcio que mostra o amaga el cursor
# Si el paràmetre és 0 no es veura
def mostra_cursor(vis):
if vis == 0:
cursor.set_frame(3, 0)
else:
cursor.set_frame(2, 0)
# Fi de la funcio
# Funcio que situa el cursor en una casella buida
# Retorna la posicio del cursor
def busca_pos_cursor():
cc = [0, 0]
for xa in range(3):
for ya in range(3):
if caselles[xa][ya] == 0:
cc[0] = xa
cc[1] = ya
return cc
# Fi de la funcio
# Funcio que situa el cursor en una casella buida
def situa_cursor(coord):
xyc = [0, 0]
xyc[0] = 24 + 32 * coord[0]
xyc[1] = 24 + 32 * coord[1]
cursor.move(xyc[0], xyc[1])
return xyc
# Fi de la funcio
# Funcio que reinicia la partida
def nova_partida():
for i in range(3):
for j in range(3):
caselles[i][j] = 0
# Fi de la funcio
# Funcio que dibuixa el taulell
def dib_taulell():
tau = [ [5, 5, 5, 5, 5, 5, 5, 5, 0, 0],
[5, 1, 2, 1, 2, 1, 2, 5, 0, 0],
[5, 4, 3, 4, 3, 4, 3, 5, 0, 0],
[5, 1, 2, 1, 2, 1, 2, 5, 1, 2],
[5, 4, 3, 4, 3, 4, 3, 5, 4, 3],
[5, 1, 2, 1, 2, 1, 2, 5, 0, 0],
[5, 4, 3, 4, 3, 4, 3, 5, 0, 0],
[5, 5, 5, 5, 5, 5, 5, 5, 0, 0] ]
for i in range(8): # 8 fileres
for j in range(10): # 10 columnes
fons.tile(j, i, tile=tau[i][j])
# Fi de la funcio
joc.layers = [cursor, torn] + fitxes + [text_dalt, text_baix, fons]
dib_taulell()
while True:
if estat == 0: # Situacio inicial
amaga_fitxes()
nova_partida()
mostra_jugador(0)
# Apaga el NeoPixel
cadena[0] = (0, 0, 0)
text_dalt.clear()
text_baix.clear()
text_dalt.cursor(0, 0)
text_baix.cursor(0, 0)
text_dalt.text("Tres en ratlla")
text_baix.text("Prem START")
joc.render_block()
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
abans = boto
if estat == 1: # Partida
text_baix.clear()
text_baix.cursor(0, 0)
# Mostrem el cursor
coord_curs = [1,1]
situa_cursor(coord_curs)
escriu_jugador(jugador)
mostra_jugador(jugador)
mostra_cursor(1)
joc.render_block()
while estat == 1:
# Indiquem qui juga
escriu_jugador(jugador)
mostra_jugador(jugador)
# Mirem els polsadors per moure el cursor
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
situa_cursor(coord_curs)
joc.render_block()
# El botó SELECT posa la fitxa, si es pot
if not abans & ugame.K_SELECT and boto & ugame.K_SELECT:
if caselles[coord_curs[0]][coord_curs[1]] == 0:
caselles[coord_curs[0]][coord_curs[1]] = jugador
mostra_fitxa(coord_curs[0], coord_curs[1], jugador)
jugador +=1
if jugador > 2:
jugador = 1
# Resituem el cursor
coord_curs = busca_pos_cursor()
situa_cursor(coord_curs)
joc.render_block()
# Mirem si ja ha acabat
guanya = comprova()
if guanya > 0:
estat = 2
abans = boto
if estat == 2: # Final
mostra_cursor(0)
jugador = random.randint(1, 2) # Jugador aleatori
text_dalt.clear()
text_dalt.cursor(0, 0)
if guanya == 3:
ja = 1
jb = 2
text_dalt.text("Empat!")
else:
ja = guanya
jb = 0
text_dalt.text("Guanya el " + noms_jug[guanya - 1])
text_baix.clear()
text_baix.cursor(0, 0)
text_baix.text("Prem START")
while estat == 2:
#Mostra el guanyador intermitent
mostra_jugador(ja)
joc.render_block()
cadena[0] = colors[ja]
time.sleep(0.5)
mostra_jugador(jb)
joc.render_block()
cadena[0] = colors[jb]
time.sleep(0.5)
# Esperem START per tornar a l'inici
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.