You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

325 lines
14 KiB

This file contains invisible Unicode characters!

This file contains invisible Unicode characters that may be processed differently from what appears below. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to reveal hidden characters.

[Home](./README.md) | **Semaine 1**
# Énoncé - Semaine 1
- [Énoncé - Semaine 1](#énoncé---semaine-1)
- [Délai de livraison](#délai-de-livraison)
- [Travail demandé](#travail-demandé)
- [Package 1 : Modèle](#package-1--modèle)
- [Package 2 : Extensions pour les tests en CLI](#package-2--extensions-pour-les-tests-en-cli)
- [Premier test : Command Line Tool](#premier-test--command-line-tool)
- [Critères d'évaluation](#critères-dévaluation)
# Délai de livraison
Votre travail est à rendre sur une branche tp1 et doit être fusionné à la branche principale lorsqu'il est terminé.
La livraison est attendue à la fin du TP.
Un retard jusqu'à la fin du second ou du troisième TP est autorisé mais se verra attribué des pénalités (cf. [Critères d'évaluation](#critères-dévaluation)).
# Travail demandé
Durant la première semaine, il vous est demandé de réaliser la première partie de la gestion du plateau de jeu.
## Package 1 : Modèle
Le premier *Package* à créer correspond au modèle (*Model*).
Voici un diagramme de classes de ce qui est attendu :
```mermaid
classDiagram
direction LR
class Board {
<<struct>>
+nbRows : Int
+nbColumns : Int
+init?(withGrid:)
}
class Cell {
<<struct>>
+init(ofType:ownedBy:withPiece:)
}
class CellType {
<<enum>>
unknown
jungle
water
trap
den
}
class Owner {
noOne
player1
player2
}
Cell --> "1" CellType : cellType
Cell --> "1" Owner : initialOwner
Board --> "*" Cell : grid
class Animal {
<<enum>>
rat
cat
dog
wolf
leopard
tiger
lion
elephant
}
class Piece {
<<struct>>
+init(withOwner:andAnimal:)
}
Piece --> "1" Owner : owner
Piece --> "1" Animal : animal
Cell --> "?" Piece : piece
```
En français, vous avez donc à préparer les types suivants :
- les *enums* :
- ```CellType``` : représente le type d'une cellule (case) du plateau de jeu. Ces cellules peuvent être de type jungle (```jungle```), lac (```water```), piège (```trap```) ou tannière (```den```). La valeur ```unknown``` sera surtout utile comme valeur par défaut et pour le débogage.
- ```Owner``` : représente le propriétaire d'une cellule du plateau (au démarrage du jeu, ou pour les tannières) ou d'une pièce. C'est un jeu à deux joueurs, les deux valeurs possibles sont donc ```player1``` et ```player2```. Mais puisqu'une cellule peut n'appartenir à personne, la valeur ```noOne``` existe également et est utilisée pour cela.
- ```Animal``` : représente le type d'animal du jeu (rat ```rat```, chat ```cat```, chien ```dog```, loup ```wolf```, lépoard ```leopard```, tigre ```tiger```, lion ```lion``` ou éléphant ```elephant```).
- ```Owner``` doit se transformer facilement en ```String``` pour permettre le débogage et le test en lignes de commande. Les transformations seront les suivantes :
valeur | String
--- | ---
```noOne``` | ```"x"```
```player1``` | ```"1"```
```player2``` | ```"2"```
- la structure ```Piece``` qui représente une pièce du jeu. Elle possède donc :
- deux propriétés en lecture seule, et non-modifiables :
- un propriétaire (```owner```)
- un type d'animal (```animal```)
- un initialiseur permettant d'écrire ces deux propriétés lors de l'initialisation
- la possibilité de transformer une valeur de ```Piece``` en ```String``` sous la forme : ```"[1:leopard]"``` par exemple pour un léopard du joueur 1.
- la structure ```Cell``` qui représente une cellule ou une case du jeu. Elle possède donc :
- des propriétés en lecture seule et non-modifiables :
- un type de case (```cellType```)
- un propriétaire de case (pour les tannières et les cases de départ) (```initialOwner```)
- éventuellement une pièce s'il y en a une dessus (```piece```)
- un initialiseur permettant de choisir le type de cellule, un propriétaire (avec la valeur par défaut ```noOne```), une pièce (par défaut il n'y en a pas)
- la possibilité de transformer une ```Cellule``` en ```String``` sous la forme : ```"<piece> on <cellType>, <owner>"``` (avec ```<piece>``` qui vaut ```ø``` s'il n'y a pas de pièce), par exemple : ```"[1:leopard] on .jungle, x"``` ou ```"ø on .water, x"``` ou ```"[2:tiger] on den, 1"```.
- la structure ```Board``` qui représente le plateau de jeu. Elle possède donc :
- des propriétés en lecture seule et non-modifiables :
- ```nbRows``` représentant le nombre de lignes du plateau de jeu,
- ```nbColumns``` représentant le nombre de colonnes du plateau de jeu.
- une propriété représentant un tableau à deux dimensions de cellules (```grid```). Cette propriété devra être uniquement lisible à l'extérieur de ```Board```, mais modifiable au sein de cette structure.
- un initialiseur prenant un tableau à deux dimensions de cellules en paramètre. Cet initialiseur devra faire des vérifications :
- toutes les lignes doivent avoir la même taille, sinon, l'initialiseur rend ```nil```.
## Package 2 : Extensions pour les tests en CLI
Pour permettre un affichage simplifié en lignes de commande, il vous est demandé de permettre l'affichage des pièces, cellules, etc. avec des emojis. Or, ceci étant spécifique à une application en lignes de commande, il n'est pas utile de les ajouter au *Package* précédent. En conséquence, il vous est demandé de créer un deuxième *Package* avec des extensions des types précédents afin de permettre l'affichage de :
- ```CellType``` (via une propriété ```symbol```) :
valeur | ```String```
--- | ---
```unknown``` | ```" "```
```jungle``` | ```"🌿"```
```den``` | ```"🪹"```
```trap``` | ```"🪤"```
```water``` | ```"💧"```
- ```Animal``` (via une propriété ```symbol```) :
valeur | ```String```
--- | ---
```rat``` | ```"🐭"```
```cat``` | ```"🐱"```
```dog``` | ```"🐶"```
```wolf``` | ```"🐺"```
```leopard``` | ```"🐆"```
```tiger``` | ```"🐯"```
```lion``` | ```"🦁"```
```elephant``` | ```"🐘"```
- ```Owner``` (via une propriété ```symbol```) :
valeur | ```String```
--- | ---
```noOne``` | ```" "```
```player1``` | ```"🟡"```
```player2``` | ```"🔴"```
- ```Board``` (via la propriété classique), pour que cela donne par exemple (à peu près) :
```
🌿🦁🟡 🌿 🪤 🪹 🪤 🌿 🌿🐯🟡
🌿 🌿🐶🟡 🌿 🪤 🌿 🌿🐱🟡 🌿
🌿🐭🟡 🌿 🌿🐆🟡 🌿 🌿🐺🟡 🌿 🌿🐘🟡
🌿 💧 💧 🌿 💧 💧 🌿
🌿 💧 💧 🌿 💧 💧 🌿
🌿 💧 💧 🌿 💧 💧 🌿
🌿 💧 💧 🌿 💧 💧 🌿
🌿🐘🔴 🌿 🌿🐺🔴 🌿 🌿🐆🔴 🌿 🌿🐭🔴
🌿 🌿🐱🔴 🌿 🪤 🌿 🌿🐶🔴 🌿
🌿🐯🔴 🌿 🪤 🪹 🪤 🌿 🌿🦁🔴
```
c'est-à-dire que chaque cellule sera représentée par : son type, le type de la pièce, la couleur du joueur propriétaire de cette pièce.
## Premier test : Command Line Tool
Pour cette première semaine, nous allons créer un test en lignes de commande (qui s'affichera dans l'interface d'XCode).
Le test demandé est très simple :
=> initialiser une valeur de ```Board``` et l'afficher.
> Note :
> Essayez de refaire la grille de départ (comme ci-dessus).
# Critères d'évaluation
Pour être obtenir les points, vous devez faire valider vos aquis par l'enseignant à l'oral pendant les TP (ou si l'enseignant le propose, lors d'une évaluation écrite).
Cette validation doit avoir lieu avant la fin du TP pour obtenir tous les points. Si la validation a lieu pendant le TP2, une pénalité de 50% est appliquée. Si elle a lieu pendant le TP3, une pénalité de 75% est appliquée. Par la suite, plus aucun point n'est attribué.
**Légende**
symbole | signification
--- | ---
☢️ | si ce critère n'est pas respecté => 0/20
🎬 | évalué à la fin du TP
1⃣ | ctirère de niveau 1 : tant que vous n'avez pas obtenu tous les points sur les critères de niveau 1, les points sur les critères suivants ne sont pas attribués
2⃣ | critère de niveau 2 : tant que vous n'avez pas obtenu tous les points sur les critères de niveau 1 et 2, les points sur les critères de niveau 3 ne sont pas attribués
3⃣ | critère de niveau 3
**Critères**
niveau | description | coeff | pénalités TP2 | pénalités TP3
--- | --- | --- | --- | ---
☢️ | Le dépôt doit être accessible par l'enseignant | ☢️
☢️ | un .gitignore doit exister au premier push | ☢️
🎬 | les *Packages* et le test compilent | 4 | 50% | 75%
🎬 | le test s'exécute sans bug | 4 | 50% | 75%
3⃣ | tous mes projets sont dans le même _workspace_ | 2 | 50% | 75%
1⃣ | j'ai créé un *Package* *Model* | 2 | 50% | 75%
1⃣ | j'ai créé l'enum ```CellType``` | 1 | 50% | 75%
1⃣ | j'ai créé l'enum ```Owner``` | 1 | 50% | 75%
1⃣ | j'ai créé l'enum ```Animal``` | 1 | 50% | 75%
3⃣ | ```Owner``` s'affiche comme demandé sous la forme d'un ```String``` | 1 | 50% | 75%
1⃣ | ```Piece``` possède bien les propriétés demandées en lecture seule non-modifiables | 1 | 50% | 75%
1⃣ | ```Piece``` possède un initialiseur | 2 | 50% | 75%
3⃣ | ```Piece``` est transformable en ```String``` comme demandé | 1 | 50% | 75%
1⃣ | ```Cell``` possède bien les propriétés demandées en lecture seule non-modifiables | 1 | 50% | 75%
1⃣ | ```Cell``` possède bien une propriété ```piece``` pouvant ne pas avoir de valeur | 2 | 50% | 75%
1⃣ | ```Cell``` possède un initialiseur utilisant des valeurs par défaut pour deux paramètres | 2 | 50% | 75%
3⃣ | ```Cell``` est transformable en ```String``` comme demandé | 1 | 50% | 75%
1⃣ | ```Board``` possède bien les propriétés demandées en lecture seule non-modifiables | 1 | 50% | 75%
1⃣ | ```Board``` possède bien un tableau à deux dimensions de cellule | 2 | 50% | 75%
2⃣ | ```Board.grid``` est en lecture seule mais modifiable au sein de ```Board``` | 2 | 50% | 75%
1⃣ | ```Board``` possède un initialiseur permettant d'initialiser toutes ses propriétés | 2 | 50% | 75%
2⃣ | l'initialiseur de ```Board``` vérifie les contraintes et renvoie ```nil``` si nécessaire | 3 | 50% | 75%
3⃣ | j'ai créé un *Package* avec les extensions pour l'affichage en lignes de commande | 2 | 50% | 75%
3⃣ | j'ai créé une extensions pour ```CellType``` | 1 | 50% | 75%
3⃣ | j'ai créé une extensions pour ```Animal``` | 1 | 50% | 75%
3⃣ | j'ai créé une extensions pour ```Owner``` | 1 | 50% | 75%
3⃣ | j'ai créé une extensions pour ```Board``` | 2 | 50% | 75%
2⃣ | j'ai créé une application de type *Command Line Tool* utilisant les deux *Packages* précédents | 2 | 50% | 75%
2⃣ | j'initialise correctement ```Board``` dans le test | 2 | 50% | 75%
3⃣ | j'affiche correctement ```Board``` dans le test | 1 | 50% | 75%
3⃣ | mon dépôt possède un readme qui apporte quelque chose... | 2 | 50% | 75%
3⃣ | mon code est commenté | 1 | 50% | 75%
> Note :
> Les coefficients peuvent être amenés à changer et sont donnés à titre indicatif
[Home](./README.md) | **Semaine 1**
---
Copyright &copy; 2023-2024 Marc Chevaldonné
Pendant la préparation de ce TP et de cet énoncé, j'écoutais...
<table>
<tr>
<td>
<img src="./images/listeningto/fuse_one.jpg" width="120"/>
</td>
<td>
<div>
<p><b>Fuse One</b></p>
<p><i>Silk</i> (1981)</p>
</div>
</td>
</tr>
</table>
<table>
<tr>
<td>
<img src="./images/listeningto/mingus_at_monterey.jpg" width="120"/>
</td>
<td>
<div>
<p><b>Mingus At Monterey</b></p>
<p><i>Charles Mingus</i> (1964)</p>
</div>
</td>
</tr>
</table>
<table>
<tr>
<td>
<img src="./images/listeningto/upon_the_wings_of_music.jpg" width="120"/>
</td>
<td>
<div>
<p><b>Upon The Wings Of Music</b></p>
<p><i>Jean-Luc Ponty</i> (1975)</p>
</div>
</td>
</tr>
</table>
<table>
<tr>
<td>
<img src="./images/listeningto/bayou_country.jpg" width="120"/>
</td>
<td>
<div>
<p><b>Bayou Country</b></p>
<p><i>Creedence Clearwater Revival</i> (1969)</p>
</div>
</td>
</tr>
</table>
<table>
<tr>
<td>
<img src="./images/listeningto/friday_night.jpg" width="120"/>
</td>
<td>
<div>
<p><b>Live At The Old Absinthe House bar ...Friday Night</b></p>
<p><i>Bryan Lee</i> (1997)</p>
</div>
</td>
</tr>
</table>
<table>
<tr>
<td>
<img src="./images/listeningto/vanguard_potter.jpg" width="120"/>
</td>
<td>
<div>
<p><b>Follow The Red Line - Live At The Village Vanguard</b></p>
<p><i>Chris Potter Underground</i> (2007)</p>
</div>
</td>
</tr>
</table>
<table>
<tr>
<td>
<img src="./images/listeningto/digital_works.jpg" width="120"/>
</td>
<td>
<div>
<p><b>Digital Works</b></p>
<p><i>Ahmad Jamal</i> (1985)</p>
</div>
</td>
</tr>
</table>