Aquesta és una versió ampliada de l'exemple anterior en la qual posarem diversos sons; en concret, un per quan comença el joc (inici.wav), un per quan es tira a una casella ocupada (error.wav), un per quan acaba la partida amb guanyador (guanya.wav) i un darrer per quan acaba la partida amb empat (empat.wav). Els podem descarregar picant amb el botó dret sobre l'enllaç corresponent.
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)
# Creem els sons
sons = ugame.audio
sons.mute(False)
# 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()
so_inici = open("inici.wav", 'rb')
so_error = open("error.wav", 'rb')
so_guanya = open("guanya.wav", 'rb')
so_empat = open("empat.wav", 'rb')
while True:
if estat == 0: # Situacio inicial
amaga_fitxes()
nova_partida()
mostra_jugador(0)
sons.play(so_inici)
# 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
else:
sons.play(so_error)
time.sleep(0.2)
sons.stop()
# 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!")
sons.play(so_empat)
else:
ja = guanya
jb = 0
text_dalt.text("Guanya el " + noms_jug[guanya - 1])
sons.play(so_guanya)
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.