Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found
Select Git revision
  • master
  • vS5_2020-2021
2 results

Target

Select target project
  • rvuillem/INF-TC2
  • teixeira/INF-TC2
  • mdemeill/INF-TC2
  • epelous/INF-TC2
  • rgayet/INF-TC2
  • gparamuc/INF-TC2
  • pdewilde/INF-TC2
  • bnegre/INF-TC2
  • elichiya/INF-TC2
  • amacgreg/INF-TC2
  • yjaid/INF-TC2
  • lcholley/INF-TC2
  • hwei/INF-TC2
  • lmelodef/INF-TC2
  • mnauche/INF-TC2
  • nbernier/INF-TC2
  • gbouvier/INF-TC2
  • lalbin/INF-TC2
  • jdelaffo/INF-TC2
  • ndjaoud/INF-TC2
20 results
Select Git revision
  • master
  • vS5_2020-2021
2 results
Show changes
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="592px" height="282px" viewBox="-0.5 -0.5 592 282" content="&lt;mxfile host=&quot;Electron&quot; modified=&quot;2020-10-23T14:24:20.314Z&quot; agent=&quot;5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/13.7.9 Chrome/85.0.4183.121 Electron/10.1.3 Safari/537.36&quot; etag=&quot;j2wcMG27qSD1AfmOCcUu&quot; version=&quot;13.7.9&quot; type=&quot;device&quot;&gt;&lt;diagram id=&quot;uKeeR9P6dBSU_i-VrJ_J&quot; name=&quot;Page-1&quot;&gt;7Zpbl5owEIB/jY/dQxKuj9W9dNttz7b2nO72LUIEukhsDF766xskgIArispq65PJZHKbfCQziR3UG83vGB57n6lDgg5UnHkHXXcgBEDRxU8sWSQSU7ESgct8Ryrlgr7/h0ihIqWR75BJQZFTGnB/XBTaNAyJzQsyzBidFdWGNCj2OsYuqQj6Ng6q0h++wz05C2jk8g/Ed720Z6DL+Y1wqixnMvGwQ2crInTTQT1GKU9So3mPBLHxUrsk9W5fKc0GxkjIt6lw/+ljNFXvp84313x8sPuzheu+k61M+CKdMKNR6JC4jtJBXcq4R10a4uCB0rEQAiH8RThfyKXCEadC5PFRIEvJ3OdPsnqcfl6RX89XCq4XaSbkbPGUqsWZ59WSvNIyl9aacEZfskUR5uxWLZJOj0bMJhvMACVZmLmEb9BDiR5xCtBIe98ROiJihEKBkQBzf1pkCEsU3UwvXy2RkAu2w+LJUU9xEMmeOlAPxPi7A5Fw4wTDth+STMxSeSoZUmGq+OsJKFs2of+OaKKAFMUYDoeroqTu95e0thh10kCx0Wo3QnGQyzYSN/N8TvpjvFyvmdhUinThwHdDkbbFGhO2FoOhHwS9bEJIzAHadqa5UuLoA13TN4EzJYyT+callqUIyc882+eS7CzfNAwp8lb2C1U5Ehuong2xZXISkogdFo9bhkfkzAgh+iuEGNZAUQ5DCABFQrIj7q0QUesR+UKjqWiJJHPn/oF3km7EOQ3PihVHI6ajrmPFhAOkH2o3KaKCYBUVoLTJilbPytfI57ERD0sIvSDyynZi1DPS6naiV+wcu0l9mQ2pcEOEP7Kvd1m1fuZvXkFtd5dTudJ2cTqbu5jWli5meioczseUVR+pv/z+JD8qLPGjlMBIRiprldjIhtEcF+PNHJQeDqdikue0pbTjoUD9xDwUs56REeWHpeMBD+IrjDOCo53zRtNODA7rEuGc2P6BrBNDJO1/EyPvLyFNOyENqPdXzVbhAPVw/LzA0Qocqn5qcKy7Wy2HN6HzPn5hyKMbB0+85VKATUGLKjUfcRwvh0sdqGy8wK4NBlbspK2xUyrbN2ZQjOIyle2fREGVmKHakFrT0JGDD4BqvqN93j3aiEPf4vHD2JLFPSGDJS8CaA0hAwa80ooOCWwZM/WYmBn/JmZWO5hl9x0pZnpTzMwKZqhlzLTjYQYaMHbqhJktEVbyeLMb250JsyqEtX1eVi93/9/zEm2JmdoSZqWLXGA2xEz4oGXMykfvsTEzLuflzphpLWFWepMEVlPMQAWz8tF7bMzMC2a7v0ttG4oe2P2H5XepPdz/8gHcmDORzf+4l6jnf39EN38B&lt;/diagram&gt;&lt;/mxfile&gt;" style="background-color: rgb(255, 255, 255);"><defs/><g><path d="M 301 41 L 158.06 126.76" fill="none" stroke="#000000" stroke-width="2" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 152.92 129.85 L 157.72 122.3 L 158.06 126.76 L 161.84 129.16 Z" fill="#000000" stroke="#000000" stroke-width="2" stroke-miterlimit="10" pointer-events="all"/><rect x="301" y="1" width="70" height="40" fill="#fff2cc" stroke="#d6b656" stroke-width="2" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 68px; height: 1px; padding-top: 21px; margin-left: 302px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b>racine<br /><font color="#007fff">Tk</font><br /></b></div></div></div></foreignObject><text x="336" y="25" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">racine...</text></switch></g><rect x="81" y="131" width="70" height="40" fill="#ffe6cc" stroke="#d79b00" stroke-width="2" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 68px; height: 1px; padding-top: 151px; margin-left: 82px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b>conteneur<br /><font color="#007fff">Frame</font><br /></b></div></div></div></foreignObject><text x="116" y="155" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">conteneur...</text></switch></g><rect x="1" y="241" width="100" height="40" fill="#d5e8d4" stroke="#82b366" stroke-width="2" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 98px; height: 1px; padding-top: 261px; margin-left: 2px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b>Nouvelle partie<br /><font color="#007fff">Button</font><br /></b></div></div></div></foreignObject><text x="51" y="265" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">Nouvelle partie...</text></switch></g><rect x="141" y="241" width="70" height="40" fill="#d5e8d4" stroke="#82b366" stroke-width="2" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 68px; height: 1px; padding-top: 261px; margin-left: 142px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b>Quitter<br /><font color="#007fff">Boutton</font><br /></b></div></div></div></foreignObject><text x="176" y="265" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">Quitter...</text></switch></g><path d="M 378.5 171 L 326.23 234.64" fill="none" stroke="#000000" stroke-width="2" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 322.42 239.27 L 324.41 230.55 L 326.23 234.64 L 330.59 235.63 Z" fill="#000000" stroke="#000000" stroke-width="2" stroke-miterlimit="10" pointer-events="all"/><rect x="231" y="131" width="70" height="40" fill="#ffe6cc" stroke="#d79b00" stroke-width="2" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 68px; height: 1px; padding-top: 151px; margin-left: 232px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b>conteneur<br /><font color="#007fff">Canvas</font><br /></b></div></div></div></foreignObject><text x="266" y="155" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">conteneur...</text></switch></g><rect x="521" y="131" width="70" height="40" fill="#d5e8d4" stroke="#82b366" stroke-width="2" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 68px; height: 1px; padding-top: 151px; margin-left: 522px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b>mot<br /><font color="#007fff">Label</font><br /></b></div></div></div></foreignObject><text x="556" y="155" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">mot...</text></switch></g><rect x="361" y="131" width="70" height="40" fill="#ffe6cc" stroke="#d79b00" stroke-width="2" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 68px; height: 1px; padding-top: 151px; margin-left: 362px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b>conteneur<br /><font color="#007fff">Frame</font><br /></b></div></div></div></foreignObject><text x="396" y="155" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">conteneur...</text></switch></g><rect x="281" y="241" width="80" height="40" fill="#d5e8d4" stroke="#82b366" stroke-width="2" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 261px; margin-left: 282px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b>A<br /><font color="#007fff">Button</font><br /></b></div></div></div></foreignObject><text x="321" y="265" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">A...</text></switch></g><rect x="431" y="241" width="80" height="40" fill="#d5e8d4" stroke="#82b366" stroke-width="2" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 261px; margin-left: 432px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b>Z<br /><font color="#007fff">Button</font><br /></b></div></div></div></foreignObject><text x="471" y="265" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">Z...</text></switch></g><path d="M 378 261 L 418 261" fill="none" stroke="#000000" stroke-width="4" stroke-miterlimit="10" stroke-dasharray="4 8" pointer-events="stroke"/><path d="M 318.5 41 L 270.15 123.89" fill="none" stroke="#000000" stroke-width="2" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 267.13 129.07 L 267.7 120.14 L 270.15 123.89 L 274.61 124.17 Z" fill="#000000" stroke="#000000" stroke-width="2" stroke-miterlimit="10" pointer-events="all"/><path d="M 353.5 41 L 392.48 123.55" fill="none" stroke="#000000" stroke-width="2" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 395.05 128.98 L 388.01 123.45 L 392.48 123.55 L 395.25 120.04 Z" fill="#000000" stroke="#000000" stroke-width="2" stroke-miterlimit="10" pointer-events="all"/><path d="M 371 41 L 513.94 126.76" fill="none" stroke="#000000" stroke-width="2" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 519.08 129.85 L 510.16 129.16 L 513.94 126.76 L 514.28 122.3 Z" fill="#000000" stroke="#000000" stroke-width="2" stroke-miterlimit="10" pointer-events="all"/><path d="M 98.5 171 L 55.62 234.18" fill="none" stroke="#000000" stroke-width="2" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 52.26 239.15 L 53.44 230.28 L 55.62 234.18 L 60.06 234.78 Z" fill="#000000" stroke="#000000" stroke-width="2" stroke-miterlimit="10" pointer-events="all"/><path d="M 133.5 171 L 171.73 233.96" fill="none" stroke="#000000" stroke-width="2" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 174.84 239.09 L 167.27 234.33 L 171.73 233.96 L 174.11 230.17 Z" fill="#000000" stroke="#000000" stroke-width="2" stroke-miterlimit="10" pointer-events="all"/><path d="M 413.5 171 L 465.77 234.64" fill="none" stroke="#000000" stroke-width="2" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 469.58 239.27 L 461.41 235.63 L 465.77 234.64 L 467.59 230.55 Z" fill="#000000" stroke="#000000" stroke-width="2" stroke-miterlimit="10" pointer-events="all"/></g><switch><g requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"/><a transform="translate(0,-5)" xlink:href="https://desk.draw.io/support/solutions/articles/16000042487" target="_blank"><text text-anchor="middle" font-size="10px" x="50%" y="100%">Viewer does not support full SVG 1.1</text></a></switch></svg>
\ No newline at end of file
This diff is collapsed.
seance5_6h/figures/pendu1.png

45.8 KiB

......@@ -13,13 +13,10 @@ class Forme:
self.x += dx
self.y += dy
def setState(self, s):
self.__canevas.itemconfig(self._item, state=s)
class Rectangle(Forme):
def __init__(self, canevas, x, y, l, h, couleur):
Forme.__init__(self, canevas, x, y)
self._item = canevas.create_rectangle(x, y, x+l, y+h, fill=couleur, state="hidden")
self._item = canevas.create_rectangle(x, y, x+l, y+h, fill=couleur)
self.__l = l
self.__h = h
......@@ -46,7 +43,7 @@ class Rectangle(Forme):
class Ellipse(Forme):
def __init__(self, canevas, x, y, rx, ry, couleur):
Forme.__init__(self, canevas, x, y)
self._item = canevas.create_oval(x-rx, y-ry, x+rx, y+ry, fill=couleur, state="hidden")
self._item = canevas.create_oval(x-rx, y-ry, x+rx, y+ry, fill=couleur)
self.__rx = rx
self.__ry = ry
......
......@@ -4,8 +4,7 @@
# BE #5 : Le jeu du Pendu
L'objectif de ce BE est de réaliser le `jeu du Pendu`. Pour rappel, ce jeu consiste à essayer de découvrir un mot qui est affiché de manière masquée (chacune de ses lettres est remplacée par le caractère _'*'_). Pour cela, le joueur sélectionne une lettre sur le clavier virtuel. Si elle fait partie du mot, alors le mot à découvrir est ré-affiché en laissant apparaître cette lettre en clair. Si par contre le mot ne contient pas la lettre sélectionnée, alors le compteur de coups ratés augmente d'un et l'élément suivant du pendu est ajouté au dessin. Le joueur gagne s’il a pu découvrir le mot avant que le pendu ne soit complètement affiché (au delà de 10 coups manqués). La figure ci-dessous présente l'interface que nous allons construire ; oui, les couleurs piquent un peu aux yeux, mais ça pourra vous aider à répondre à la première question !
L'objectif de ce BE est de réaliser le `jeu du Pendu`. Pour rappel, ce jeu consiste à essayer de découvrir un mot qui est affiché de manière masquée (chacune de ses lettres est remplacée par le caractère _'*'_). Pour cela, le joueur sélectionne une lettre sur le clavier virtuel. Si elle fait partie du mot, alors le mot à découvrir est ré-affiché en laissant apparaître cette lettre en clair. Si par contre le mot ne contient pas la lettre sélectionnée, alors le compteur de coups ratés augmente d'un et l'élément suivant du pendu est ajouté au dessin. Le joueur gagne s'il a pu découvrir le mot avant que le pendu ne soit complètement affiché (au delà de 10 coups manqués). La figure ci-dessous présente l'interface que nous allons construire ; oui, les couleurs piquent un peu aux yeux, mais ça vous aidera à répondre à la première question !
<center><img src="figures/pendu0.png" style="width:60%"/></center>
......@@ -18,7 +17,7 @@ Ce BE fera l'objet d'un compte-rendu (CR), seul ou en binôme. L'énoncé corres
__Exercice 1 -__ Dessinez l'arbre de scène correspondant à la capture d'écran ci-dessus.
__Exercice 2 -__ En vous inspirant de l'organisation des classes du BE #4, programmez l'interface statique (_i.e._ sans commande) en distinguant la classe __FenPrincipale__ et la classe __ZoneAffichage__. À ce stade, à la place des 26 boutons du clavier (correspondant aux 26 lettres en majuscule), placez un simple bouton _"A"_ car le dessin du clavier est traité dans l'exercice suivant.
__Exercice 2 -__ En vous inspirant de l'organisation des classes du BE #4, programmez l'interface statique (_i.e._ sans programmer les commandes associées aux boutons) en distinguant la classe __FenPrincipale__ et la classe __ZoneAffichage__. À ce stade, à la place des 26 boutons du clavier (correspondant aux 26 lettres en majuscule), placez un simple bouton _"A"_ car le dessin du clavier est traité dans l'exercice suivant.
Testez votre interface et faites les ajustements nécessaires pour obtenir une apparence proche de celle donnée en exemple (mais sans le clavier, et avec les couleurs qui vous conviennent !). Le programme principal se réduira à ces quelques lignes :
```python
......@@ -43,11 +42,11 @@ Pensez à exécuter votre programme pour vérifier le placement du clavier virtu
Cette partie est destinée à implémenter la logique de jeu, à travers les commandes de l'interface :
- _Bouton "Quitter"_ (normalement, c'est déjà fait avec l'appel à la méthode _destroy_ !).
- _Bouton "Quitter"_ (vous l'avez peut être déjà fait, _cf_ remarque ci-dessus).
- _Bouton "Nouvelle partie"_.
- _Boutons-lettres "A", ..., "Z"_.
On fait ici abstraction de la représentation graphique du pendu qui sera traitée dans la partie suivante de cet énoncé. Allons-y pas-à-pas...
On fait ici abstraction de la représentation graphique du pendu qui sera traitée dans la partie suivante. Allons-y pas-à-pas...
### Bouton "Nouvelle Partie" (30 min.)
......@@ -56,12 +55,12 @@ Une partie ne pourra commencer que si le joueur appuie sur le bouton "Nouvelle p
__Exercice 4 -__ L'appuie sur ce bouton doit provoquer une ré-initialisation de toute l'interface :
- Tirer un nouveau mot au hasard dans le fichier [mots.txt](./mots.txt) (à votre disposition à côté de cet énoncé) et réinitialiser le mot à découvrir;
- Dégriser les boutons-lettres (```state=NORMAL```);
- Dégriser les boutons-lettres (par la commande suivante ```unBouton.config(state=NORMAL)```);
- Effacer le dessin du pendu (question traitée dans la partie suivante de cet énoncé).
_Quelques conseils pour limplémentation_
_Quelques conseils pour l'implémentation_
- Au chargement de l'application, pensez à griser toutes les lettres du clavier.
- Au lancement de l'application, pensez à griser toutes les lettres du clavier (l'utilisateur comprend alors qu'il doit appuyer sur le bouton "Nouvelle partie").
- Utilisez la méthode suivante pour charger les mots du fichier _mots.txt_ dans une liste privée appelée _self.\_\_mots_. Cette liste sera chargée une fois pour toute au lancement de l'application, et utilisée à chaque nouvelle partie.
```python
def chargeMots(self):
......@@ -72,13 +71,6 @@ def chargeMots(self):
```
- Pour tirer un nouveau mot au hasard, utilisez la fonction _randint(...)_ (```from random import randint```).
<!--
_Tip_ Vous pouvez créer des attributs différents pour sauvegarder
- le mot à deviner et
- le mot à deviner mais partiellement caché par des étoiles (celui qui sera affiché sur l'interface pour le joueur).
-->
Pensez à vérifier que votre application est bien fonctionnelle à ce stade.
......@@ -89,15 +81,15 @@ Le fait d'appuyer sur une lettre du clavier virtuel doit provoquer un certain no
- griser le bouton-lettre qui vient d'être cliqué (```state=DISABLED```);
- faire apparaître autant de fois que nécessaire la lettre cliquée dans le mot à découvrir;
- vérifier si la partie est perdue, gagnée, ou si elle se poursuit;
- éventuellement, compléter le dessin du pendu si la lettre n'est pas présente dans le mot (question traitée dans la partie suivante de cet énoncé).
- éventuellement, compléter le dessin du pendu si la lettre n'est pas présente dans le mot (action traitée dans la partie suivante de cet énoncé).
Chaque bouton doit pouvoir être identifié par la fonction de _callback_ appelée ici _cliquer_. Or il n'est pas possible de passer le numéro du bouton-lettre au _callback_ (aucun argument n'est admis). Nous allons procéder en créant notre propre classe de boutons, héritant de la classe __Button__.
Chaque bouton doit pouvoir être identifié par la fonction de _callback_ appelée ici _cliquer_. Or il n'est pas possible de passer le numéro du bouton-lettre au _callback_ (aucun argument n'est permis). Nous allons procéder en créant notre propre classe de boutons, héritant de la classe __Button__.
__Exercice 5 -__ Suivez les étapes proposées
1. Créez la classe __MonBoutonLettre__, qui hérite de la classe __Button__, et qui sauvegarde, en tant qu'attribut privé, la lettre correspondant au bouton (ou le numéro du bouton). Modifiez en conséquence le constructeur de la classe __FenPrincipale__ pour que le clavier virtuel soit composé de 26 instances de la classe __MonBoutonLettre__.
1. Créer la fonction de callback _cliquer(self)_ dans la classe __MonBoutonLettre__, qui fera notamment appel à la méthode _traitement(...)_ de la classe __FenPrincipale__.
1. Programmez la méthode _traitement(...)_ dont l'objectif est de mettre à jour l'affichage du mot.
1. Créer la classe __MonBoutonLettre__, qui hérite de la classe __Button__, et qui sauvegarde, en tant qu'attribut privé, la lettre correspondant au bouton (ou le numéro du bouton). Modifier en conséquence le constructeur de la classe __FenPrincipale__ pour que le clavier virtuel soit composé de 26 instances de la classe __MonBoutonLettre__.
1. Créer la fonction de callback _cliquer(self)_ dans la classe __MonBoutonLettre__, qui fera notamment appel à une méthode _traitement(...)_ de la classe __FenPrincipale__.
1. Programmer cette méthode _traitement(...)_ dont l'objectif est de mettre à jour l'affichage du mot.
- Si la partie est gagnée, bloquez l'utilisation du clavier, et affichez un texte qui indique au joueur que c'est gagné !
- La partie est perdue quand le nombre de coups dépasse 10 (c'est le nombre d'éléments nécessaires pour dessiner entièrement le pendu). Bloquez alors l'utilisation du clavier, et affichez un texte qui indique au joueur que c'est perdu !
......@@ -107,13 +99,25 @@ __Exercice 5 -__ Suivez les étapes proposées
---
## Partie 3 - Le dessin du pendu (75 min.)
Cet partie est consacrée au dessin progressif du pendu, au fur et à mesure des échecs du joueur. Ce dessin s'appuie sur les connaissances acquises lors du BE #4 et les classes du fichier [formes.py](./formes.py), disponible à côté de cet énoncé (Attention le fichier utilisé ici est très légèrement différent de celui du BE #4, merci de bien télécharger cette version).
Cette partie est consacrée au dessin progressif du pendu, au fur et à mesure des échecs du joueur. Ce dessin s'appuie sur les connaissances acquises lors du BE #4 et les classes du fichier [formes.py](./formes.py), disponible à côté de cet énoncé pour ceux qui le souhaitent. L'idée est de créer le pendu comme une liste de rectangles et d'ellipses (10 pièces doivent suffire).
Le parti pris ici est de créer et de dessiner les 10 pièces du pendu dans le constructeur de la classe __ZoneAffichage__, mais en leur affectant la propriété `state="hidden"`, de telle sorte qu'elles ne soient pas visibles. Ce n'est qu'au fur et à mesure de l'avancement d'une partie que les pièces apparaissent sur le canevas, en passant du statut `"hidden"` au statut `"normal"`. La réinitialisation liée à une nouvelle partie consistera alors à cacher l'ensemble des pièces.
*Remarque* : Notez qu'il aurait aussi été possible d'adopter un autre point de vue qui consisterait à créer et dessiner chaque pièce lors de chaque partie.
__Préliminaires sur le fichier [formes.py](./formes.py)__
- Modifier le fichier [formes.py](./formes.py) de telle manière que les rectangles et les ellipses soient cachés lors de leur création.
- Il est nécessaire de prévoir une méthode _setState(s)_ qui permette de changer ce statut. La méthode étant identique pour les rectangles et pour les ellipses, il convient de la factoriser dans la classe __Forme__ :
```python
def setState(self, s):
self.__canevas.itemconfig(self._item, state=s)
```
__Exercice 6 -__
__Exercice 6 -__ Mettez en place la stratégie décrite ci-dessus pour terminer l'application.
Pour cela, l'idée est de créer le pendu comme une liste de rectangles et d'ellipses (10 pièces doivent suffire), dans le constructeur de la classe __ZoneAffichage__. Pour faire disparaître le pendu (au moment de la création des pièces, ou au moment de la réinitialisation d'une partie p. ex.), on affectera aux pièces l'état caché (```state=hidden```). Pour faire apparaître les pièces progressivement (sur ordre de la méthode _traitement(...)_), on leur affectera l'état normal (```state=normal```).
Pour gagner un peu de temps, voici un exemple de jeu de pièces (avec leur position et leurs dimensions) qui permettent de dessiner le pendu de la première figure.
Pour gagner un peu de temps, voici un exemple de coordonnées pour les éléments graphiques :
```python
# Base, Poteau, Traverse, Corde
Rectangle(self, 50, 270, 200, 26, "brown")
......@@ -130,21 +134,22 @@ Rectangle(self, 203, 150, 40, 10, "black")
Rectangle(self, 175, 205, 10, 40, "black")
Rectangle(self, 191, 205, 10, 40, "black")
```
Rien ne vous empêche de customiser votre pendu !
---
## Partie 4 - Améliorations du jeu (autonomie)
Voici quelques améliorations possibles pour le jeu, seule la dernière est considérée comme un bonus.
Voici quelques améliorations pour le jeu, à rendre compte dans votre CR. Seule la dernière amélioration est considérée comme un bonus.
__Exercice 7 - Apparence__ Développez le code qui permet au joueur de choisir les couleurs principales de lapplication (par un menus, par des boutons...).
__Exercice 7 - Apparence__ Développez le code qui permet au joueur de choisir les couleurs principales de l'application (par un menus, par des boutons...).
__Exercice 8 - Bouton Triche__ Implémentez un bouton "Triche" qui permet de revenir en arrière d'un coup, pendant la partie.
__Exercice 8 - Triche !__ Implémentez une technique "_Undo_" qui permet de revenir de un ou plusieurs coups en arrière, au cours d'une partie.
__Bonus - Score joueur__ Implémentez un système de sauvegarde des parties jouées par un joueur (identifié par un pseudo demandé au joueur). Techniquement, on pourra créer une base de données _SQL_ (_cf_ BE #3), appelée _pendu.db_, qui stockera une table avec les joueurs et une table avec les parties jouées par ces joueurs, selon le schéma suivant :
__Bonus - Score joueur__ Implémentez un système de sauvegarde des échecs et des succès d'un joueur (identifié par un pseudo demandé au joueur en début de partie). Techniquement, on pourra créer une base de données _SQL_ (_cf_ BE #3), appelée _pendu.db_, qui stockera une table avec les joueurs et une table avec les parties jouées par ces joueurs, selon le schéma suivant :
<center><img src="figures/TableSQLJeuPendu.png" style="width:30%"/></center>
Le score pour chaque mot pourra être défini comme le taux de caractères trouvés (ainsi un score de 1.0 désigne un succès).
_Remarque_ : on ne demande pas ici d'afficher un historique ou des statistiques sur un joueur. Pour consulter la base, on pourra simplement utiliser ```DB Browser for SQLite```.
Dans un premier temps, pour vérifier que votre programme fonctionne, vous pouvez consulter la base _pendu.db_ à l'aide de ```DB Browser for SQLite```. Si vous le souhaitez, vous pouvez alors intégrer à votre application un affichage de l'historique des parties du joueur et/ou de ses performances.
<mxfile host="Electron" modified="2020-09-17T14:40:55.338Z" agent="5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/13.6.2 Chrome/83.0.4103.122 Electron/9.2.0 Safari/537.36" etag="ogBcgt9D4lmq_mGiNo-l" version="13.6.2" type="device"><diagram id="p7oPabUjFc-xsDlfVBy0" name="Page-1">7Vpbk9o2FP41zLQPMLbkCzxyWdLMNJ3MbJo2j8IWtnZli8higf76SpZ8N5ANkN2muw+sdaRzJM53vqMjiwGcJ/t3HG3iDyzEdACscD+AiwEAPvTlpxIctMAdO1oQcRJqkV0J7sk/2AgtI92SEGeNgYIxKsimKQxYmuJANGSIc7ZrDlsz2px1gyLcEdwHiHalf5FQxFo6Bn4l/w2TKC5mtr2J7klQMdh8kyxGIdvVRPBuAOecMaGfkv0cU+W7wi9ab3mkt1wYx6n4FoXPgfcAp1b2MHZsHjj43Tr9c2gbM5k4FN8Yh9IBpsm4iFnEUkTvKumMs20aYmXWkq1qzO+MbaTQlsIHLMTBoIm2gklRLBJqejOBuJgqdKQgZSkuZEtCqTGL07AYsaIsePwUk1SLzSBtiLPHEhio+vdE/K1MjIBrml/MYPW82BfmVeNQziX4oa6l2l/qnZVe3ioUtfOUx46CUjiYbXmATyFhghvxCItT46rYkZzDLMFyQVKRY4oEeWouBJnoj8pxpepHRuQSgWWI6kITpgVPJ1bThP4CRqsKM4kROtSGbdSA7Pg8jtc/z/L7xssHvYKiVfNJJcqZ8BxW6CmfEN0WkDHBsYI62yAJI/CoxGi24vIpEnkgGEkhiIigaFWI5SpW1dAW4So6qSjdxUTg+3wWuNjJnNqkzloG/5xRxnNdGLp4HDolE2o9Y7CCnlfO94S5wPvTUdoNqgKEdnBYpr2rUqJd5Lm4lg69VhDV47AG4fMR8l4ibRW5xa4lFmvknkwtzQwFrpszwLfmjAtTxkVQgQ6Z7mWEq5Ig/xjM4WA62ah/M0f0MgsligTpKlP/wq3Umt0NVLhBeFUyrddrEAR9ZAq9ledeiUz2qyOT30GogEFmu7ThX+/rVtUrs0D7ZqqiKFr9YuVwyNmt2tOv6lG5TFZdqRiuUULoQeuUoCoMVfqKMX3CggSo09M0YlaibKSMJ4g2u3fGXarf0WvJO6nkNeZDlbxJGvXqS0DFkMjYSY2+tdk3OwVHabaWWoV+issBO8bDpvm6+goFj1EemcOW44AzLh0GnEn17NbcF5JsQ5FxHUkpqU28pgyJ+oIKhNo7k/JPL5Tar3nOU1bsfOFtK7EQquCeqkADS725jXAwpAeWjtaSrMssxLJcU5xevv9jOfw0B8PZHaxtgHoBzUUpvTzEjmyNyu/naYwoiWRtuAgkdphfh6VjIBN7naaO36UpsN0uTeGtaDp5o+kbTS+l6f6g/n4SksKJdZ6jVs9WejOOlof9V1+Y1s68jSOvfebIe6Oz+5Ur4+L10e2P0xeFS7HMnpOmzCZft/nDlv8ER0bPe+kq1+4eRFpJNyhdUeVVeSiAUJ0z2qnWHkmNJeOPR7Nnf5o8lRKVx+XmSqemIyFhqDMElpkfrXJTimDmLYu0684G7kLZkklB7w656WskV6tZALnQ7iDo9gAIbgYgvCqAQAH4PtnIfCuZztLjL3VeFbKcmeXCxXBiXQnqyaRJ1p4j6eSHQu2+1bpvte7pWjdQne78I2cRR0miSeHOR6OR/HxuSXsmtq4YLWe+VX9Z/krrb8fyW6dk3+3Z5r2eU7J9s9Thv0QF/kNutPz6jVZZ0J+r7v1nlfcvUoNfWIIfudGymxWo264sj9xodQ35rVK2fXrUX/DiqzEXtBY8Pn01dmb8ja7Gjr+F+p4iDKoi7APJ8t1D3QSoDfKBqSPPf60au1Yx5rReaniW87LFGOheh14C+SeOnhCh/xc4Xddv7pA9cF7pGCWb1c9JNOGr3+TAu38B</diagram></mxfile>
\ No newline at end of file
<mxfile host="Electron" modified="2020-09-20T06:46:37.677Z" agent="5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/13.7.3 Chrome/85.0.4183.98 Electron/10.1.2 Safari/537.36" etag="bEDzdRwK5yAsqx6JgaMz" version="13.7.3" type="device"><diagram id="p7oPabUjFc-xsDlfVBy0" name="Page-1">7Vlbb+I6EP41SLsPIBKTBB4ptN2VzkpHas9lH01iErdOnHVMgfPrzzi2cwXablsqVUVVZY9nxvZcP8wALdLdtcB58oNHhA3ccbQboOXAdYPpDP4rwl4TpoGvCbGgkSY5NeGG/kcMcWyoGxqRosUoOWeS5m1iyLOMhLJFw0LwbZttzVl71xzHpEe4CTHrU/+hkUzMLdygpn8jNE7szo5vLpxiy2xuUiQ44tsGCV0O0EJwLvUo3S0IU7azdtFyV0dWq4MJksmnCPwd+ndoPi7uphNHhBNyvc7+GjpGTSH39sYkAgOYKRcy4THPMLusqReCb7KIKLVjmNU8f3CeA9EB4h2Rcm+8iTeSAymRKTOrhcRCzpV3gJDxjFjaFWXMqCVZZDlWjIf3twnNNNkwaUWC31eOQWp9R+W/SsXI9cz0p2FW4+XOqleTfbWXFPumlJr/bC7WcuXMCvZ9YO3JNyIkpwxvYhmLmMhTfCZ6lFcaOxgXXxOeEjgQMAjCsKQP7bDFJvrjiq8S/ZNTOLM7NonqBmYjk6fObNxWoW9kpOowAx/hfYMtVwzFiX3Gh/e5+j1+GOgT2FnDJjWpzITnZIXe8gGzjfUhl4IoNxQ5Br+6PgOnXawEjGJZBoKhWEJMJcMrS4ZTrGrWTsLV6aSidJtQSW7KXdByCzW1nTprCP4FZ1yUsijyyDSaVJnQWJm6K+T7p2L0gQhJdieDyq52g8M6ZVuXRMfWuaRRDv1OEDXjsOHC53to1vOQNTU4KGvZ1/+1USX2ItS2matciVdf4GTwB7uPG6OvaqhMBo0ik8M1TinbaxlQhNO8XERIWTwh7IFIGuLeSluJOYnSkXGRYtZe3hpzqfWJPku5yKCCEjFU8Uaz+KA8eE8OKcROZuTH+a69KAXOijVIWfmMVAxbLqK2+qb4Cof3cRmZw47h3Mm0Mpg7mdVjr2G+iBY5w8Z0NGO0sfGacSybB7Ie6iaTss9BV2q7lt1FaXHKg3e1JFIqjDBXgeZe6XwckXDI9jwbrSFzr3Z79YEBuJJxsAdggzph9e7tEwFZx9eRVFZGfzyHMaMx9LJlCI4j4pVSFLVTNOhnaFVKmxmK3ipDK9hzVmRh278dl018ZJHAo92/1fydR5r/G6EY92W4YvxuwOJF4WKPc6DnQi35tSkHG/EBmmfVFN+teTroaPc0JTesTFFXVbReI/j0C+33NIdMhRjhWR8YfbEkain5Rp2wqqcV/etxVNWrxofL7qkSq/wFvZrNzUJKo0iXHAKNBK9KVSpjDYAFvd7FwFsqXVBldLMpVQtu7oqWw9nJLwHPiJHJpINyvV6MTM9ZvR3vE2B9AqzTACtUi97iloBvvMVoNIL/HwFJTYKR18pG5B2o2L53znQM3gNMneWZJmg+01TY7DGgFjwLqZ0DTr02mjryHOK1wYTTBQlHnml6ipDTQSXd2NU3fvl7j9858PSR957T/G/03nP8OeF3ANEPWpTFeIEGc9Vv7rgCrk9BRkXyQZDRawEjd+J0gNGsV4qDs36t7b8NviRUbgV+wJQ9JTpCnqZUfsZHOz5mQbuMHYgP/3XiA6b1jzW68tS/eKHL/wE=</diagram></mxfile>
\ No newline at end of file
Voici une démo des principales commandes de git, à utiliser depuis un terminal. Pour **Windows**, utilisez le terminal appelé ``Git Bash``, qui a été installé en même temps que **git**).
Voici une démo des principales commandes de git, à utiliser depuis un terminal. Pour **Windows**, utilisez le _Terminal_ appelé ``Windows Powershell``.
Notez que C.E. Bichot a rédigé un tuto sur l'usage de _git_ en mode commande, disponible en suivant [ce lien](https://gitlab.ec-lyon.fr/cbichot/git-intro).
**Configuration de git** (à faire une fois pour toute)
```bash
......
......@@ -10,28 +10,28 @@ Ce document présente un tuto à l'usage de _git_/_gitlab_. Il est consultable s
Comme tout tutoriel, ce document a besoin de vos retours pour s'améliorer! N’hésitez pas à m'envoyez un mail décrivant vos difficultés et, éventuellement, les solutions que vous auriez trouvées pour les contourner.
> *Remarque* : Pour cutiliser _git_, vous devez savoir ouvrir un _Terminal_ sur votre machine, quelque soit le système d'exploitation (_Windows_, _Linux_, ou _Mac OS X_). Sous _Windows X_, vous pourrez utiliser le programme _Windows powershell_ qui est très similaires au _Terminal_ de _Linux_ et de _Mac OS X_. Vous devez aussi savoir naviguer dans vos dossiers à l'aide de la commande ```cd```. Typiquement :
> *Remarque* : Pour utiliser _git_, vous devez savoir ouvrir un _Terminal_ sur votre machine, quelque soit le système d'exploitation (_Windows_, _Linux_, ou _Mac OS X_). Sous _Windows X_, vous pourrez utiliser le programme _Windows powershell_ qui est très similaires au _Terminal_ de _Linux_ et de _Mac OS X_. Vous devez aussi savoir naviguer dans vos dossiers à l'aide de la commande ```cd```. Typiquement :
```shell
cd c:\Users\stephane\TP_Hadoop # Windows
cd ~\TP_Hadoop # Mac, linux
```
Si vous souhaitez remonter d'un niveau dans la hiérarchie des dossiers: ```cd ..```. Des tutos vidéo existent pour décoruvrir les comandes de bases (identiques à celles que l'on retrouve sur les systèmes _Linux_).
Si vous souhaitez remonter d'un niveau dans la hiérarchie des dossiers: `cd ..`. Des tutos vidéo existent pour découvrir les commandes de bases (identiques à celles que l'on retrouve sur les systèmes _Linux_).
---
## Installer _git_ pour Windows (si requis) et et *Github Desktop*
## Installer _git_ pour Windows (si requis) et *Github Desktop*
Avant de commencer, il faut vérifier que _git_ (un gestionnaire de version de fichiers) est bien installé sur votre machine. _git_ est normalement disponible par défaut sur les machines *Mac OS X* et *Linux* et *Windows 10*. Pour vérifier, lancez la commande suivante dans un _Terminal_
Avant de commencer, il faut vérifier que _git_ (un gestionnaire de version de fichiers) est bien installé sur votre machine. _git_ est normalement disponible par défaut sur les machines *Mac OS X*, *Linux* et *Windows 10*. Pour vérifier, lancez la commande suivante dans un _Terminal_
```shell
git --version
```
S'il est absent, alors installez-le grâce au lien suivant [git-scm](https://git-scm.com/download/win). Lors de l'installation, validez les choix par défaut qui vous sont proposés.
Si _git_ est absent, alors installez-le grâce au lien suivant [git-scm](https://git-scm.com/download/win). Lors de l'installation, validez les choix par défaut qui vous sont proposés.
L'interface *Github Desktop* que nous allons installer n'est absolument pas nécessaire pour travailler avec _git_. Mais elle évite, dans un premier temps, d'utiliser des commandes manuelles à partir d'un _Terminal_.
1. Téléchargez, installez et lancez l'application [Github Desktop](https://desktop.github.com/).
<center><img src="figures/GithubDesktop_vierge.png" style="width:50%"/></center>
1. Configurer *Github Desktop* (cette étape n'est nécessaire que si vous ne l'avez pas déjà fait lors de l'installation du logiciel) : aller dans le menu ``Préférences / git`` et entrez votre nom et votre adresse émail.
1. Configurer *Github Desktop* (cette étape n'est nécessaire que si vous ne l'avez pas déjà fait lors de l'installation du logiciel) : aller dans le menu ``Préférences / git`` et entrez votre nom ainsi que votre adresse émail.
---
......@@ -39,31 +39,31 @@ L'interface *Github Desktop* que nous allons installer n'est absolument pas néc
1. Montrer l'interface de _gitlab_
- Adresse: https://gitlab.ec-lyon.fr;
- Identifiant: ceux de Centrale;
- Naviguer dans le projet INF-TC2. Donner quelques explications sur l'interface.
- Identifiant: ceux de l'ECL;
- Naviguer dans le projet INF-TC2;
1. Créer un nouveau projet
- Nom : _HelloWorld_;
- Description: Mon premier projet _gitlab_;
- Discuter *Public/Internal/Private*;
- Sélectionner *Initialize repository with a README*;
<center><img src="figures/Gitlab_newproject.png" style="width:50%"/></center>
- Cliquer sur l'icône ``Clone`` et copier le lien ``Clone with HTTPS``, qui ressemble à https://gitlab.ec-lyon.fr/xyyyyy/helloworld.git.
- Cliquer sur l'icône `Clone` et copier le lien `Clone with HTTPS`, qui ressemble à `https://gitlab.ec-lyon.fr/xyyyyy/helloworld.git`.
1. Basculer sur *Github Desktop*,
- Sélectionner l'option ``Clone a Repository from the Internet``, puis l'onglet ``URL`` (ou menu ``File``, ``Clone repository``).
- Copier l'adresse précédemment mise en mémoire dans l'espace dédié, et choisir dans ``local path`` le répertoire dans lequel votre projet sera copié. Appuyez sur le bouton ``Clone`` de l'interface pour lancer l'importation de votre projet _gitlab_ sur votre machine.
- Vérifier dans un gestionnaire de fichiers que le *repo* est bien copié localement sur sa machine et qu'il contient un répertoire caché (``.git``) et le fichier *readme.md*.
- Basculer sur l'onglet ``history``, et commenter.
- Sélectionner l'option `Clone a Repository from the Internet`, puis l'onglet `URL` (ou menu `File > Clone repository`).
- Recopier l'adresse précédemment mise en mémoire dans l'espace dédié, et choisir dans `local path` le répertoire dans lequel votre projet sera copié. Appuyez sur le bouton `Clone` de l'interface pour lancer l'importation de votre projet _gitlab_ sur votre machine.
- Vérifier avec un gestionnaire de fichiers que le *repo* est bien copié localement sur sa machine et qu'il contient un répertoire caché (`.git`) ainsi que le fichier *readme.md*.
- Basculer sur l'onglet `history`, et commenter.
1. Pour éviter que certains fichiers temporaires ne soient suivis par _git_, on va spécifier les fichiers a exclure dans un fichier appelé *.gitignore* (il s'agit d'un fichier caché). Pour cela
- Aller dans le menu ``Repository``, sous-menu ``Repository settings``, puis ``Ignored Files``.
- Copier le contenu du fichier qui se trouve à l'adresse https://github.com/github/gitignore/blob/master/Python.gitignore dans l'espace réservé, puis ``Save``.
- Aller dans le menu `Repository > Repository settings`, puis `Ignored Files`.
- Copier le contenu du fichier qui se trouve à l'adresse `https://github.com/github/gitignore/blob/master/Python.gitignore dans l'espace réservé, puis `Save`.
<center><img src="figures/gitignore.png" style="width:50%"/></center>
- On doit alors *Commiter* les changements (le texte par défaut qui décrit le ``commit`` est OK). Plus de détails sur ces ``commit`` plus loin.
- On doit alors *commiter* les changements (le texte par défaut qui décrit le `commit` est OK). Plus de détails sur ces `commits` plus loin.
1. Éditer le fichier *readme.md* avec *Sublime Text* (ou tout autre éditeur de texte) et enregistrer les changements localement:
- Basculer vers *Github Desktop* et discuter les changements qui interviennent sur l'interface.
- *Commiter* les changements, et monter l'onglet *History*.
- *Pusher* le travail vers gitlab en utilisant l'option *Publish Branch*.
- *Pusher* le travail vers _gitlab_ en utilisant l'option *Publish Branch*.
- Basculer vers _gitlab_ et vérifier que les changements ont bien étaient publiés
1. Basculer vers *Spyder* pour éditer du code python:
1. Basculer vers *Spyder* pour éditer du code _Python_:
- Taper un programme *incremente_de_un(x)* et sauvegarder dans votre répertoire local sous le nom de fichier *incremente.py*.
- *commiter* les changements dans *Github Desktop*
- Refaire la même chose avec un autre fichier (*incremente_de_deux(x)*), à sauvegarder dans un sous répertoire *test*.
......@@ -72,28 +72,29 @@ L'interface *Github Desktop* que nous allons installer n'est absolument pas néc
De manière synthétique, une fois le projet créé,
1. vous modifiez vos code sources, et enregistrez régulièrement vos changements avec un ``commit`` (donc en local). Vous pouvez ``commiter`` des sources même s'ils ne sont pas terminés ou comportent des bugs. À ce stade cela n'a pas d'importance.
1. quand vous êtes content de votre travail, et que vous jugez vos algorithmes fonctionnels, vous pouvez alors publier vos précédents ``commit`` sur _gitlab_ avec un ``push``.
1. vous modifiez vos code sources, et enregistrez régulièrement vos changements avec un `commit` (donc en local). Vous pouvez `commiter` des sources même s'ils ne sont pas terminés ou comportent des bugs. À ce stade cela n'a pas d'importance.
1. quand vous êtes content de votre travail, et que vous jugez vos algorithmes fonctionnels, vous pouvez alors publier vos précédents `commit` sur _gitlab_ avec un `push`.
Ce comportement est illustré par le schéma de la figure suivante:
<center><img src="figures/PrincipeGit.png" style="width:50%"/></center>
-----
Pour détruire ce projet (sans grand interêt), il faut :
Pour détruire ce projet (sans grand intérêt), il faut :
1. Quitter Spyder pour farmer les fichiers en cours.
1. Détruire la version locale en utilisant *Github Desktop*: sélectionner l'onglet ``Current Repository``, et le menu contextuel sur le nom de votre projet permet d'accéder à ``Remove``. Penser à cocher la suppression physique des fichiers si vous le souhaiter (sinon seul la gestion du projet par *Github Desktop* sera supprimée, les fichiers seront toujorus présents sur votre disque dur).
1. Détruire la version distante sur _gitlab_: Dans la barre de menu latérale à gauche de l'interface Web, sélectionnez l'icône représentant une roue crantée correspondant à ``Settings``. Dans le sous-menu ``Général``, appuyez sur le bouton ``Expand`` correspondant à la ligne : *Advanced*. Tout en bas, sélectionner ``Delete Project``, copier la phrase demandée et appuyer sur le bouton pour confirmer.
1. Quitter Spyder pour fermer les fichiers en cours.
1. Détruire la version locale en utilisant *Github Desktop*: sélectionner l'onglet `Current Repository`, et le menu contextuel sur le nom de votre projet permet d'accéder à `Remove`. Penser à cocher la suppression physique des fichiers si vous le souhaitez (sinon seul la gestion du projet par *Github Desktop* sera supprimée, les fichiers seront toujours présents sur votre disque dur).
1. Détruire la version distante sur _gitlab_: Dans la barre de menu latérale à gauche de l'interface Web, sélectionnez l'icône représentant une roue crantée correspondant à `Settings`. Dans le sous-menu `Général`, appuyez sur le bouton `Expand` correspondant à la ligne : *Advanced*. Tout en bas, sélectionner `Delete Project`, copier la phrase demandée et appuyer sur le bouton pour confirmer.
-----
A quoi ça sert d'utiliser _git_ et _gitlab_ ? Les avantages sont nombreux:
- Avoir un copie de son travail sur un serveur distant.
- Sauvegarde incrémentale et dun historique des modification (undo infini!)
- Sauvegarde incrémentale et disposer d'un historique des modifications (undo infini!)
- Partager son travail avec tout le monde (si votre projet est publique), ou avec des personnes choisies (invitations personnelles).
- Travailler à plusieurs sur le même projet et en même temps (mais ça, c'est un autre tuto...)
- fusion automatique (ou presque) des sources
- traçage des modification (qui, qoui)
- fusion automatique (ou presque) des sources,
- traçage des modification (qui, quoi).
- ...
**Stéphane Derrode**
\ No newline at end of file