Skip to content

Commit ae98a33

Browse files
committed
es 4, 5, 6 matrici
1 parent ae5de70 commit ae98a33

File tree

3 files changed

+131
-60
lines changed

3 files changed

+131
-60
lines changed

Python/Esercizi/Matrici.py

+6-6
Original file line numberDiff line numberDiff line change
@@ -155,14 +155,14 @@ def es5(lista1, lista2, matrice):
155155
"""ES 6 - difficile
156156
Progettiamo il nostro primo gioco sulle matrici!
157157
La nostra funzione questa volta non riceverà parametri in input e non ritornerà nulla, si svolgerà tutto interamente sul terminale.
158-
Il gioco si svolgerà su una matrice 11x11 dove ogni valore sarà equivalente ad uno spazio bianco. Il nostro personaggio (PG), rappresentato dal carattere '@' partirà in posizione 5,5
158+
Il gioco si svolgerà su una matrice 11x11 dove ogni valore sarà equivalente ad un under score '_'. Il nostro personaggio (PG), rappresentato dal carattere '@' partirà in posizione 5,5
159159
(al centro della matrice) e potrà spostarsi dentro di essa tramite i classici comandi WASD. Quando il PG attraversa un bordo della matrice, riappare dall'altra parte (effetto PAC-MAN).
160160
Al disopra della matrice (o dovunque preferiate) dovrà esserci un contatore delle vite del personaggio e un contatore dei punti.
161-
All'interno dell matrice saranno presenti degli NPC nemici, rappresentati con il carattere '#' che ad od ogni turno si sposteranno in una casella casuale adiacente (non in diagonale).
162-
Se un NPC entra a contatto con il nostro PG, (si trovano quindi sulla stessa casella), il PG verrà spostato su una casella adiacente casuale (anche in diagonale) e perderà una vita.
163-
L'obbiettivo del PG è quello di raccogliere punti '+' in giro per la matrice. Il primo punto apparirà in una posizione casuale diversa da quella del PG e del NPC. I successivi punti
164-
compariranno sempre in posizioni casuali diverse da quelle del PC e degli NPC (che andranno aumentando ogni 3 punti raccolti, comparendo in caselle casuali diverse da quella del PG, di
165-
altri NPC e del punto).
161+
All'interno dell matrice saranno presenti dei nemici, rappresentati con il carattere '#' che ad od ogni turno si sposteranno in una casella casuale adiacente (non in diagonale).
162+
Se un nemico entra a contatto con il nostro PG, si trovano quindi sulla stessa casella, il PG perderà una vita.
163+
L'obbiettivo del PG è quello di raccogliere punti '+' in giro per la matrice. Il primo punto apparirà in una posizione casuale diversa da quella del PG e del nemico. I successivi punti
164+
compariranno sempre in posizioni casuali diverse da quelle del PC e dei nemici (che andranno aumentando ogni volta che il punto cambia posizione, comparendo in caselle casuali diverse
165+
da quella del PG, di altri NPC e del punto). Anche i nemici posono prendere i punti '+', facendo comparire altri nemici.
166166
Il gioco va in GAME OVER quando il PG perde tutte e 3 le sue vite.
167167
168168
Per lo svolgimento di questo esercizio consiglio di usare copiare la traccia su uno script vuoto, strutturando il programma su più funzioni con ruoli ben precisi.

Python/Soluzioni/Matrici.py

+124-53
Original file line numberDiff line numberDiff line change
@@ -105,8 +105,39 @@ def es2(lista):
105105

106106

107107

108+
109+
#%%
110+
""" ES 3 - medio/facile
111+
Data in input una matrice (quadrata), si ritorni la somma delle diagonali
112+
"""
113+
114+
def es3(matrice):
115+
somma = 0
116+
i, j = 0, len(matrice[0]) - 1
117+
118+
for riga in matrice:
119+
somma += riga[i] + riga[j]
120+
i += 1
121+
j -= 1
122+
123+
return somma
124+
125+
126+
# print(es3([[ 8, 2, 6, -9, 3, 4, -5],
127+
# [ 7, -3, -5, 2, -7, 9, 1],
128+
# [ 4, -6, -8, 3, 5, 7, 4],
129+
# [-1, 7, 3, -6, 9, 5, 5],
130+
# [-6, 2, 9, 6, -5, -1, 2],
131+
# [ 5, -4, -7, -3, 6, 8, -2],
132+
# [-2, 4, 7, 4, 8, -8, 9]]))
133+
134+
# OUTPUT : 9
135+
136+
137+
138+
108139
#%%
109-
""" ES 3 - medio
140+
""" ES 4 - medio
110141
Data in input una matrice di '-', scrivere una funzione che, tramite un ciclo while, consenta di modificare singolarmente ogni elemento della matrice in un
111142
elemento dato in input (eseguendo una stampa a video della matrice ad ogni iterazione). Tramite terminale bisognerà poter scrivere le coordinate e l'elemento
112143
nel quale modificare il '-'. Se si tenterà di modificare un elemento già modificato, verrà invece modificato il primo elemento successivo non modificato
@@ -127,7 +158,7 @@ def es2(lista):
127158
- - - - - - - - - - - - - - - X - - X X - X X X X X X X X X
128159
"""
129160

130-
def es3(matrice):
161+
def es4(matrice):
131162
ALTEZZA = len(matrice)
132163
LARGHEZZA = len(matrice[0])
133164

@@ -200,44 +231,87 @@ def es3(matrice):
200231
print()
201232

202233

203-
# es3([['-', '-', '-'], ['-', '-', '-'], ['-', '-', '-']])
204-
205-
#%%
206-
""" ES 4 - medio/facile
207-
Data in input una matrice, si ritorni la somma delle diagonali
208-
"""
209-
210-
def es4(matrice):
211-
return
212-
213-
214-
# print(es5([[ 8, 2, 6, -9, 3, 4, -5],
215-
# [ 7, -3, -5, 2, -7, 9, 1],
216-
# [ 4, -6, -8, 3, 5, 7, 4],
217-
# [-1, 7, 3, -6, 9, 5, 5],
218-
# [-6, 2, 9, 6, -5, -1, 2],
219-
# [ 5, -4, -7, -3, 6, 8, -2],
220-
# [-2, 4, 7, 4, 8, -8, 9]]))
221-
234+
# es4([['-', '-', '-'], ['-', '-', '-'], ['-', '-', '-']])
222235

223236

224237
#%%
225238
""" ES 5 - medio
226-
Data in input una matrice, si sommino i bordi della matrice. Ogni elemento deve essere sommato con i precedenti, partedo dal vertice in alto a sinistra e facendo una roatazione oraria
227-
sui 4 bordi della matrice. L'ultima somma dovrà quindi avvenire sull'elemento (0,1). Si ritorni la matrice modificata e il valore che, lungo i bordi, è stato incontrato più di frequente,
228-
in caso di parità si ritorni il maggiore.
239+
Data in input una matrice, si sommi ogni elemento con il precedente, seguendo una spirale che parte dall'origine e gira in senso orario. Si ritorni la matrice modificata e il
240+
valore che, lungo la spirale, è stato calcolato più di frequente, in caso di parità si ritorni il valore maggiore.
229241
"""
230242

231-
def es5(lista1, lista2, matrice):
232-
return
243+
def es5(matrice):
244+
riga = 0
245+
colonna = 0
246+
run = True
247+
somme = {}
248+
249+
bordoSup, bordoDx, bordoInf, bordoSx = 0, len(matrice[0]) - 1, len(matrice) - 1, 0
250+
faseSup, faseDx, faseInf, faseSx = True, False, False, False
251+
252+
253+
while run:
254+
run = False
255+
if faseSup and colonna + 1 <= bordoDx:
256+
run = True
257+
colonna += 1
258+
matrice[riga][colonna] += matrice[riga][colonna-1]
259+
valore = matrice[riga][colonna]
260+
somme[valore] = somme.get(valore, 0) + 1
261+
262+
if colonna == bordoDx:
263+
faseSup, faseDx = False, True
264+
bordoSup += 1
265+
266+
elif faseDx and riga + 1 <= bordoInf:
267+
run = True
268+
riga += 1
269+
matrice[riga][colonna] += matrice[riga-1][colonna]
270+
valore = matrice[riga][colonna]
271+
somme[valore] = somme.get(valore, 0) + 1
272+
273+
if riga == bordoInf:
274+
faseDx, faseInf = False, True
275+
bordoDx -= 1
276+
277+
elif faseInf and colonna - 1 >= bordoSx:
278+
run = True
279+
colonna -= 1
280+
matrice[riga][colonna] += matrice[riga][colonna+1]
281+
valore = matrice[riga][colonna]
282+
somme[valore] = somme.get(valore, 0) + 1
283+
284+
if colonna == bordoSx:
285+
faseInf, faseSx = False, True
286+
bordoInf -= 1
287+
288+
elif faseSx and riga - 1 >= bordoSup:
289+
run = True
290+
riga -= 1
291+
matrice[riga][colonna] += matrice[riga+1][colonna]
292+
valore = matrice[riga][colonna]
293+
somme[valore] = somme.get(valore, 0) + 1
294+
295+
if riga == bordoSup:
296+
faseSx, faseSup = False, True
297+
bordoSx += 1
298+
299+
sommeFinali = list(somme.items())
300+
sommeFinali.sort(key = lambda x : x[0], reverse = True)
301+
sommeFinali.sort(key = lambda x : x[1], reverse = True)
302+
SOMMA_MAGGIORE = sommeFinali[0][0]
303+
return matrice, SOMMA_MAGGIORE
304+
305+
print(es5([[ 8, 2, 6, -9, 3, 4, -5], # OUT : [[8, 10, 16, 7, 10, 14, 9],
306+
[ 7, -3, -5, 2, -7, 9, 1], # [50, 47, 42, 44, 37, 46, 10],
307+
[ 4, -6, -8, 3, 5, 7, 4], # [43, 60, 52, 55, 60, 53, 14],
308+
[-1, 7, 3, -6, 9, 5, 5], # [39, 66, 82, 76, 69, 58, 19],
309+
[-6, 2, 9, 6, -5, -1, 2], # [40, 59, 79, 70, 64, 57, 21],
310+
[ 5, -4, -7, -3, 6, 8, -2], # [46, 57, 61, 68, 71, 65, 19],
311+
[-2, 4, 7, 4, 8, -8, 9]])) # [41, 43, 39, 32, 28, 20, 28]] , 10
312+
313+
233314

234-
# print(es5([[ 8, 2, 6, -9, 3, 4, -5],
235-
# [ 7, -3, -5, 2, -7, 9, 1],
236-
# [ 4, -6, -8, 3, 5, 7, 4],
237-
# [-1, 7, 3, -6, 9, 5, 5],
238-
# [-6, 2, 9, 6, -5, -1, 2],
239-
# [ 5, -4, -7, -3, 6, 8, -2],
240-
# [-2, 4, 7, 4, 8, -8, 9]]))
241315

242316
#%%
243317
"""ES 6 - difficile
@@ -257,14 +331,13 @@ def es5(lista1, lista2, matrice):
257331
L'esercizio può essere svolto anche utilizzando la programmazione ad oggetti.
258332
"""
259333
import random
260-
from sys import breakpointhook
261334

262335
def main():
263336
LATO = 11
264-
griglia = resetGriglia(LATO)
265337
POSIZIONI_TOTALI = [(x, y) for x in range(LATO) for y in range(LATO)]
266338
PG = [[5, 5], '@']
267339
GAME_OVER = False
340+
griglia = resetGriglia(LATO)
268341
vite = 3
269342
contaPunti = 0
270343

@@ -280,7 +353,7 @@ def main():
280353

281354
while True:
282355
griglia = aggiornaPosizioni(PG, LATO, griglia, nemici, punto)
283-
stampaGriglia(LATO,griglia, vite, contaPunti)
356+
stampaGriglia(LATO,griglia, vite, contaPunti, nemici[:-1])
284357
if GAME_OVER:
285358
break
286359
PG = movimento(PG, LATO)
@@ -307,23 +380,23 @@ def main():
307380
def collisioni(PG, nemici, punto, vite, contaPunti):
308381
cambiaPosPunto = False
309382
GAME_OVER = False
310-
if tuple(PG) == punto:
383+
if tuple(PG) == punto: # collisione giocatore/punto
311384
contaPunti += 1
312385
cambiaPosPunto = True
313386

314387
for npc in nemici:
315-
if tuple(PG) == npc:
388+
if tuple(PG) == npc: # collisione nemico/giocatore
316389
vite -= 1
317-
if npc == punto:
390+
if npc == punto: # collisione nemico/punto
318391
cambiaPosPunto = True
319392

320-
if vite == 0:
393+
if vite <= 0:
321394
GAME_OVER = True
322395
return vite, contaPunti, cambiaPosPunto, GAME_OVER
323396

324397

325-
def movimento(PG, LATO):
326-
m = {'w': lambda coord : coord[1] - 1 if coord[1] - 1 >= 0 else LATO -1,
398+
def movimento(PG, LATO): # movimento del personaggio con risoluzione "effetto PAC-MAN"
399+
m = {'w': lambda coord : coord[1] - 1 if coord[1] - 1 >= 0 else LATO -1, # se la posizione è valida, allora muovi, altrimenti effetto PAC-MAN
327400
'a': lambda coord : coord[0] - 1 if coord[0] - 1 >= 0 else LATO -1,
328401
's': lambda coord : coord[1] + 1 if coord[1] + 1 < LATO else 0,
329402
'd': lambda coord : coord[0] + 1 if coord[0] + 1 < LATO else 0}
@@ -334,13 +407,13 @@ def movimento(PG, LATO):
334407
'd': 0}
335408

336409
direzione = input().lower()
337-
PG[0][asse.get(direzione, 0)] = m.get(direzione, lambda coord : coord[0])(PG[0])
410+
PG[0][asse.get(direzione, 0)] = m.get(direzione, lambda coord : coord[0])(PG[0]) # se il comando immesso non è valido il personaggio resta fermo
338411
return PG
339412

340-
def resetGriglia(LATO):
413+
def resetGriglia(LATO): # refresh della griglia
341414
return [["_" for l in range(LATO)] for h in range(LATO)]
342415

343-
def aggiornaPosizioni(PG, LATO, griglia, nemici, punto):
416+
def aggiornaPosizioni(PG, LATO, griglia, nemici, punto): # refresh della griglia + aggiornamento di tutte le posizioni
344417
griglia = resetGriglia(LATO)
345418
x, y = punto[0][0], punto[0][1]
346419
griglia[y][x] = punto[1]
@@ -353,18 +426,19 @@ def aggiornaPosizioni(PG, LATO, griglia, nemici, punto):
353426

354427
return griglia
355428

356-
def stampaGriglia(LATO, griglia, vite, punti):
357-
print(f"\n\nvite = {vite}\tpunti = {punti}")
429+
def stampaGriglia(LATO, griglia, vite, punti, nemici): # stampo griglia con bordi, vite, punti e numero nemici
430+
print(f"\n\nvite : {vite}\tpunti : {punti}")
358431
print("-" * (2 * LATO + 3))
359432
for riga in range(LATO):
360433
print("|", end = " ")
361434
for colonna in range(LATO):
362435
print(griglia[riga][colonna], end = " ")
363436
print("|")
364437
print("-" * (2 * LATO + 3))
438+
print(f"nemici : {len(nemici)}")
365439

366440

367-
def posizioneCasuale(posTot, posEscluse):
441+
def posizioneCasuale(posTot, posEscluse): # spawn nemici e punti, escluse posizioni occupate da altri oggetti
368442
posTotTmp = posTot.copy()
369443
for posizione in posEscluse:
370444
try:
@@ -374,7 +448,7 @@ def posizioneCasuale(posTot, posEscluse):
374448
nuovaPosizione = random.choice(posTotTmp)
375449
return nuovaPosizione[0], nuovaPosizione[1]
376450

377-
def movimentoCasuale(LATO, x, y):
451+
def movimentoCasuale(LATO, x, y): # movimento nemici con risoluzione "effetto PAC-MAN"
378452
asse = random.choice(['x', 'y'])
379453
movimento = random.choice([-1, 1])
380454
if asse == 'x':
@@ -393,7 +467,4 @@ def movimentoCasuale(LATO, x, y):
393467

394468
return x, y
395469

396-
main()
397-
398-
399-
# %%
470+
# main()

README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ I apologize to anyone who doesn't speak italian.
1414
Materia | Appunti | Esercizi | Stato | Ultimo aggiornamento
1515
-----------------|---------|----------|------------- |----------------------
1616
Assembly (mips) | [x] | [x] | Incompleti | 23/06/22
17-
Python | [ ] | [x] | Incompleti | 04/07/22
17+
Python | [ ] | [x] | Incompleti | 05/07/22
1818

1919
---
2020

0 commit comments

Comments
 (0)