Python代写 | Facultat de Física – Informàtica

本次Python代写是完成一个“Enfonsar la flota”的游戏

Facultat de Física – Informàtica
0. casella buida
1. casellla de vaixell
2. casella buida on ja s’ha marcat una jugada (“aigua”)
3. casella de vaixell on ja s’ha marcat una jugada (“tocat”)
Exemple:
taulell_O = [
[1,1,0,1,0,0,1,1,1,1],
[0,0,0,1,0,0,0,0,0,0],
[1,0,0,1,0,1,1,1,0,1],
[1,0,2,0,0,0,0,0,0,1],
[1,0,0,0,0,2,2,0,0,0],
[1,2,0,0,0,1,0,2,0,3],
[0,0,0,0,0,1,0,0,0,3],
[3,3,0,0,0,0,0,2,0,1],
[0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,1,1,1,1,1]
]
Facultat de Física – Informàtica
Reavaluació 2019-2020
Nota: el taulell anterior és l’exemple de la viquipèdia, però la distribució de vaixells no és la
estàndard que demanem. Podeu usar numpy.ndarray o altres estructures de dades en comptes
de llistes, però en principi no hi ha motiu per fer-ho.
• torn
Enter que codifica el torn: 0 per l’ordinador i 1 pel jugador
Implementeu també les següents funcions que usarem més endavant per implementar el joc:
• crear_taulell(mida) à retorn un taulell amb les files i columnes indicades per mida
Funció amb la que inicialitzem les variables taulell_J i taulell_O omplint-les de zeros.
• visualitza_taulell(taulell,vaixells)
Funció que visualitza el contingut d’un taulell per consola. Rep com a argument un taulell i una
variable booleana vaixells. Imprimeix per pantalla una visualització del taulell; si vaixells val
True mostra totes les caselles de vaixell, altrament només mostra les caselles de vaixell tocades.
Podeu veure el resultat per la variable taulell_O mostrat abans (# à vaixell ; . à tir a l’aigua ; X à
vaixell tocat)
Vaixells=True Vaixells=False
A B C D E F G H I J A B C D E F G H I J
1 # # # # # # # 1
2 # 2
3 # # # # # # 3
4 # · # 4 ·
5 # · · 5 · ·
6 # · # · X 6 · · X
7 · # X 7 · X
8 X X · # 8 X X ·
9 9
10 # # # # # # 10
• demana_jugada()
Funció que demana per teclat la següent jugada al jugador. Ha de retornar una tupla (fila,columna)
on fila és un enter entre 1 i 10 i columna un dels caràcters ‘ABCDEFGHIJ’. Programeu la funció de
manera que comprovi el compliment estricte d’aquesta especificació i que sigui robusta en cas
d’entrada errònia per teclat (try-except).
• taulell_ordinador(fila, columna)
Facultat de Física – Informàtica
Reavaluació 2019-2020
Funció que converteix el format de fila i columna del taulell al format de l’ordinador per treballar
amb llistes. Exemple : (1, ‘A’) com a input ha de produir (0, 0) com a output. Per fer la conversió
d’un caràcter a enter podeu fer servir la funció ord().
• ordinador_taullell(fila, columna)
Funció que converteix el format de fila i columna de l’ordinador al format de del taulell. Exemple:
(0, 5) com a input ha de produïr (1, ‘E’) com a output. Per fer la conversió d’enter al caràcter
corresponent podeu fer servir la funció chr(). Tingueu en compte que s’ha de sumar el valor del
codi ASCII de la ‘A’ (0x41) per que comenci amb aquesta lletra.
• omplir_taulell_jugador(taulell)
Funció que permet al jugador posar els seus vaixells al taulell a l’inici del joc. La funció treballa amb
l’argument taulell. Inicialment aquesta llista està inicialitzada amb zeros i quan acaba la funció
ha de contenir els vaixells del jugador (caselles marcades amb 3).
o Opció bàsica (fàcil, obligatòria): el jugador dóna les coordenades de les caselles dels
vaixells una a una (useu la funció demana_jugada) i és responsabilitat seva que la
col·locació segueixi les normes del joc. L’ordinador només comprova que no es posi una
casella en una posició ja assignada prèviament i que en total es posin 30 caselles.
o Opció completa (difícil, opcional): l’ordinador demana al jugador la posició i orientació dels
vaixells un a un. En cada pas comprova que el nou vaixell manté la distància amb els ja
introduïts prèviament i que no surt del tauler.
• omplir_taulell_ordinador(taulell, intents)
Funció que posa els vaixells de l’ordinador al taulell a l’inici del joc. La funció treballa amb
l’argument taulell. Inicialment aquesta llista de llistes està inicialitzada amb zeros i quan acaba
la funció ha de contenir els vaixells de l’ordinador (caselles marcades amb 3). Us suggerim el
següent algorisme:
o El primer vaixell es posa aleatòriament al taulell, amb la única condició que no surti de les
vores. Es recomana començar pel de mida mes gran.
o Els següents vaixells es posen amb un procés iteratiu:
1. S’intenta afegir el vaixell amb posició i orientació aleatòria
2. Es comprova que quedi dins el tauler i mantingui la distància. Si és correcte es passa al
següent vaixell, en cas contrari es torna a 1.
Es recomana posar un comptador d’intents per assegurar que no es queda en un taulell sense
solució. Si passa el nombre d’intents es pot tornar a executar l’algorisme començant de zero i
repetir fins que trobi una solució.
Podeu implementar un algorisme més intel·ligent si voleu (opcional).
Facultat de Física – Informàtica
Reavaluació 2019-2020
• jugada_ordinador(taulell)
Funció que genera la jugada de l’ordinador. Ha de retornar una tupla (fila, columna) on fila és un
enter entre 1 i 10 i columna un dels caràcters ‘ABCDEFGHIJ’.
o Opció bàsica (fàcil, obligatòria): la jugada de l’ordinador és una coordenada aleatòria al
taulell amb la única restricció que no hagi estat seleccionada abans.
o Opció completa (difícil, opcional): les jugades de l’ordinador tenen en compte si en la
jugada(es) prèvia(es) s’havia tocat un vaixell del jugador humà, de manera que s’intenti
continuar enfonsant el vaixell. Per això, podeu usar un argument info_jugades per a
mantenir informació entre una jugada i la següent (l’històric de totes les jugades del joc
per exemple), i fer-ho servir en estratègies complexes de vostre elecció per seleccionar la
següent jugada. La funció tindria dos arguments en aquest cas: jugada_ordinador(
taulell, info_jugades ).
• tot_enfonsat(taulell)
Funció que comprova si en un taulell queden encara vaixells per enfonsar o no. Rep com a
argument un taulell (una de les variables globals); retorna True si no queda cap vaixell per
enfonsar (cap 1 a la matriu del taulell) i False en cas contrari.
Part 2: control del joc
Implementeu el programa principal del joc que, usant les variables i funcions anteriors, permeti jugar.
La seqüència serà:
1. Inicialitzar taulers
2. Omplir tauler ordinador
3. Omplir tauler jugador
4. Iteració de jugades. Comença sempre el jugador.
a. Demanar jugada
b. Comprovar resultat (aigua/tocat) i mostrar-lo per pantalla
c. Mostrar el tauler del jugador actualitzat (vaixells visibles)
d. Comprovar si s’ha acabat el joc. Si és així mostrar un missatge i acabar.
e. Generar jugada de l’ordinador
f. Comprovar resultat (aigua/tocat) i mostrar-lo per pantalla
g. Mostrar el tauler de l’ordinador actualitzat (vaixells ocults)
h. Comprovar si s’ha acabat el joc. Si és així mostrar un missatge i acabar
i. Iterar a partir de a.
Facultat de Física – Informàtica
Reavaluació 2019-2020
Part 3 (opcional): millora de la visualització
Per aquesta part les variables generals taulell_O, taulell_J i torn hauran de passar a ser
variable globals. Afegiu també la següent variable global.
• estat
Una variable de contingut lliure que podeu usar per controlar l’estat del joc a partir de la vostra
estratègia d’implementació (per ex. dades de la jugada anterior, comptadors propis, etc.). Podeu
fer servir un diccionari per organitzar les dades.
Podeu millorar la jugabilitat del joc canviant la visualització dels taulers per pantalla per una
visualització en una finestra separada usant tkinter.
En aquest cas, podeu fer servir les quatre variables generals indicades al començament com a globals
(taulell_J, taulell_O, torn, estat). Les podeu inicialitzar al començament del joc.