HW2 Doppio Ciclo Annidato con Break

g
gullisa (1170 points)
7 24 31
asked Oct 26, 2020 in HW2 obbligatorio by gullisa (1,170 points)
recategorized Oct 26, 2020 by andrea.sterbini
Ciao a tutti,

in un codice in cui ho

--------------------------

primo ciclo for sui turni:

  secondo ciclo for sul quartetto dei giocatori:

    <fai qualcosa>

    <verifica una condizione>

         <interrompi il for interno>

        <interrompi il for esterno>

----------------------------------------

ottengo come problema "index out of range". Ho già fatto un print della coppia di indici per vedere sin dove il doppio ciclo giunge, ma non trovo il motivo logico per cui il ciclo dei for debba raggiungere un indice non permesso (nel range specificato nel primo for suppongo...).

Consigli su come rimediare? Grazie!
306 views

7 Answers

SimoneModiga (3370 points)
6 18 34
answered Oct 26, 2020 by SimoneModiga (3,370 points)
Salve, il ciclo for piu' esterno gestisce un turno alla volta oppure una sessione in cui gioca il primo giocatore,poi il secondo, terzo, quarto e riinizia fino al GAME OVER??

Nel caso ti consiglio un ciclo come il while perchè effettivamente non si possono sapere il numero di turni giocati in una partita.
g
gullisa (1170 points)
7 24 31
commented Oct 26, 2020 by gullisa (1,170 points)
Ciao,

il ciclo esterno gestisce i turni (la somma delle lunghezza delle liste di parole). Quello interno i giocatori (giocatore 1, giocatore 2 etc...). Quindi prima itera per (0,0), (0,1),(0,2),(0,3) poi passa alla seconda parola di ogni giocatore etc...

Inizialmente usavo un while, ma incappavo sempre nel medesimo errore per cui ho provato coi for annidati, ma invano.
SimoneModiga (3370 points)
6 18 34
commented Oct 26, 2020 by SimoneModiga (3,370 points)
Ti consiglio di impostare meglio il while (come ciclo esterno ) perchè con i for non penso che troverai una soluzione adeguata, prova a creare un while fino a quando le 2 condizioni del GAME OVER non si avverano ed in ogni ciclo gestisci ordinatamente ogni turno di un giocatore.

Cerca di usare una concatenazione di operatori booleani e funzioni come any() che ti aiutino a costruire una condizione ottimale per il ciclo while.

Ad esempio continua il ciclo fino a che questa condizone non si avvera e nel contempo anche l'altra.

Nel caso del programma il tutto finisce quando il numero di lettere è 0 e contemporaneamente un giocatore rimane senza carte in mano.

P.S. ricorda di aggiornare le condizioni per evitare cicli infiniti. Spero di averti aiutato :)
C
ChristianSt (1790 points)
3 9 25
commented Oct 26, 2020 by ChristianSt (1,790 points)
Per quanto riguarda il ciclo for per i turni, si puo' usare.

Se sappiamo che i giocatori giocano rispettivamente: g1, g2, g3 e g4, possiamo sapere con certezza che g1 ha giocato l'ultimo turno. Possiamo quindi fare un ciclo for per il range della lunghezza della lista del primo player
SimoneModiga (3370 points)
6 18 34
commented Oct 26, 2020 by SimoneModiga (3,370 points)
Il problema è che non è detto che il primo giocatore abbia la lunghezza piu' grande, potrebbe essere il secondo, come il terzo, o il quarto non si può dare per certo
C
ChristianSt (1790 points)
3 9 25
commented Oct 28, 2020 by ChristianSt (1,790 points)
Dato che non viene passato un valore che indica chi inizia, possiamo solo basarci sull'assioma che prevede un ordinamento uguale a quello inserito in input, cioe':

player1 = g1;

player2 = g2;

player3 = g3;

player4 = g4.

Altrimenti come si potrebbe risolvere questo problema se non si sapesse chi inizia?
E
Edlu__ (380 points)
0 0 2
answered Oct 26, 2020 by Edlu__ (380 points)
Forse l'errore "index out of range" è dovuto al fatto che tutti i giocatori non fanno per forza lo stesso numero di turni perché il gioco si interrompe appena un giocatore finisce le lettere e perciò quelli dopo non fanno il turno (esempio: abbiamo giocatore 1, 2, 3 e 4, se 2 finisce le lettere 3 e 4 no potranno fare il loro turno e avranno giocato un turno in meno rispetto a 1 e 2).
Una soluzione potrebbe essere controllare se il giocatore che stai controllando ha finito le lettere in mano e nel caso interrompere il ciclo for con un break
giordano_sannino (13650 points)
7 16 81
answered Oct 26, 2020 by giordano_sannino (13,650 points)
Ciao, lo avevo anch'io questo problema, devi stare attento che se ad esempio il giocatore 1 finisce di piazzare le sue parole ma la partita non è amcora finita, devi skippare il suo turno
AdSum (16290 points)
9 20 134
answered Oct 26, 2020 by AdSum (16,290 points)
Esattamente quale istruzione ti da l'errore? Nel senso, quando un errore viene lanciato viene data anche l'istruzione ""difettosa"" che ti permette di capire effettivamente quale lista stai sforando. Avviene sui turni o suoi giocatori?
f
fabrizio.alba (1150 points)
4 11 20
answered Oct 26, 2020 by fabrizio.alba (1,150 points)
reshown Oct 27, 2020 by fabrizio.alba

Ciao.

Io ho risolto normalizzando tutte le mani dei giocatori, cioè ho fatto in modo che tutti i giocatori giocassero tutti lo stesso numero di turni...

Lo so, un po' una parac... ehm... furbata, ma funziona! smiley

R
Raffaele (3850 points)
10 24 48
answered Oct 26, 2020 by Raffaele (3,850 points)
Guarda la cosa più semplice è usare un eccezione

For........ :

      For.......range.... :

           Try:

                     Iista[0] [1]   #isola la riga che ti dà il problema

          Except IndexError:

                    Continue

          Scrivi il resto del codice
Loriv3 (7970 points)
8 20 84
answered Oct 26, 2020 by Loriv3 (7,970 points)
Per il problema della lunghezza prova a mettere un controllo prima di fare quello che devi fare

primo ciclo for sui turni:

  secondo ciclo for sul quartetto dei giocatori:
se turno < mosse:
    <fai qualcosa>
(per ogni giocatore)
    <verifica una condizione>

         <interrompi il for interno>

        <interrompi il for esterno>