Diferència entre revisions de la pàgina «ASIX-M3-UF2-A1.1- Solucions Exercicis disseny descendent»
(Es crea la pàgina amb «==Regne de Dracs== En aquest joc, el jugador es troba en una terra de dracs. Els dracs viuen en coves i hi ha de dos tipus: els bons que volen compartir els seus teso...».) |
|||
(Hi ha 2 revisions intermèdies del mateix usuari que no es mostren) | |||
Línia 65: | Línia 65: | ||
explorarCova(numeroDeCova) | explorarCova(numeroDeCova) | ||
fiJoc = jugar() | fiJoc = jugar() | ||
+ | </source> | ||
+ | |||
+ | ==Quadrat màgic== | ||
+ | |||
+ | Construir un Quadrat màgic. Un quadrat màgic és una matriu quadrada (mateix nombre de files que de columnes), amb un '''nombre senar de files i columnes''' on la suma dels elements de totes les seves files i les seves columnes i les dues diagonals val igual. En aquest quadrat no hi ha cap número repetit, i els números que hi ha d'haver han d'anar | ||
+ | des de 1 fins a n<sup>2</sup> on n és el numero de files i columnes. | ||
+ | |||
+ | Com construir-lo? | ||
+ | |||
+ | :* El numero 1 el situarem en el quadrat superior al central (per exemple, per n=5, el quadrat central és (2,2) i el que està per sobre seu el (1,2). | ||
+ | |||
+ | :* El següent número el situarem un quadrat a la dreta i un per sobre. Si un numero està a la posició (i,j), el següent el situarem en (i-1,j+1). | ||
+ | |||
+ | :* Si resulta que al fer el moviment sortim per la dreta, entendrem que automàticament entrarem per l'esquerra, és a dir, és com si la matriu estigués enganxada la part esquerra amb la part dreta. El mateix passa amb dalt i baix. Si sortim per dalt, entrem per baix. | ||
+ | |||
+ | :* A més ens podem trobar que la posició on toca anar un número ja es troba ocupada. Llavors el que farem és tornar a la posició on estàvem i fer el moviment que puja dos posicions (i-2, j ). | ||
+ | |||
+ | :* Un exemple de quadrat màgic per a N=5 seria: | ||
+ | <pre> | ||
+ | 23 6 19 2 15 | ||
+ | 10 18 1 14 22 | ||
+ | 17 5 13 21 9 | ||
+ | 4 12 25 8 16 | ||
+ | 11 24 7 20 3 | ||
+ | </pre> | ||
+ | |||
+ | :*El programa tindrà les següents funcions: | ||
+ | |||
+ | ::'''llegirDimensio''': Li demanem a l’usuari que ens indiqui la mida N de la matriu. Si el valor és correcte, la funció el retorna. | ||
+ | ::'''inicialitzarQuadrat''': Simplement posem tots els valors a 0 | ||
+ | ::'''calculaPosicioInicial''': Segons la dimensió, calculem la primera posició | ||
+ | ::'''assignaValor''': Posa un valor en una posició | ||
+ | ::'''calcularNovaPosicio''': Retorna els valors de fila i columna vàlids per a col·locar el proper valor. | ||
+ | ::'''imprimirQuadrat''': Treu per pantalla el quadrat màgic, | ||
+ | |||
+ | :* El programa serà semblant a aquest : | ||
+ | <source lang=python> | ||
+ | dim = llegirDimensio() | ||
+ | qm = inicialitzarQuadrat(dim) | ||
+ | pos = calculaPosicioInicial(dim) | ||
+ | limit = dim*dim; | ||
+ | for valor in range(1,limit+1): | ||
+ | qm = assignaValor(qm,pos,valor) | ||
+ | pos = calcularNovaPosicio(qm, dim, pos) | ||
+ | imprimirQuadrat(qm) | ||
+ | </source> | ||
+ | |||
+ | <source lang=python> | ||
+ | def llegirDimensio(): | ||
+ | dim = int(input("Dona la dimensio del quadrat actual: ")) | ||
+ | while (dim % 2 == 0): | ||
+ | dim = int(input("Valor incorrecte introdueix de nou : ")) | ||
+ | return (dim); | ||
+ | |||
+ | def inicialitzarQuadrat(dim): | ||
+ | qm = [] | ||
+ | for i in range(dim): | ||
+ | qm.append([]) | ||
+ | for j in range(dim): | ||
+ | qm[i].append(0) | ||
+ | return qm | ||
+ | |||
+ | def calculaPosicioInicial(dim): | ||
+ | columna = (dim // 2) | ||
+ | fila = columna - 1 | ||
+ | pos = (fila, columna) | ||
+ | print(pos) | ||
+ | return pos | ||
+ | |||
+ | def imprimirQuadrat(qm): | ||
+ | print("") | ||
+ | for ll in qm: | ||
+ | print(ll) | ||
+ | |||
+ | def assignaValor(qm, pos, valor): | ||
+ | qm[pos[0]][pos[1]] = valor | ||
+ | return qm | ||
+ | |||
+ | def calcularNovaPosicio(qm, dim, pos): | ||
+ | columnaAux = (pos[1]+1)%dim | ||
+ | filaAux = pos[0] - 1 | ||
+ | if (filaAux < 0): | ||
+ | filaAux = dim - 1 | ||
+ | |||
+ | if (qm[filaAux][columnaAux] != 0): | ||
+ | # lloc ja ocupat | ||
+ | filaAux-=1 | ||
+ | if (filaAux < 0): | ||
+ | filaAux = dim - 1 | ||
+ | columnaAux=pos[1] | ||
+ | return (filaAux,columnaAux) | ||
+ | |||
+ | dim = llegirDimensio() | ||
+ | qm = inicialitzarQuadrat(dim) | ||
+ | pos = calculaPosicioInicial(dim) | ||
+ | limit = dim*dim; | ||
+ | for valor in range(1,limit+1): | ||
+ | qm = assignaValor(qm,pos,valor) | ||
+ | pos = calcularNovaPosicio(qm, dim, pos) | ||
+ | imprimirQuadrat(qm) | ||
+ | </source> | ||
+ | |||
+ | ==Mastermind== | ||
+ | |||
+ | El Mastermind és un joc que consisteix en, mitjançant pistes, deduir un codi numèric de n xifres ocult (en el nostre cas de quatre xifres i generat aleatòriament). Dinàmica del joc: | ||
+ | |||
+ | :* El programa generà aleatòriament un codi numèric de quatre xifres (codi a endevinar). | ||
+ | :* El jugador anirà proposant codis (intents) per tal de trobar el codi a endevinar. | ||
+ | :* L'objectiu es trobar el codi en el menor número d'intents. Es pot limitar el número d'intents (per ex. a 7). | ||
+ | :* Desprès de cada intent el programa donarà pistes que ajudin a deduir el codi: | ||
+ | ::* '''Encerts''': quants números s'han encertat i es troben en la posició correcta . | ||
+ | ::* '''Coincidències''': quants números s'han encertat però no es troben en la posició correcta. | ||
+ | :* Exemple: | ||
+ | ::* codi: 7539 | ||
+ | ::* proposta: 2590 | ||
+ | ::* pistes: 1 encert i 1 coincidència. | ||
+ | :* El joc finalitzarà quan s'hagi trobat el codi numèric o s'hagin exhaurit els intents. | ||
+ | :* El programa permetrà tornar a jugar si així o vol el jugador. | ||
+ | :* Diagrama de flux | ||
+ | |||
+ | [[Imatge:m3_uf2_diagrama_flux_mastermind.png |400px|center| Diagrama flux "Mastermind"]] | ||
+ | |||
+ | <source lang=python> | ||
+ | # ARXIU: [mastermind.py] | ||
+ | |||
+ | # mòdul que permet escollir números aleatoriament | ||
+ | from random import choice | ||
+ | |||
+ | # conjunt de dígits | ||
+ | digits = ('0','1','2','3','4','5','6','7','8','9') | ||
+ | |||
+ | def presentacio_joc(): | ||
+ | print ("Benvingut/da al Mastermind!") | ||
+ | print ("Has d'endivinar un numero de", 4, "xifres diferents") | ||
+ | |||
+ | # generem el número a endivinar de forma aleatoria | ||
+ | def generar_combinacio(): | ||
+ | codi = '' | ||
+ | for i in range(4): | ||
+ | candidat = choice(digits) | ||
+ | # comprovem que els dígits no es repeteixin | ||
+ | while candidat in codi: | ||
+ | candidat = choice(digits) | ||
+ | codi = codi + candidat | ||
+ | return codi | ||
+ | |||
+ | # comprovem que encara queden intents | ||
+ | def quedin_intents(intents, MAXINTENTS): | ||
+ | return intents<MAXINTENTS | ||
+ | |||
+ | def resultat_proposta(codi, proposta): | ||
+ | encerts = 0 | ||
+ | coincidencies = 0 | ||
+ | for i in range(4): | ||
+ | if proposta[i] == codi[i]: | ||
+ | encerts = encerts + 1 | ||
+ | elif proposta[i] in codi: | ||
+ | coincidencies = coincidencies + 1 | ||
+ | print ("La proposta (", proposta, ") té", encerts, \ | ||
+ | "encerts i ", coincidencies, "coincidencies.") | ||
+ | # return encerts, coincidencies | ||
+ | |||
+ | def introdueix_proposta(): | ||
+ | |||
+ | def verificar_digits(proposta,digits): | ||
+ | for i in range(len(proposta)): | ||
+ | if proposta[i] not in digits: | ||
+ | return False | ||
+ | return True | ||
+ | |||
+ | def numeros_diferents(proposta): | ||
+ | aux='' | ||
+ | for i in range(len(proposta)): | ||
+ | if proposta[i] not in aux: | ||
+ | aux += proposta[i] | ||
+ | return len(aux) == len(proposta) | ||
+ | |||
+ | while True: | ||
+ | proposta = input("Qunina combinació proposes?: ") | ||
+ | if len(proposta)!=4: | ||
+ | print ("són 4 números") | ||
+ | elif not verificar_digits(proposta, digits): | ||
+ | print ("Només s'admeten números") | ||
+ | elif not numeros_diferents(proposta): | ||
+ | print ("Els números han de ser diferents") | ||
+ | else: | ||
+ | break; | ||
+ | return proposta | ||
+ | |||
+ | def jugar(): | ||
+ | # Demana si el jugador vol continuar jugant | ||
+ | print ('Vols jugar de nou? (Sí o No)') | ||
+ | return input().lower().startswith('s') | ||
+ | |||
+ | # procesamos las propuestas e indicamos aciertos y coincidencias | ||
+ | MAXINTENTS = 10 | ||
+ | fiJoc = False | ||
+ | while not fiJoc: | ||
+ | presentacio_joc() | ||
+ | codi = generar_combinacio() | ||
+ | intents = 1 | ||
+ | proposta = introdueix_proposta() | ||
+ | encertat = codi == proposta | ||
+ | while not encertat and quedin_intents(intents, MAXINTENTS): | ||
+ | resultat_proposta(codi, proposta) | ||
+ | intents = intents + 1 | ||
+ | proposta = introdueix_proposta() | ||
+ | encertat = codi == proposta | ||
+ | if encertat: | ||
+ | print ("Enhorabona! Has encertat el codi en", intents, "intents.") | ||
+ | else: | ||
+ | print ("Has esgotat els %d intents. Ho sento!" %MAXINTENTS) | ||
+ | fiJoc = not jugar() | ||
</source> | </source> |
Revisió de 12:21, 23 feb 2021
Regne de Dracs
En aquest joc, el jugador es troba en una terra de dracs. Els dracs viuen en coves i hi ha de dos tipus: els bons que volen compartir els seus tesors amb tu i els dolents molt cobdiciosos i afamats que no dubtaran a menjar-se tot aquell que provi d'accedir a la seva cova. El jugador es troba davant de dues coves, en una el drac amigable i en l'altre el drac dolent. El jugador a d'escollir...
- Mòduls a emprar:
from random import randint # per distribuir els dracs en les coves aleatoriament
from time import sleep # per fer més "emocionant" el final del joc
- El programa principal podria ser semblant a:
# Programa principal
fiJoc = False
while not fiJoc:
mostrarIntroduccio()
numeroDeCova = escollirCova()
explorarCova(numeroDeCova)
jugarDeNuevo = jugar()
from random import randint
from time import sleep
# Explicaciíó del joc
def mostrarIntroduccio():
print ( "Et trobes en terres desconegudes habitades per dracs.")
print ( "Arribes davant de dues coves. En una viu, un drac generós i")
print ( "amigable i compartirà el seu tresor amb tu. En L'altre hi viu un drac")
print ( "cobdiciós i afamat, i et devorarà immediatament.")
# Elecció de la cova per part del jugador
def escollirCova():
cova = ''
while cova != '1' and cova != '2':
cova = input('A quina cova vols accedir? (1 ó 2)')
return cova
# Es generà aleatoriament la cova on habiten els respectius dracs i el resultat és ...
def explorarCova(covaEscollida):
print ( "T'aproximes a la cova ...")
sleep (2)
print ( "És fosca i esgarrifosa ...")
sleep (2)
print ( "Un gran drac apareix sobtadament davant teu! Obre la boca i ...")
print ()
sleep (2)
covaAmigable = randint(1, 2)
if covaEscollida == str(covaAmigable):
print("Et regala un tresor!")
else:
print("T'engulleix d'una queixelada!")
# Es demana al jugador si volo continuar jugant
def jugar():
tornarAJugar = input('Vols jugar de nou? (Sí o No)')
return not tornarAJugar.lower().startswith('s')
# Programa principal
fiJoc = False
while not fiJoc:
mostrarIntroduccio()
numeroDeCova = escollirCova()
explorarCova(numeroDeCova)
fiJoc = jugar()
Quadrat màgic
Construir un Quadrat màgic. Un quadrat màgic és una matriu quadrada (mateix nombre de files que de columnes), amb un nombre senar de files i columnes on la suma dels elements de totes les seves files i les seves columnes i les dues diagonals val igual. En aquest quadrat no hi ha cap número repetit, i els números que hi ha d'haver han d'anar des de 1 fins a n2 on n és el numero de files i columnes.
Com construir-lo?
- El numero 1 el situarem en el quadrat superior al central (per exemple, per n=5, el quadrat central és (2,2) i el que està per sobre seu el (1,2).
- El següent número el situarem un quadrat a la dreta i un per sobre. Si un numero està a la posició (i,j), el següent el situarem en (i-1,j+1).
- Si resulta que al fer el moviment sortim per la dreta, entendrem que automàticament entrarem per l'esquerra, és a dir, és com si la matriu estigués enganxada la part esquerra amb la part dreta. El mateix passa amb dalt i baix. Si sortim per dalt, entrem per baix.
- A més ens podem trobar que la posició on toca anar un número ja es troba ocupada. Llavors el que farem és tornar a la posició on estàvem i fer el moviment que puja dos posicions (i-2, j ).
- Un exemple de quadrat màgic per a N=5 seria:
23 6 19 2 15 10 18 1 14 22 17 5 13 21 9 4 12 25 8 16 11 24 7 20 3
- El programa tindrà les següents funcions:
- llegirDimensio: Li demanem a l’usuari que ens indiqui la mida N de la matriu. Si el valor és correcte, la funció el retorna.
- inicialitzarQuadrat: Simplement posem tots els valors a 0
- calculaPosicioInicial: Segons la dimensió, calculem la primera posició
- assignaValor: Posa un valor en una posició
- calcularNovaPosicio: Retorna els valors de fila i columna vàlids per a col·locar el proper valor.
- imprimirQuadrat: Treu per pantalla el quadrat màgic,
- El programa serà semblant a aquest :
dim = llegirDimensio()
qm = inicialitzarQuadrat(dim)
pos = calculaPosicioInicial(dim)
limit = dim*dim;
for valor in range(1,limit+1):
qm = assignaValor(qm,pos,valor)
pos = calcularNovaPosicio(qm, dim, pos)
imprimirQuadrat(qm)
def llegirDimensio():
dim = int(input("Dona la dimensio del quadrat actual: "))
while (dim % 2 == 0):
dim = int(input("Valor incorrecte introdueix de nou : "))
return (dim);
def inicialitzarQuadrat(dim):
qm = []
for i in range(dim):
qm.append([])
for j in range(dim):
qm[i].append(0)
return qm
def calculaPosicioInicial(dim):
columna = (dim // 2)
fila = columna - 1
pos = (fila, columna)
print(pos)
return pos
def imprimirQuadrat(qm):
print("")
for ll in qm:
print(ll)
def assignaValor(qm, pos, valor):
qm[pos[0]][pos[1]] = valor
return qm
def calcularNovaPosicio(qm, dim, pos):
columnaAux = (pos[1]+1)%dim
filaAux = pos[0] - 1
if (filaAux < 0):
filaAux = dim - 1
if (qm[filaAux][columnaAux] != 0):
# lloc ja ocupat
filaAux-=1
if (filaAux < 0):
filaAux = dim - 1
columnaAux=pos[1]
return (filaAux,columnaAux)
dim = llegirDimensio()
qm = inicialitzarQuadrat(dim)
pos = calculaPosicioInicial(dim)
limit = dim*dim;
for valor in range(1,limit+1):
qm = assignaValor(qm,pos,valor)
pos = calcularNovaPosicio(qm, dim, pos)
imprimirQuadrat(qm)
Mastermind
El Mastermind és un joc que consisteix en, mitjançant pistes, deduir un codi numèric de n xifres ocult (en el nostre cas de quatre xifres i generat aleatòriament). Dinàmica del joc:
- El programa generà aleatòriament un codi numèric de quatre xifres (codi a endevinar).
- El jugador anirà proposant codis (intents) per tal de trobar el codi a endevinar.
- L'objectiu es trobar el codi en el menor número d'intents. Es pot limitar el número d'intents (per ex. a 7).
- Desprès de cada intent el programa donarà pistes que ajudin a deduir el codi:
- Encerts: quants números s'han encertat i es troben en la posició correcta .
- Coincidències: quants números s'han encertat però no es troben en la posició correcta.
- Exemple:
- codi: 7539
- proposta: 2590
- pistes: 1 encert i 1 coincidència.
- El joc finalitzarà quan s'hagi trobat el codi numèric o s'hagin exhaurit els intents.
- El programa permetrà tornar a jugar si així o vol el jugador.
- Diagrama de flux
# ARXIU: [mastermind.py]
# mòdul que permet escollir números aleatoriament
from random import choice
# conjunt de dígits
digits = ('0','1','2','3','4','5','6','7','8','9')
def presentacio_joc():
print ("Benvingut/da al Mastermind!")
print ("Has d'endivinar un numero de", 4, "xifres diferents")
# generem el número a endivinar de forma aleatoria
def generar_combinacio():
codi = ''
for i in range(4):
candidat = choice(digits)
# comprovem que els dígits no es repeteixin
while candidat in codi:
candidat = choice(digits)
codi = codi + candidat
return codi
# comprovem que encara queden intents
def quedin_intents(intents, MAXINTENTS):
return intents<MAXINTENTS
def resultat_proposta(codi, proposta):
encerts = 0
coincidencies = 0
for i in range(4):
if proposta[i] == codi[i]:
encerts = encerts + 1
elif proposta[i] in codi:
coincidencies = coincidencies + 1
print ("La proposta (", proposta, ") té", encerts, \
"encerts i ", coincidencies, "coincidencies.")
# return encerts, coincidencies
def introdueix_proposta():
def verificar_digits(proposta,digits):
for i in range(len(proposta)):
if proposta[i] not in digits:
return False
return True
def numeros_diferents(proposta):
aux=''
for i in range(len(proposta)):
if proposta[i] not in aux:
aux += proposta[i]
return len(aux) == len(proposta)
while True:
proposta = input("Qunina combinació proposes?: ")
if len(proposta)!=4:
print ("són 4 números")
elif not verificar_digits(proposta, digits):
print ("Només s'admeten números")
elif not numeros_diferents(proposta):
print ("Els números han de ser diferents")
else:
break;
return proposta
def jugar():
# Demana si el jugador vol continuar jugant
print ('Vols jugar de nou? (Sí o No)')
return input().lower().startswith('s')
# procesamos las propuestas e indicamos aciertos y coincidencias
MAXINTENTS = 10
fiJoc = False
while not fiJoc:
presentacio_joc()
codi = generar_combinacio()
intents = 1
proposta = introdueix_proposta()
encertat = codi == proposta
while not encertat and quedin_intents(intents, MAXINTENTS):
resultat_proposta(codi, proposta)
intents = intents + 1
proposta = introdueix_proposta()
encertat = codi == proposta
if encertat:
print ("Enhorabona! Has encertat el codi en", intents, "intents.")
else:
print ("Has esgotat els %d intents. Ho sento!" %MAXINTENTS)
fiJoc = not jugar()