Topic: campo minato con python URGENTE  (Letto 267 volte)

0 Utenti e 1 Visitatore stanno visualizzando questo topic.

Offline Carmen DAgostino

  • python unicellularis
  • *
  • Post: 7
  • Punti reputazione: 0
    • Mostra profilo
campo minato con python URGENTE
« il: Gennaio 03, 2020, 14:19 »
salve sono nuova del forum e sto realizzando un progetto su campo minato
ho creato due matrici stato e celle che però considera solo nella funzione e non globalmente per poterle usare in seguito da altre funzioni .... come posso risolvere il problema?

stato = []
celle = []

def initMatrix(r,c,v):   
    m = [[v]*c for i in range (r)]
    return m

def emptyMatrix(r,c):
    return initMatrix(r,c,0)
def inizializza():
    stato = emptyMatrix(righe,colonne)
    celle = emptyMatrix(righe,colonne)
    stato = posizionaMine(numMine,stato)

    for i in range(righe):
        for j in range(colonne):
            if celle[j] != -1:
                celleVicine = vicini(celle,(i,j))
                num = 0
                for (x,y) in celleVicine:
                   if celle
  • [y] == -1:

                        num +=1
                celle[j]=num
inizializza()

print(celle)
print(stato)
infatti con quest'ultimo print ottengo celle = [] e stato = []
« Ultima modifica: Gennaio 03, 2020, 15:41 da Carmen DAgostino »

Offline nuzzopippo

  • python neanderthalensis
  • ****
  • Post: 381
  • Punti reputazione: 0
    • Mostra profilo
Re:campo minato con python URGENTE
« Risposta #1 il: Gennaio 03, 2020, 16:08 »
Il codice da Te postato è incompleto, oltre a riferire a funzioni non riportate, comunque una assegnazione di questo tipo
celle = emptyMatrix(righe,colonne)

fatta all'interno di una funzione, definisce una variabile locale e non riferisce ad una variabile globale, esempio
Python 3.6.9 (default, Nov  7 2019, 10:44:02) 
[GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license()" for more information.
>>> stato = []
>>> celle = []
>>> def init_matrix(r, c, v):
m = [[v]*c for i in range(r)]
return m

>>> def empty_matrix(r, c):
return init_matrix(r, c, 0)

>>> def inizializza():
righe = 5
colonne = 5
celle = empty_matrix(righe, colonne)
stato = empty_matrix(righe, colonne)


>>> inizializza()
>>> print(celle)
[]
>>> print(stato)
[]
>>> def inizializza():
righe = 5
colonne = 5
global celle
global stato
celle = empty_matrix(righe, colonne)
stato = empty_matrix(righe, colonne)


>>> inizializza()
>>> print(celle)
[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]
>>> print(stato)
[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]
>>>


Come puoi vedere, perché una variabile possa essere utilizzata quale globale e ricevere una assegnazione all'interno di una funzione, deve essere prima dichiarata come "global", non vi è necessità di ciò se bisogna solo leggerne i valori.
Per maggiori dettagli, cerca la documentazione relativa alla visibilità delle variabili ed alle variabili globali.

Ciao :)
« Ultima modifica: Gennaio 03, 2020, 16:10 da nuzzopippo »

Offline RicPol

  • python sapiens sapiens
  • ******
  • Post: 3.154
  • Punti reputazione: 9
    • Mostra profilo
Re:campo minato con python URGENTE
« Risposta #2 il: Gennaio 03, 2020, 16:37 »
No però "global" no, eh?... che ce ne sono già abbastanza di problemi nel mondo.

I casi sono due...
1) l'OP impara a usare le classi,
2) oppure impara che le funzioni non sono semplicemente del codice rientrato di 4 spazi così per bellezza, ma hanno anche la possibilità di restituire un valore di ritorno, che a sua volta può essere passato come parametro in ingresso ad altre funzioni.

Tendenzialmente la soluzione "giusta" sarebbe la 1, anche se la 2 è ugualmente possibile e comunque andrebbe capita.
In linea di principio, quando hai un "coso" il cui stato può essere modificato da successive manipolazioni, e di cui quindi ti interessa conservare lo stato man mano che il "coso" viene manipolato, allora una classe è di solito il modo più naturale per modellare il "coso".
Quando invece hai un "coso" di cui non ti interessa conservare lo stato, ma che è invece "usa-e-getta" (stateless, come si dice in gergo), ovvero è un "coso" che prende (eventualmente) dei valori, li manipola in un certo modo e sputa fuori un risultato, e tutto quello che ti serve è il risultato, perché tanto poi la prossima manipolazione partirà comunque da altri valori e avrà un risultato diverso, ecco allora una funzione di solito è il modo giusto per modellare il "coso".

Detto questo, in certi casi è senz'altro possibile avere un "coso-con-stato" e modellarlo senza usare le classi, ma solo con le funzioni. Semplicemente, ogni manipolazione corrisponde a una funzione che accetta in ingresso il "coso", e sputa fuori una nuova versione del "coso" opportunamente manipolato, che a sua volta può essere passata in ingresso alla successiva funzione, per la successiva manipolazione. E' una strategia che si può usare con profitto in certi casi, soprattutto quando non ci sono side-effect da considerare.

(Detto questo: in primo luogo mi accerterei che l'OP abbia mai incontrato nella sua vita "return". Comunque, niente "global", mai, per principio).

Offline nuzzopippo

  • python neanderthalensis
  • ****
  • Post: 381
  • Punti reputazione: 0
    • Mostra profilo
Re:campo minato con python URGENTE
« Risposta #3 il: Gennaio 03, 2020, 16:59 »
No però "global" no, eh?... che ce ne sono già abbastanza di problemi nel mondo.
Non posso che concordare, personalmente evito proprio di fare variabili globali (e neanche le costanti mi piacciono), già mi incasino di mio ...

I casi sono due...
1) l'OP impara a usare le classi,
2) oppure ....
Considerato che "campo minato" è una applicazione grafica, penso che sia la 1) e basta, anche se imparare ogni aspetto è comunque "bene"

... l'urgenza posta nel titolo, però, mi ha fatto pensare di limitarmi al solo aspetto richiesto ed incrociare le dita augurando fortuna :)

Offline Carmen DAgostino

  • python unicellularis
  • *
  • Post: 7
  • Punti reputazione: 0
    • Mostra profilo
Re:campo minato con python URGENTE
« Risposta #4 il: Gennaio 04, 2020, 01:15 »
grazie mille per la risposta  :) ho risolto