Diferència entre revisions de la pàgina «ASIX-M3-UF2-A1.1- Solucions Exercicis disseny descendent»

De wikiserver
Dreceres ràpides: navegació, cerca
(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
Diagrama flux "Mastermind"
# 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()