diff --git a/sessions/python-02.tex b/sessions/python-02.tex index 7258588..d64f093 100644 --- a/sessions/python-02.tex +++ b/sessions/python-02.tex @@ -436,6 +436,15 @@ Erreur! \end{frame} +\begin{frame}[fragile] + \frametitle{Découper une string en liste} + +\begin{lstlisting} +>>> message = "un deux trois" +>>> message.split() # espaces +["un", "deux", "trois"] +\end{lstlisting} +\end{frame} \begin{frame}[fragile] @@ -548,6 +557,145 @@ Aussi: \end{frame} +\begin{frame}[fragile] + \frametitle{Squelette} + +\begin{itemize} + \item Lire les mots possibles depuis un fichier texte + \item Choisir un mot au hasard + \item Afficher un "hint" + \item Démarrer une boucle + \begin{itemize} + \item Demander une lettre + \item Afficher le "hint" mis à jour + \item Vérfier si le jeu est fini + \item Repartir au début de la boucle + \end{itemize} +\end{itemize} + +\end{frame} + +\begin{frame}[fragile] + \frametitle{Une fonction par tâche} + +\begin{itemize} + \item \texttt{read\_words()} + \item \texttt{choose\_word()} + \item \texttt{display\_hint()} + \item \texttt{has\_won()} +\end{itemize} + +\end{frame} + +\begin{frame}[fragile] + \frametitle{Structure de données} +\begin{itemize} + \item Une liste pour les mots dans le fichier + \item Un ensemble pour les bonnes lettre devinées +\end{itemize} + +\end{frame} + +\begin{frame}[fragile] + \frametitle{Implémentation: lire un fichier} + +\begin{itemize} + \item \texttt{open()} renvoie un "objet fichier" + \item \texttt{read()} lit le fichier \textbf{en entier} et retourne une string +\end{itemize} + + +\begin{lstlisting} +def read_words(): + stream = open("noms.txt") + contents = stream.read() + stream.close() + words = splitlines() + return words +\end{lstlisting} + +\end{frame} + +\begin{frame}[fragile] + \frametitle{Choisir un mot au hasard dans la liste} +\begin{lstlisting} +import random # remember me? +def choose_word(words): + n = len(words) + index = random.randint(0, n-1) + return words[index] +\end{lstlisting} +\end{frame} + +\begin{frame}[fragile] + \frametitle{Afficher les lettres devinées} + +\begin{lstlisting} +def display_hint(word, letters): + for letter in word: + if letter in letters: + print(letter, end="") + else: + print("_", end="") + print("") +\end{lstlisting} + +\begin{lstlisting} +>>> display_hint("vache", {"a"}) +_a___ +>>> display_hint("vache", {"a", "c"}) +_ac__ +\end{lstlisting} +\end{frame} + +\begin{frame}[fragile] + \frametitle{L'utilisateur a-t-il gagné?} + +L'utilisateur a gagné si toutes les lettres ont +été devinées: + +\begin{lstlisting} +def has_won(word, letters): + for letter in word: + if letter not in letters: + return False + return True +\end{lstlisting} +\end{frame} + + +\begin{frame}[fragile] + \frametitle{Boucle principale} +\begin{lstlisting} +words = read_words() +word = choose_word(words) + +letters = set() +display_hint(word, letters) + +while True: + new_letter = input() + letters.add(new_letter) + display_hint(word, letters) + if has_won(word, letters): + print("OK") + return +\end{lstlisting} +\end{frame} + +\begin{frame}[fragile] + \frametitle{Une tradition} +Traditionnelement, on appelle ce genre de fonction \texttt{main()}: + +\begin{lstlisting} +def main(): + words = read_words() + word = choose_word(words) + ... + +main() # ne pas oublier de l'appeler! +\end{lstlisting} +\end{frame} diff --git a/sources/04-pendu.py b/sources/04-pendu.py index c2ff3e3..113b788 100644 --- a/sources/04-pendu.py +++ b/sources/04-pendu.py @@ -3,8 +3,9 @@ import random def read_words(): stream = open("noms.txt") - words = stream.read().splitlines() + contents = stream.read() stream.close() + words = contents.splitlines() return words @@ -47,4 +48,5 @@ def main(): return + main()