Diferència entre revisions de la pàgina «ASIX-M3-UF2-Banc de Solucions»
Línia 1: | Línia 1: | ||
− | + | ==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... | 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... | ||
Línia 166: | Línia 166: | ||
--> | --> | ||
− | + | ==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 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: | ||
Línia 281: | Línia 281: | ||
--> | --> | ||
− | + | ==El Penjat== | |
El penjat consisteix en endevinar una paraula generada aleatòriament per l'ordinador. Dinàmica del joc: | El penjat consisteix en endevinar una paraula generada aleatòriament per l'ordinador. Dinàmica del joc: | ||
Línia 430: | Línia 430: | ||
# Vols continuar jugant? | # Vols continuar jugant? | ||
fiJoc = not jugar() | fiJoc = not jugar() | ||
+ | </source> | ||
+ | --> | ||
+ | |||
+ | ==3 en ratlla== | ||
+ | |||
+ | El joc consisteix en posar 3 fitxes en línia en un tauler de 9 caselles abans que ho faci l'ordinador. | ||
+ | |||
+ | :* El jugador i l'ordinador alternen les jugades. | ||
+ | :* El jugador escollirà el símbol que vol (X o O) i es farà un sorteig de qui comença la partida | ||
+ | :* L'ordinador analitzarà la situació del tauler per cercar la millor jugada a fer. | ||
+ | :* La partida finalitzarà en el moment que un dels jugadors aconsegueixi fer 3 fitxes en linia o quan el tauler estigui omplert. | ||
+ | :* Cal informar del resultat de la partida: Guanya la persona, l'oridnador o hi ha hagut un empat. | ||
+ | :* El programa permetrà tornar a jugar si així o vol el jugador. | ||
+ | |||
+ | <!-- | ||
+ | <source lang=python> | ||
+ | # Ta Te Ti https://inventwithpython.com/es/ | ||
+ | |||
+ | import random | ||
+ | from os import system | ||
+ | |||
+ | |||
+ | |||
+ | def dibuixarTauler(tauler): | ||
+ | |||
+ | # Aqiesta fimcoó dibuixa el tauler del joc | ||
+ | |||
+ | system("clear") | ||
+ | |||
+ | # "tauler" és una llista de 10 cadenes (obviem la posició 0 de la llista) | ||
+ | |||
+ | print(' 3 en ratlla') | ||
+ | print() | ||
+ | print(' | |') | ||
+ | print(' ' + tauler[7] + ' | ' + tauler[8] + ' | ' + tauler[9]) | ||
+ | print(' | |') | ||
+ | print('-----------') | ||
+ | print(' | |') | ||
+ | print(' ' + tauler[4] + ' | ' + tauler[5] + ' | ' + tauler[6]) | ||
+ | print(' | |') | ||
+ | print('-----------') | ||
+ | print(' | |') | ||
+ | print(' ' + tauler[1] + ' | ' + tauler[2] + ' | ' + tauler[3]) | ||
+ | print(' | |') | ||
+ | |||
+ | |||
+ | def escollirSimbolJugador(): | ||
+ | |||
+ | # Permet al jugador escollir el símbol en el que vol jugar. | ||
+ | |||
+ | # Retorna una llista, en la posició 0 el símbol del jugador i en la 1 el de l'ordinador. | ||
+ | |||
+ | simbol = '' | ||
+ | while not (simbol == 'X' or simbol == 'O'): | ||
+ | print('Escull símbol: X o O?') | ||
+ | simbol = input().upper() | ||
+ | if simbol == 'X': | ||
+ | return ['X', 'O'] | ||
+ | else: | ||
+ | return ['O', 'X'] | ||
+ | |||
+ | def jugadorInici(): | ||
+ | # L'atzar decideix quin jugador comença. | ||
+ | |||
+ | if random.randint(0, 1) == 0: | ||
+ | return 'Ordinador' | ||
+ | else: | ||
+ | return 'Jugador' | ||
+ | |||
+ | def simbolTorn(torn, simbolJugador, simbolOrdinador): | ||
+ | |||
+ | # Retorna el simobol del que comenci. | ||
+ | |||
+ | if torn == 'Jugador': | ||
+ | return simbolJugador | ||
+ | else: | ||
+ | return simbolOrdinador | ||
+ | |||
+ | def iniciJoc(): | ||
+ | simbolJugador, simbolOrdinador = escollirSimbolJugador() | ||
+ | tornInici = jugadorInici() | ||
+ | simbolInici = simbolTorn(tornInici, simbolJugador, simbolOrdinador) | ||
+ | return [tornInici, simbolInici] | ||
+ | |||
+ | def jugarDeNou(): | ||
+ | |||
+ | # Retorna True si el jugador vol jugar un altre cop, en cas contrari retorna False. | ||
+ | |||
+ | print('Vols jugar de nou? (sí/no)?') | ||
+ | return input().lower().startswith('s') | ||
+ | |||
+ | |||
+ | def ferJugada(tauler, simbol, jugada): | ||
+ | |||
+ | tauler[jugada] = simbol | ||
+ | |||
+ | |||
+ | def jugadaGuanyadora(tauler, simbol): | ||
+ | |||
+ | # Donat un taulr i un símbol, retorna True si ha trobat el símbol en la mateixa línia o diagonal. | ||
+ | |||
+ | return ((tauler[7] == simbol and tauler[8] == simbol and tauler[9] == simbol) or # horitzontal superior | ||
+ | (tauler[4] == simbol and tauler[5] == simbol and tauler[6] == simbol) or # horitzontal mitja | ||
+ | (tauler[1] == simbol and tauler[2] == simbol and tauler[3] == simbol) or # horitzontal inferior | ||
+ | (tauler[7] == simbol and tauler[4] == simbol and tauler[1] == simbol) or # vertical esquerra | ||
+ | (tauler[8] == simbol and tauler[5] == simbol and tauler[2] == simbol) or # vertical mitja | ||
+ | (tauler[9] == simbol and tauler[6] == simbol and tauler[3] == simbol) or # vertical dreta | ||
+ | (tauler[7] == simbol and tauler[5] == simbol and tauler[3] == simbol) or # diagonal | ||
+ | (tauler[9] == simbol and tauler[5] == simbol and tauler[1] == simbol)) # diagonal | ||
+ | |||
+ | |||
+ | def obtenirDuplicatTauler(tauler): | ||
+ | |||
+ | # Duplica la llista del taulr i retorna el duplicat. | ||
+ | |||
+ | dupTauler = [] | ||
+ | for element in tauler: | ||
+ | dupTauler.append(element) | ||
+ | return dupTauler | ||
+ | |||
+ | |||
+ | def espaiLliure(tauler, jugada): | ||
+ | |||
+ | # Retorna True si hi ha espai per fer la jugada en el tauler. | ||
+ | |||
+ | return tauler[jugada] == ' ' | ||
+ | |||
+ | |||
+ | def obtenirJugadaJugador(tauler): | ||
+ | |||
+ | # Permet al jugador introduir una jugada i la vàlida. | ||
+ | |||
+ | jugada = ' ' | ||
+ | while jugada not in '1 2 3 4 5 6 7 8 9'.split() or not espaiLliure(tauler, int(jugada)): | ||
+ | print('Jugada? (1-9)') | ||
+ | jugada = input() | ||
+ | return int(jugada) | ||
+ | |||
+ | |||
+ | def jugadaAtzar(tauler, llistaJugades): | ||
+ | |||
+ | # Retorna una jugada vàlida de les possibles (llistaJugades). | ||
+ | |||
+ | # Retorna None si ho ha cap jugada vàlida. | ||
+ | |||
+ | jugadesPossibles = [] | ||
+ | for casella in llistaJugades: | ||
+ | if espaiLliure(tauler, casella): | ||
+ | jugadesPossibles.append(casella) | ||
+ | if len(jugadesPossibles) != 0: | ||
+ | return random.choice(jugadesPossibles) | ||
+ | else: | ||
+ | return None | ||
+ | |||
+ | |||
+ | def obtenirJugadaOrdinador(tauler, simbolOrdinador): | ||
+ | |||
+ | # Donat un tauler i el símbol de l'ordinador, determina la jugada a fer. | ||
+ | |||
+ | if simbolOrdinador == 'X': | ||
+ | simbolJugador = 'O' | ||
+ | else: | ||
+ | simbolJugador = 'X' | ||
+ | |||
+ | # Algoritme d'IA (Inteligència Artifical) del 3 en ratlla. | ||
+ | |||
+ | # Primer, verifica si pot guanyar en la propera. | ||
+ | |||
+ | for casella in range(1, 10): | ||
+ | copiaTauler = obtenirDuplicatTauler(tauler) | ||
+ | if espaiLliure(copiaTauler, casella): | ||
+ | ferJugada(copiaTauler, simbolOrdinador, casella) | ||
+ | if jugadaGuanyadora(copiaTauler, simbolOrdinador): | ||
+ | return casella | ||
+ | |||
+ | |||
+ | # Verifica si el jugador podria guanya en la propera jugada, i bloqueja la casella. | ||
+ | |||
+ | for casella in range(1, 10): | ||
+ | copiaTauler = obtenirDuplicatTauler(tauler) | ||
+ | if espaiLliure(copiaTauler, casella): | ||
+ | ferJugada(copiaTauler, simbolJugador, casella) | ||
+ | if jugadaGuanyadora(copiaTauler, simbolJugador): | ||
+ | return casella | ||
+ | |||
+ | # Intenta ocupar una de les cantonades lliures. | ||
+ | |||
+ | jugada = jugadaAtzar(tauler, [1, 3, 7, 9]) | ||
+ | if jugada != None: | ||
+ | return jugada | ||
+ | |||
+ | |||
+ | # De estar lliure, intenta ocupar la casella central. | ||
+ | |||
+ | if espaiLliure(tauler, 5): | ||
+ | return 5 | ||
+ | |||
+ | |||
+ | # Ocupa aleatoriament un dels costats. | ||
+ | |||
+ | return jugadaAtzar(tauler, [2, 4, 6, 8]) | ||
+ | |||
+ | def obtenirJugada(tauler, torn): | ||
+ | if torn[0] == 'Jugador': | ||
+ | jugada = obtenirJugadaJugador(tauler) | ||
+ | else: | ||
+ | jugada = obtenirJugadaOrdinador(tauler, torn[1]) | ||
+ | return jugada | ||
+ | |||
+ | def canviTorn(torn): | ||
+ | if torn[0] == 'Jugador': | ||
+ | torn[0] = 'Ordinador' | ||
+ | else: | ||
+ | torn[0] = 'Jugador' | ||
+ | if torn[1] == 'X': | ||
+ | torn[1] = 'O' | ||
+ | else: | ||
+ | torn[1] = 'X' | ||
+ | |||
+ | |||
+ | def missatgeFiPartida(resultat): | ||
+ | if resultat == 'Jugador': | ||
+ | print('Enhorabona, has guanyat!') | ||
+ | elif resultat == 'Ordinador': | ||
+ | print("L'ordinador t'ha vençut! Has perdut.") | ||
+ | else: | ||
+ | print('Empat!') | ||
+ | |||
+ | # Programa principal | ||
+ | |||
+ | print('Benvingut al 3 en ratlla!') | ||
+ | |||
+ | jugar = True | ||
+ | while jugar: | ||
+ | |||
+ | # Reseteja el tauler | ||
+ | |||
+ | MAXJUGADES = 9 | ||
+ | tauler = [' '] * 10 | ||
+ | dibuixarTauler(tauler) | ||
+ | |||
+ | |||
+ | # torn: llista on posició 0 conté qui li toca jugar ara i posició 1 símbol corresponent | ||
+ | torn = iniciJoc() | ||
+ | |||
+ | hihaGuanyador = False | ||
+ | jugades = 0 | ||
+ | print(torn[0] + ' comença el joc.') | ||
+ | while not hihaGuanyador and jugades < MAXJUGADES: | ||
+ | jugada = obtenirJugada(tauler,torn) | ||
+ | ferJugada(tauler, torn[1], jugada) | ||
+ | jugades += 1 | ||
+ | dibuixarTauler(tauler) | ||
+ | if jugadaGuanyadora(tauler, torn[1]): | ||
+ | hihaGuanyador = True | ||
+ | else: | ||
+ | canviTorn(torn) | ||
+ | if hihaGuanyador: | ||
+ | missatgeFiPartida(torn[0]) | ||
+ | else: | ||
+ | missatgeFiPartida('Empat') | ||
+ | jugar = jugarDeNou() | ||
</source> | </source> | ||
--> | --> |
Revisió del 13:35, 22 gen 2021
Contingut
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()
2. 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):
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
El Penjat
El penjat consisteix en endevinar una paraula generada aleatòriament per l'ordinador. Dinàmica del joc:
- Es presenta una forca i un guio per a cada lletra de la paraula.
- El jugador proposa lletres (d'una en una) i:
- si la lletra es troba a la paraula es substitueixen els guions respectius per la lletra.
- sinó s'actualitza la forca en una part del cos (cap, tronc, braç esquerra, braç dret, cama esquerra i cama dreta).
- El joc finalitza quan es troben totes les lletres o quan ja no queden parts del cos.
- El programa permetrà tornar a jugar si així o vol el jugador.
- Diagrama de flux
3 en ratlla
El joc consisteix en posar 3 fitxes en línia en un tauler de 9 caselles abans que ho faci l'ordinador.
- El jugador i l'ordinador alternen les jugades.
- El jugador escollirà el símbol que vol (X o O) i es farà un sorteig de qui comença la partida
- L'ordinador analitzarà la situació del tauler per cercar la millor jugada a fer.
- La partida finalitzarà en el moment que un dels jugadors aconsegueixi fer 3 fitxes en linia o quan el tauler estigui omplert.
- Cal informar del resultat de la partida: Guanya la persona, l'oridnador o hi ha hagut un empat.
- El programa permetrà tornar a jugar si així o vol el jugador.