Come scalare i punti HW2

1946981 (3070 points)
4 14 34
asked Oct 25, 2020 in HW2 obbligatorio by 1946981 (3,070 points)
closed Oct 30, 2020 by 1946981
Buonasera, so che domande simili sono già state poste ma non sono riuscita a risolvere il mio problema.

Ho già sviluppato una parte di programma che mi sommi i punti, il problema è che non riesco a scalare correttamente i punti per le lettere che rimangono in mano. Ho provato a scrivere un ciclo che per ogni parola giocata tolga le lettere usate al totale delle lettere, in questo modo sono in grado di trovare il giocatore che fa l'ultima pescata in modo da togliergli i punti nel modo giusto. Successivamente però non riesco a togliere i punti giusti agli altri giocatori. Ho provato ad aggiungere ulteriori condizioni al ciclo ma non riesco a risolvere in alcun modo. C'è un modo per fare questo calcolo all'interno dello stesso ciclo?
325 views
closed with note: Ho risolto il problema

5 Answers

Best answer
michelescara (1330 points)
0 2 6
answered Oct 25, 2020 by michelescara (1,330 points)
selected Oct 30, 2020 by 1946981
Io ho creato una lista in cui ho messo le lettere che i giocatori hanno a disposizione ad ogni mano. Questo numero è sempre uguale a dim_hand per ogni turno, dato che dopo ogni mano ad ogni giocatore vengono redistribuite le lettere del valore dim_hand. Quando però num_letters arriva a zero, e quindi sono state distribuite tutte le lettere disponibili, comincio a scalare le lettere giocate anche dai vari dim_hand dei giocatori. In questo modo a fine partita avrai una lista con le lettere rimaste ad ogni giocatore, e ai punteggi che ti sei calcolata in precedenza sottrai i vari dim_hand che ti sono rimasti moltiplicati per tre. Spero di essere stato il più chiaro possibile!
GiovanniChiara (830 points)
4 8 14
commented Oct 25, 2020 by GiovanniChiara (830 points)
Ma fai dei for annidati per fare i "turni"? Grazie.
michelescara (1330 points)
0 2 6
commented Oct 25, 2020 by michelescara (1,330 points)
No utilizzo un ciclo while per i turni
giordano_sannino (13650 points)
7 16 81
answered Oct 25, 2020 by giordano_sannino (13,650 points)
In una variabili metti le carte che hanno in mano, quando finisce la partita sottrai ai punti totali di ognuno la loro mano(per 3)
1946981 (3070 points)
4 14 34
commented Oct 25, 2020 by 1946981 (3,070 points)
Queste variabili rimarrebbero dunque uguali a dim_hand fino a quando non finisco le lettere da pescare, giusto? A quel punto dovrei sottrarre l'ultima parola giocata. Forse il mio problema è nello scorrimento della lista o nelle condizioni (if/else)?
Romitoskj (8920 points)
4 8 40
answered Oct 25, 2020 by Romitoskj (8,920 points)
Il modo più efficiente per farlo è quello di decrementare il punteggio a fine partita, durante il ciclo non ti conviene perché possono sempre pescare nuovamente e a quel punto devi ripristinare il punteggio. Forse non è efficiente il modo in cui tieni traccia del punteggio dei giocatori... hai provato a fare una lista dove ogni elemento corrisponde al punteggio di un giocatore?
1946981 (3070 points)
4 14 34
commented Oct 25, 2020 by 1946981 (3,070 points)
Sì, ho già fatto una lista per il punteggio dei giocatori.
Romitoskj (8920 points)
4 8 40
commented Oct 25, 2020 by Romitoskj (8,920 points)
Se anche l'incremento è giusto allora il problema è sicuramente dopo. Cosa fai esattamente per decrementare il punteggio in base alle lettere non giocate?
1946981 (3070 points)
4 14 34
commented Oct 25, 2020 by 1946981 (3,070 points)
Per il giocatore che fa l'ultima pescata faccio: risultato =  - ( dim_hand + ( num_letters - ultima parola del giocatore))
Romitoskj (8920 points)
4 8 40
commented Oct 25, 2020 by Romitoskj (8,920 points)
Ricorda di moltiplicare per tre! Ogni lettera non utilizzata sono tre punti in meno. Ed inoltre dovresti farlo per tutti i giocatori non solo per l'ultimo. Tanto se non hanno lettere decrementerai di 0.
1946981 (3070 points)
4 14 34
commented Oct 25, 2020 by 1946981 (3,070 points)
Mi sono dimenticata di scriverlo qua ma nel programma la moltiplicazione la faccio. Non riesco a fare la stessa cosa con gli altri perché o decremento di troppo oppure ho un problema di list index out of range. Oppure non decremento proprio.
Romitoskj (8920 points)
4 8 40
commented Oct 25, 2020 by Romitoskj (8,920 points)
Anche a me inizialmente è capitato di decrementare di troppo e il problema stava nelle condizioni per cui dovevo decrementare le lettere dalla mano dei giocatori. Infatti dei giocatori arrivavano con toppe carte alla fine della partita e decrementando arrivavano a valori negativi. Tutto ciò perché non era corretta la condizione che definiva il quando incrementare/decrementare.

Il consiglio che posso darti è di provare a fare debunging con il variable explorer aperto e vedere bene nel corso dell'esecuzione il cambiamento dei punteggi dei giocatori
twgever (15190 points)
7 27 105
answered Oct 25, 2020 by twgever (15,190 points)
io ho articolato quella parte in due funzioni

la prima funzione rileva quante carte sono rimaste nel mazzo ad ogni turno, quindi al turno 0 ce ne stanno 40, al primo turno 36 ecc.

la seconda funzione, per ogni giocatore, mi trova solo i turni in cui giocano, e per ogni volta che giocano, può fare diverse cose:

1.se ci stanno più del massimo di carte che si possono avere in mano, nel mazzo iniziale, non fa niente

2.se ci stanno meno del massimo di carte che si possono avere in mano, sottrae le lettere usate e e fa pescare le carte, e qui il giocatore può ritrovarsi o con il massimo numero di carte, oppure con un numero inferiore (in questo caso, nel mazzo ci saranno necessariamente 0 carte).

una volta finito il ciclo, la mia funzione restituisce il numero di carte rimasto in mano all'ultima iterazione, cioè all'ultimo turno giocato dal giocatore

spero di esserti stato utile!
G
Giuseppe01 (1500 points)
0 0 10
answered Oct 25, 2020 by Giuseppe01 (1,500 points)
Nel caso dei "non vincitori" tieni presente che il numero di lettere che il giocatore possiede dopo aver giocato l'ultima parola dipende da quante lettere erano presenti "nel mazzo" al tempo della sua giocata. Se per esempio ho 5 lettere in mano e gioco una parola di 5, se siamo verso la fine e nel mazzo è rimasta una sola lettera il mio nuovo numero di lettere sarà 1. In questo scenario non finisco la partita con penalità 0 o 15 (5 * 3), bensì con penalità 3 (1 * 3).

Se hai un ciclo per i turni ti conviene tenere traccia di quante lettere restano in mano ai giocatori, ricordando che non puoi aggiungerne più di quante ne sono rimaste nel mazzo.