瀏覽代碼

pendu ok

master
Dimitri Merejkowsky 6 年之前
父節點
當前提交
09be10355d
共有 2 個檔案被更改,包括 151 行新增1 行删除
  1. +148
    -0
      sessions/python-02.tex
  2. +3
    -1
      sources/04-pendu.py

+ 148
- 0
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}





+ 3
- 1
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()