2013-07-20 4 views
9

Ho insegnato programmazione di base per computer all'8 °/9 ° anno per due settimane, e ieri ho provato a mostrare loro come potevano realizzare veri e propri giochi di testo-avventura in Python.Evitare l'uso globale senza confondere nuovi studenti di programmazione in Python?

scene sono funzioni, (per esempio dragons_cave()) che consistono in alcune dichiarazioni di stampa e poi una chiamata a input(), chiedendo al giocatore dove vogliono andare dopo, che poi viene passato al globals() di trovare la funzione appropriata e quindi chiamati. So che non è l'ideale (a che punto l'enorme catena di funzioni inizia a diventare un problema?) Ma, di quello che mi è passato per la testa, sembra essere il più semplice per loro mentre coinvolge solo un po 'di manovre.

Il mio problema è con stato globale - ex. il giocatore ottiene una chiave in una scena e solo allora possono sbloccare il cancello in un'altra scena. Quando ho immutables globali come stringhe o booleani, Python vuole che io usi la parola chiave global all'inizio della funzione.

global hasKey 
hasKey = True 

Sono abbastanza d'accordo con questo, ma ho un senso vago (prelevati da StackOverflow tra gli altri luoghi su Internet) che global è visto di buon occhio e ha sempre una controparte superiore. Potrei avere un dizionario globale o avvolgere tutto in una classe, ma non sono sicuro di poter difendere chiaramente quelle opzioni ai miei figli (che stanno ancora riflettendo sulle implicazioni delle variabili).

Qualsiasi cosa io usi, voglio essere in grado di spiegare direttamente ai miei figli perché lo facciamo in questo modo e perché farlo in questo modo è necessario. global sembra avere entrambe queste proprietà, ma è male?

+0

ci sono molti buoni motivi per evitare la globalizzazione, ci sono anche molti motivi perfettamente validi per usare i globals. solo il mio 2c ... per i principianti è un concetto più facile da cogliere ma può portare a cattive abitudini in futuro. –

+0

Voterò che tu sia onesto e in anticipo. "Quando diventi programmatore più esperto, imparerai che esistono metodi migliori rispetto all'utilizzo dei globali. Per ora, ci aiuta a mantenere le cose semplici mentre impariamo le basi.Se vuoi imparare come fare questo senza le globali, chiedimi dopo le lezioni. "Poche persone che conosco hanno imparato a camminare indossando scarpe da ginnastica –

risposta

7

Vorrei incoraggiare loro di iniziare ad imparare OO

class Location: 
    name="a place" 
    description = "A dark place. there are exits to the North and East" 
    exits = "North","East" 
    def __str__(self): 
     return "%s\n%s"%(self.name,self.description) 


class Player: 
    current_location = "Home" 
    inventory = ["Blue Key","Magic Thumbtacks"] 
    health = 100 
    name = "Unknown" 
    def __init__(self,name): 
     self.name = name 

player = Player("Player 1") 
loc = Location() 
print loc 
x = input("Input:") 

Per essere onesti un gioco è un concetto difficile (anche un'avventura testuale). Ma vorrei avviarli direttamente sui concetti OO, essi trarranno maggiore beneficio da questo a lungo termine.

Concesso questo esempio è molto piccolo e lascia fuori molti dettagli di implementazione.

Un esempio OO non collegati ma meglio sarebbe:

class Animal: 
    voice = '...' 
    def speak(self): 
     return "A %s Says '%s'"%(self.__class__.__name__, self.voice) 

class Dog(Animal): 
    voice = "Bark, Bark" 

class Duck(Animal): 
    voice = "Quack, Quack" 

print Dog().speak() 
print Duck().speak() 
+0

Mentre incoraggiare il design OO è una buona idea, non sono sicuro che le classi con molti le variabili di classe sono buoni esempi: sono di nuovo solo globali, solo raggruppati in uno spazio dei nomi di classe (che è meglio di niente, ma non ancora grandioso). Suppongo che tu possa sovrascrivere le variabili di classe in sottoclassi, ma non è molto stile di codifica comune – Blckknght

+0

Volevo solo mostrare un esempio molto semplice di OO ed ereditarietà e questo dimostra chiaramente quei principi (almeno imho) .. in realtà le classi sarebbero molto più –

+0

di quanto adorabile esempio! – Martian2049

7

Supponendo che si desidera mantenere le cose il più semplice possibile (senza OO) e si vuole evitare di introdurre la parola chiave global, si potrebbe invece utilizzare un dizionario di stato e assegnare le variabili in là.

state['hasKey'] = True 

Dal momento che l'accesso a questo dict non è un assegnamento di variabile si evita introducendo la parola global e allo stesso tempo può insegnare come usare un dict (controllando per le chiavi, ecc)

Naturalmente è ancora usa una variabile globale e non affronta il problema del buon stile di codifica.