Estudis d’Informàtica, Multimèdia i...

16
1 Estudis d’Informàtica, Multimèdia i Telecomunicació Programació Pràctica 2 Cognoms: Amengual Gomila Nombre: Pere

Transcript of Estudis d’Informàtica, Multimèdia i...

Page 1: Estudis d’Informàtica, Multimèdia i Telecomunicaciógraumultimedia.com/wp-content/uploads/Amengual_Gomila_Pere_Pract2.pdf · 5 per exemple la cadena de text “3 4 0 3 2 3”

1

Estudis d’Informàtica, Multimèdia i Telecomunicació

Programació Pràctica 2

Cognoms: Amengual Gomila

Nombre: Pere

Page 2: Estudis d’Informàtica, Multimèdia i Telecomunicaciógraumultimedia.com/wp-content/uploads/Amengual_Gomila_Pere_Pract2.pdf · 5 per exemple la cadena de text “3 4 0 3 2 3”

2

Exercici 1: Cerques en taules de taules [20 %] Un observatori meteorològic emmagatzema les dades de temperatura en una dada estructurada. tipus dia: taula[24] de real;{representa les 24 hores del dia} mes30: taula[30] de dia; {representa els dies del mes} ftipus A més, s’ha creat les següents variables: var abril, juny, setembre, novembre: mes30; {guarda les temperatures dels mesos assenyalats} fvar En cada posició de les taules de taules hi ha la temperatura mesurada en una hora concreta. P.e. en abril[3][18] estaria la temperatura que feia el 3 d’abril a les 6 de la tarda Tasca: Crear el mòdul average (acció o funció, el més adequat) que rebi la taula

corresponent a un mes, i retorni • en una taula les temperatures mitjanes de cada hora del dia del mes (la

temperatura mitjana que ha fet en cadascuna de les hores, ha de retornar les 24 temperatures) i

• en una variable la temperatura mitjana del mes.

Page 3: Estudis d’Informàtica, Multimèdia i Telecomunicaciógraumultimedia.com/wp-content/uploads/Amengual_Gomila_Pere_Pract2.pdf · 5 per exemple la cadena de text “3 4 0 3 2 3”

3

El mòdul average és una acció, ja que ha de retornar múltiples paràmetres en diferents variables. {Pre: unes variables (abril, juny, setembre, novembre) són taules de dues dimensions contenen un registre de temperatures en format mes[dia][hora]} var temperaturaMitjanaHora: dia; temperaturaMitjanaMensual: real; fvar acció average(ent mesAEvaluar: mes30, sor temperaturaMitjanaHora: dia, sor temperaturaMitjanaMensual: real) per hora := 1 fins 24 fer per dia := 1 fins 30 fer temperaturaMitjanaHora[hora] := temperaturaMitjanaHora[hora]

+ mesAEvaluar[dia][hora]; temperaturaMitjanaMensual := temperaturaMitjanaMensual +

mesAEvaluar[dia][hora]; fper temperaturaMitjanaHora[hora] := temperaturaMitjanaHora[hora] /

30; fper

temperaturaMitjanaMensual := temperaturaMitjanaMensual / (30*24); retorna temperaturaMitjanaHora, temperaturaMitjanaMensual; facció {Post: la taula temperaturaMitjanaHora[hora] conté una llista amb 24

hores i la temperatura mitjana que ha fet a cada hora, és a dir, la suma de la temperatura de cada dia a la hora en concret, dividida per 30 dies. La variable temperaturaMitjanaMensual conté la mitjana de totes les temperatures de tots els dies a totes les hores}

Page 4: Estudis d’Informàtica, Multimèdia i Telecomunicaciógraumultimedia.com/wp-content/uploads/Amengual_Gomila_Pere_Pract2.pdf · 5 per exemple la cadena de text “3 4 0 3 2 3”

4

Exercici 2: Treball taules de taules en PHP [30 %] El joc minesweeper es un joc tradicional d’ordinador en què el jugador ha de descobrir en quines posicions d’un tauler es troben les mines que el jugador identifica amb la imatge .

Aspecte d’un joc finalitzat amb èxit Les caselles interiors tenen 8 caselles veïnes, però les laterals o d’un vèrtex en tenen menys

Quan el joc finalitza, es mostren les mines i, a cadascuna de les altres caselles, el nombre de mines que estan al seu veïnatge (el veïnatge d’una casella està constituït per totes les caselles amb qui comparteix una aresta o un vèrtex). Si en el veïnatge d’una casella no hi ha cap mina no apareix cap xifra. Es fa servir una taula de taules per emmagatzemar els nombres enters que representen les dades de un tauler del joc minesweeper de manera que la taula de la imatge anterior seria una taula de 8 x 8 on hauria un 9 en les caselles que representen una mina i a les altres caselles el número corresponent al veïnatge. P.e

Tasca: Crear un conjunt de functions en php que creïn i manipulin taules de taules

segons les indicacions. El programa principal ja forma part de la plantilla.

Per a dur a terme aquesta tasca es faciliten els fitxers d'imatge que poden mostrar les caselles del camp de mines.

0.png 1.png 2.png 3.png 4.png 5.png 6.png 9.png

Indicacions preceptives • El programa rebrà un paràmetre filename que és el nom del fitxer de dades en

què s’indiquen les mides del tauler i les coordenades de cada mina. El contingut del fitxer és una cadena de text on podem veure una seqüència de nombres que respon a l’esquema:

<files columnes f1 c1 f2 c2 .... fn cn> on

files indica l’alçada del camp de mines columnes indica l’amplada del camp de mines fi ci indiquen la posició de la mina i

0 0 1 9 0 0 2 2 0 0 1 9

representa

Page 5: Estudis d’Informàtica, Multimèdia i Telecomunicaciógraumultimedia.com/wp-content/uploads/Amengual_Gomila_Pere_Pract2.pdf · 5 per exemple la cadena de text “3 4 0 3 2 3”

5

per exemple la cadena de text “3 4 0 3 2 3” correspondria a la imatge del costat. S’ha de tenir present que la posició inicial és la 0 0.

• La plantilla prac2_exer2_plantilla.php porta incorporat el programa principal

que fa les crides a les function. El codi que va escrit a la plantilla no s'ha de modificar.

• Es faciliten arxius de dades (data20 a data24) per a les proves.

• Els fitxers d'imatge s'han d'ubicar a la mateixa carpeta de localhost que el fitxer php.

• S'ha de crear la function createTable que rep dos paràmetres numèrics ($height, $width) que són la quantitat de files de quadres ($row) i quants quadres hi ha per fila ($col), genera un array bidimensional que correspon a les fitxes sol·licitades, l’omple de zeros i el retorna.

• S’ha de crear la function putCell que rep un número i mostra la imatge corresponent. El número rebut pot ser un 9 (i es mostrarà la imatge d'una mina), un 0 (i es mostrarà la casella en blanc) o un número entre 1 i 6 (i mostrarà el quadre amb el número dins). Els números es corresponen amb el nom de les imatges.

• S’ha de crear la function drawLine que rep un array unidimensional (que correspon a una filera de la taula) i mostra les caselles en pantalla. Per mostrar cadascuna de les caselles, haurà d’emprar la function putCell.

• S’ha de crear la function drawMinefield que rep l’array bidimensional com paràmetre i mostra totes les caselles en pantalla. Per mostrar cadascuna de les files de fitxes, haurà d’emprar la function drawLine.

• S'ha de crear la function loadMinefieldData que rep dos paràmetres:

o $minefield, la taula plena de zeros de les dimensions adequades i que actualitzarà posant un 9 a les caselles on vagi una mina i, en les altres caselles, el valor del seu veïnatge.

o $data, un array unidimensional on figuren les coordenades de les mines

• Per obtenir la dimensió d'una taula, es pot fer servir la funció count1 de php. En el cas de taules de taules la funció count aplicada a la variable (la taula de taules) retornarà quantes fileres té la taula i aplicada a una filera, indicarà quantes columnes té la filera.

• No es poden emprar variables global.

• En les instruccions print no es pot posar una posició d'array directament dins d'una cadena constant. Cal emprar l'operador de concatenació · (punt).

per exemple, la instrucció print "<td width='80'> $oneDog[$i] </td>"

escriuria una casella d'una taula amb el contingut exacte $oneDog[$i] en lloc del continguts d'aquesta casella de l'array. Per obtenir el resultat desitjat s'ha d'emprar la concatenació print "<td width='80'>".$oneDog[$i]."</td>"

1 http://php.net/manual/es/function.count.php

Page 6: Estudis d’Informàtica, Multimèdia i Telecomunicaciógraumultimedia.com/wp-content/uploads/Amengual_Gomila_Pere_Pract2.pdf · 5 per exemple la cadena de text “3 4 0 3 2 3”

6

• Recordeu que, a diferencia de les taules en llenguatge algorísmic que comencen en la posició 1, en PHP la primera posició dels arrays és la posició 0.

• Podeu emprar functions de les emprades en exercicis o solucions anteriors, ja siguin completes o adaptades a les noves dades estructurades.

Podeu comprovar el funcionament a:

http://prog.uoc.edu/prac2/prac2_exer2.php?filename=data20

Consells

Potser la part més conflictiva de l’exercici és el càlcul del veïnatge de cada casella en la function loadMinefieldData. Una primer aproximació a la solució podria ser:

1. Llegir les dades de cada mina i posar un 9 en el minefield. 2. Fer un recorregut per minefield i per a cada casella mirar quants 9 té al seu

voltant

Però es pot mirar també d’una altra manera:

• Cada cop que posem una mina actualitzem els seus veïns incrementant en una unitat el valor de veïnatge (sempre i quan no sigui un 9).

Aquesta segona visió fa que la solució sigui més àgil perquè en lloc de calcular el veïnatge de totes les caselles només hem hagut de mirar el veïnatge de les mines, amb la qual cosa els còmputs són menors. A més, aprofitem el fet que el tauler hagi estat inicialitzat a zeros, perquè abans de posar cap mina totes les caselles tenen veïnatge 0, que és el que correspon.

Un altre aspecte a tenir en compte és a quines caselles valorar el veïnatge? Posem pel cas que volem valorar el veïnatge de la mina de posició [$x][$y]. La situació més habitual serà que aquesta mina està rodejada per altres 8 caselles formant una minitaula de 3 x 3, la coordenada de la primera casella d’aquesta minitaula serà [$x-1][$y-1] i la de la última serà [$x+1][$y+1]. Un doble bucle serà de molta utilitat.

De totes maneres caldrà tenir en compte que aquesta no és la única possible situació, perquè hi ha mines que poden estar en una cantonada o en un costat i en aquest cas té menys cel·les veïnes que actualitzar. Evidentment mai s’actualitzarà en coordenades que no pertanyin al tauler, és a dir, ni en coordenades negatives ni coordenades que igualin el valor de $height o $width.

Avaluació Es valorarà especialment l'aplicació correcta dels esquemes de cerca, recorregut i/o tractament adequats al problema conjuntament amb l'ús adequat dels índex de les taules.

Page 7: Estudis d’Informàtica, Multimèdia i Telecomunicaciógraumultimedia.com/wp-content/uploads/Amengual_Gomila_Pere_Pract2.pdf · 5 per exemple la cadena de text “3 4 0 3 2 3”

7

Copieu aquí el codi de la vostra solució <?php /************* FUNCTION *************/ //Aquí va el codi de les funcions function LF() { //line feed print "<br />"; } function createTable($height, $width) { // retorna un array bidimensional emplenat de zeros de les dimensions proporcionades for ($i = 0; $i <= $height-1; $i++) { for ($j = 0; $j <= $width-1; $j++) { $arrayBuit[$i] [$j] = 0; } } return $arrayBuit; }

function putCell($numero) { // rep un número i mostra la imatge corresponent print "<img src='$numero.png'>"; } function drawLine($filera) { // rep un array unidimensional que correspon a una filera d'una taula i mostra les caselles en pantalla for ($i = 0; $i <= count($filera)-1; $i++) { putCell($filera[$i]); } }

function drawMineField($arrayBidimensional) { // rep un array bidimensional i mostra totes les caselles en pantalla for ($i = 0; $i <= count($arrayBidimensional)-1; $i++) { drawLine($arrayBidimensional[$i]); LF(); } }

function loadMinefieldData(&$minefield, $data) { // rep una taula plena de zeros i la actualitza amb les mines que hi ha a $data afegint-hi el veinatge while (count($data)>=1) { $filaDesti=array_shift($data); $columnaDesti=array_shift($data); $minefield[$filaDesti][$columnaDesti]=9; $minefield=veinatge($filaDesti, $columnaDesti, $minefield); } }

Page 8: Estudis d’Informàtica, Multimèdia i Telecomunicaciógraumultimedia.com/wp-content/uploads/Amengual_Gomila_Pere_Pract2.pdf · 5 per exemple la cadena de text “3 4 0 3 2 3”

8

function veinatge ($fila, $columna, $minefield) { // rep unes coordenades i una taula amb mines i incrementa el valor de les caselles al voltant de les coordenades $minFila=$fila-1; $maxFila=$fila+1; $minColumna=$columna-1; $maxColumna=$columna+1; if ($minFila < 0) { $minFila=0; } if ($minColumna < 0) { $minColumna=0; } if ($maxFila > (count($minefield)-1 ) ) { $maxFila = count($minefield)-1; }

if ($maxColumna > (count($minefield[0]))-1) { $maxColumna = count($minefield[0])-1; } for ($i = $minFila; $i <= $maxFila; $i++) { for ($j = $minColumna; $j <= $maxColumna; $j++) { if ($minefield[$i][$j] <> 9) { $minefield[$i][$j]=$minefield[$i][$j]+1; } } }

return $minefield; } /************* MAIN *************/ //Aquí va el codi del programa principal $filename = $_GET["filename"]; include($filename); $data = explode(" ",$cadena); $height = array_shift($data); $width = array_shift($data); $table = createTable($height, $width); loadMinefieldData($table, $data); drawMinefield($table);

?>

Page 9: Estudis d’Informàtica, Multimèdia i Telecomunicaciógraumultimedia.com/wp-content/uploads/Amengual_Gomila_Pere_Pract2.pdf · 5 per exemple la cadena de text “3 4 0 3 2 3”

9

Exercici 3: Disseny i treball amb tuples [20 %] Un pirata informàtic vol crear la seva Pirateleaks per informatitzar les seves dades de gestió de tots els documents que ha aconseguit i que emmagatzema en un conjunt de servidors de fitxers. Pretén mantenir fins 10 milions de documents. Amb aquest objectiu us demana que creeu les dades estructurades adequades

Tasca:

• Dissenyeu la dada estructurada date adequada per mantenir una data exposada en format numèric tipus date=tupla dia: enter; mes: enter; any: enter; ftupla ftipus

• Dissenyeu la dada estructurada form_doc capaç d'emmagatzemar la informació d'un document: nom del document, tipus (e-mail, txt, sms, pict, sound, video ...), data del document, data de gravació, font (codi de qui l’ha facilitat, un número de 10 xifres), volum del fitxer en MB, nacionalitats a què es refereix (molts documents poden afectar a més d’un país, es considera que com a màxim afecta 10 països) i el nom del servidor on està gravat (als servidors el nomena mitjançant una lletra majúscula i empra l’ordre alfabètic per anar posant nous servidors). tipus text: taula[10] de caracter; form_doc = tupla nomDocument: text; ttipus: text; dataDocument: date; dataGravacio: date; font: taula[10] de enter; volumFitxerMb: enter; nacionsImplicades: taula[10] de text; nomServidor: caracter; ftupla ftipus

Per mantenir tota la informació de la col·lecció de documents s'ha creat la tupla leaks de la següent manera

leaks = tupla doc: taula [10000000] de form_doc; {fitxes dels documents} qtty : enter; {número que indica quantes fitxes estan plenes}

Page 10: Estudis d’Informàtica, Multimèdia i Telecomunicaciógraumultimedia.com/wp-content/uploads/Amengual_Gomila_Pere_Pract2.pdf · 5 per exemple la cadena de text “3 4 0 3 2 3”

10

ftupla

i la variable pirateLeaks del tipus leaks, on s'ha entrat tota la informació de manera que totes les fitxes plenes estan posades consecutivament des de la primera posició.

• Escriviu l'expressió que digui si el fitxer del darrer document entrat és un vídeo i mesura més de 50 MB

pirateLeaks.doc[pirateLeaks.qtty].ttipus = “video” i pirateLeaks.doc[pirateLeaks.qtty].volumFitxerMb > 50

• Escriviu el mòdul freshNews (acció o funció, el més adequat) que rebi pirateLeaks, un any i un mes i escrigui en el canal de sortida estàndard els noms, tipus i servidors on estan els documents que van poder ser gravats el mateix dia en què es van originar i que pertanyin a l'any i al mes dit.

És més adequada una acció, ja que no ha de retornar cap paràmetre. accio escriureText (ent taulaAImprimir: text) per i :=1 fins 10 fer escriureCaracter(taulaAImprimir[i]); fper faccio accio freshNews(ent pirateACercar: leaks, ent any: enter, ent mes: enter) per i := 1 fins pirateACercar.qtty fer

si (pirateACercar.doc[i].dataDocument.mes = mes) i (pirateACercar.doc[i].dataDocument.any = any) llavors

escriureText(pirateACercar.doc[i].nomDocument); escriureText(pirateACercar.doc[i].ttipus); escriureCaracter(pirateACercar.doc[i].nomServidor); fsi fper faccio

Page 11: Estudis d’Informàtica, Multimèdia i Telecomunicaciógraumultimedia.com/wp-content/uploads/Amengual_Gomila_Pere_Pract2.pdf · 5 per exemple la cadena de text “3 4 0 3 2 3”

11

Exercici 4: Treball amb tuples i taules de tuples en PHP [30 %]

S’ha emmagatzemat les dades d’una partida de la carta més alta en una sèrie de tuples de manera que si $t és una tupla

$t[“name”] és el nom del jugador $t["card"] és un array que conté els codis de les cartes del jugador

la dada que porta la informació original de les partides és una seqüència del tipus:

{ng b nc name1 c1·1 c1·2 ... c1·nc name2 c2·1 c2·2 ... c2nc ... nameng cng·1 cng·2 ... cng·nc } on • ng : és el nombre de jugadors • b: és l’aposta unitària. • nc: es el nombre de cartes que juga cada jugador • namei és el nom del jugador i. • ci·j és la carta j del jugador de posició i.

Els jugadors han apostat cadascun una certa quantitat (es determina en cada partida) i, en acabar, aquests diners se'ls queda qui ha tret la màxima puntuació (o es reparteix a parts iguals entre els jugadors de màxima puntuació si n'hi ha més d'un)

Tasca: Recollides les dades en variables discretes i un array de tuples, crear un conjunt de functions en php que manipulin taules de tuples segons les indicacions. El programa principal i la function per carregar les dades des d'arxiu a la taula de tuples ja formen part de la plantilla.

El programa s'escriurà a la plantilla prac2_exer4_plantilla.php que es canviarà de nom a prac2_exer4.php pel lliurament.

Podeu provar el funcionament a l'enllaç http://prog.uoc.edu/prac2/prac2_exer4.php?filename=data40 Indicacions preceptives

• Per a dur a terme aquesta tasca es faciliten els fitxers de seqüències amb el nom data40 a data44.

• Els fitxers de dades i d'imatge s'han d'ubicar a la mateixa carpeta de localhost que el fitxer php.

• La plantilla porta incorporada la function getData que llegeix el paràmetre de nom filename, carrega les dades i crea l'array de tuples i també calcula el muntant de les apostes. Ambdós valors es retornen en paràmetres de sortida. Per exemple, si $game és l'array de tuples, per saber el nom del primer jugador de la partida, l'expressió seria $game[0]["name"]2 Per saber quina ha estat la segona carta jugada pel jugador de posició 3 l’expressió seria $game[3][“card”][1]2

• El codi que va escrit a la plantilla no s'ha de modificar.

• S'ha de crear la function putCard que rep el codi d’una carta i posa la imatge de la carta espanyola corresponent en pantalla. Aquesta function ha de ser la única manera de mostrar les imatges de carta en la pantalla

2 recordeu que en PHP la primera posició dels arrays és la posició 0

Page 12: Estudis d’Informàtica, Multimèdia i Telecomunicaciógraumultimedia.com/wp-content/uploads/Amengual_Gomila_Pere_Pract2.pdf · 5 per exemple la cadena de text “3 4 0 3 2 3”

12

• S’ha de crear la function cardValue que rep el codi d’una carta i retorna el valor nominal de la carta (les figures valen 10, 11 i 12 respectivament).

• S'ha de crear la function showTable que rep un array que conté la sèrie de cartes d’un jugador i les mostra en la pantalla en una filera. Per mostrar-les cridarà putCard.

• S’ha de crear la function computeScore que rep un array que conté la sèrie de cartes d’un jugador i retorna el valor suma de les cartes. Per dur a terme la seva tasca cridarà cardValue

• S’ha de crear la function showGame que rep el valor total apostat (entre tots els jugadors) i la taula de tuples $game i

o calcula la puntuació de cada jugador (que emmagatzema en un array)

o de l'array anterior obté quina és la puntuació màxima de tots els jugadors i quants jugadors l'han obtingut

o calcula el que s'haurà de pagar a cada guanyador

o per a cada jugador escriu:

§ En una línia Gamer i el nom del jugador

§ En la línia següent mostra les cartes del jugador i escriu la puntuació obtinguda i el que li toca cobrar

• S'ha de crear la function extractGame que rep un número $n i la taula de tuples $game i retorna una nova taula de tuples en què cada jugador té les $n primeres cartes que tenia en $game. Per exemple. Si $game contenia

name Shaw card 23 17 8 15 4 name Kelly card 32 22 0 9 14

la crida extractGame(3, $game) retornaria una taula de tuples

name Shaw card 23 17 8 name Kelly card 32 22 0

En el cas que el número de cartes que es demana que s'extregui sigui superior al de cartes que havia, es retornarà el nombre de cartes original. Per exemple, la crida extractGame(7, $game) retornaria, un array de tuples igual a $game.

name Shaw card 23 17 8 15 4 name Kelly card 32 22 0 9 14

Consells

• Observareu que getData no dóna informació de la quantitat de jugadors ni de la quantitat de cartes que juguen a la partida. No és necessari. La quantitat de

Page 13: Estudis d’Informàtica, Multimèdia i Telecomunicaciógraumultimedia.com/wp-content/uploads/Amengual_Gomila_Pere_Pract2.pdf · 5 per exemple la cadena de text “3 4 0 3 2 3”

13

jugadors es pot obtenir del mateix array de tuples emprant la funció count3 passant com paràmetre la taula de tuples (count ens dirà quantes tuples hi ha) i la quantitat de cartes que ha jugat cadascun s’haurà d’obtenir de la mateixa manera del l'array ["card"] del primer jugador count ($game[0]["card"])

• Podeu reutilitzar directament o modificant-les functions d'altres pràctiques o PACs, be siguin vostres o de les solucions.

Avaluació Es valorarà especialment l'aplicació correcta dels esquemes de cerca, recorregut i/o tractament adequats al problema conjuntament amb l'ús adequat dels índex de les taules.

3 http://us2.php.net/manual/es/function.count.php

Page 14: Estudis d’Informàtica, Multimèdia i Telecomunicaciógraumultimedia.com/wp-content/uploads/Amengual_Gomila_Pere_Pract2.pdf · 5 per exemple la cadena de text “3 4 0 3 2 3”

14

//Aquí heu de posar el vostre codi <?php /*************FUNCTION PLANTILLA ****************/ function getData(&$totalBet, &$p) { //get data File & returns a number & a associative data Array $filename = $_GET["filename"]; include($filename); $data = explode(" ", $cadena); $nGamers= array_shift($data); $bet= array_shift($data); $nCards= array_shift($data); $totalBet= $bet * $nGamers; for ($i=0; $i < $nGamers; $i++) { $p[$i]["name"] = array_shift($data); for ($j=0; $j < $nCards; $j++) { $p[$i]["card"][$j]= array_shift($data); } //to check the data entered uncomment the next line //LF(); print $p[$i]["name"]. " ";print_r($p[$i]["card"]); } }// de getData function LF() { //line feed print "<br />"; } /******************FUNCTIONS*********************/ //escriviu aquí el codi de les vostres function function putCard ($numCodi) { // rep número de codi (de 0 a 39) i mostra la carta en pantalla (e0 a e39) print "<img src='e$numCodi.png'>"; } function cardValue ($nombre) { // rep un nombre entre 0 i 39 i retorna el seu valor en el joc $valor = $nombre % 10 +1 ; if ($valor >= 8) { $valor = $valor +2; } return $valor; } function showTable ($serie) { // rep la sèrie de cartes d'un jugador i les mostra en una filera $qttCartes = count($serie); for ($i=0; $i < $qttCartes; $i++) { putCard ($serie[$i]); } }

Page 15: Estudis d’Informàtica, Multimèdia i Telecomunicaciógraumultimedia.com/wp-content/uploads/Amengual_Gomila_Pere_Pract2.pdf · 5 per exemple la cadena de text “3 4 0 3 2 3”

15

function computeScore ($serie) { // rep la sèrie de cartes d'un jugador i retorna el valor suma de les cartes $qttCartes = count($serie); $suma = 0; for ($i=0; $i < $qttCartes; $i++) { $valor=cardValue($serie[$i]); $suma= $suma + $valor; } return $suma; } function showGame ($apostat, $game) { // rep valor total apostat i la taula de tuples $game i... // calcula puntuació de cada jugador i la emmagatzema en un array $qttJugadors = count($game); for ($i=0; $i < $qttJugadors; $i++) { $puntuacio[$i]= computeScore($game[$i]["card"]); } // de l'array anterior obté la puntuació màxima i quants jugadors l'han obtingut $valorMax=0; $vegadesMax=0; for ($i=0; $i < ($qttJugadors); $i++) { if ($puntuacio[$i] > $valorMax) { $valorMax=$puntuacio[$i]; $vegadesMax=1; } elseif ($puntuacio[$i] == $valorMax) { $vegadesMax++; } }

// calcula qué s'haurà de pagar a cada jugador $aPagar = ($apostat / $vegadesMax); // per cada jugador escriu en una línia Gamer i el nom del jugador, en la línia següent mostra les cartes del jugador i escriu la puntuació obtinguda i el que li toca cobrar for ($i=0; $i < $qttJugadors; $i++) { LF(); print "<b>Gamer ". $game[$i]["name"]."</b>"; LF(); showTable($game[$i]["card"]); print "Score: ". $puntuacio[$i].". Gain: "; if ($puntuacio[$i]==$valorMax) { print $apostat/$vegadesMax; } else { print 0; } } }

Page 16: Estudis d’Informàtica, Multimèdia i Telecomunicaciógraumultimedia.com/wp-content/uploads/Amengual_Gomila_Pere_Pract2.pdf · 5 per exemple la cadena de text “3 4 0 3 2 3”

16

function extractGame($n, $game) { // rep un número $n i una taula de tuples $game i retorna una nova taula de tuples en la que cada jugador té les $n primeres cartes que tenia en $game $qttCartes = count($game[0]["card"]); $qttJugadors = count($game); if ($n>$qttCartes) { LF(); print "There are less than 6 cards in hand, assumed $qttCartes cards"; $n=$qttCartes;

} for ($i=0; $i < $qttJugadors; $i++) { $extractedTable[$i]["name"]=$game[$i]["name"]; for ($j=0; $j < $n; $j++) { $extractedTable[$i]["card"][$j]=$game[$i]["card"][$j]; } } return $extractedTable; }

/******************MAIN*********************/ getData($bet, $game); //$game is records array LF(); print "<h3>Original Data</h3>"; showGame($bet, $game); LF();LF();LF();LF(); print "<h3>Extract first two cards</h3>"; $game2 = extractGame(2, $game); showGame($bet, $game2); LF();LF();LF();LF(); print "<h3>Extract first six cards</h3>"; $game6 = extractGame(6, $game); showGame($bet, $game6);

?>