**Home** | [Semaine 1](./subject_week1.md) # Introduction - [Introduction](#introduction) - [Dou Shou Qi](#dou-shou-qi) - [**But du jeu** :](#but-du-jeu-) - [**Matériel** :](#matériel-) - [Pouvoir des animaux](#pouvoir-des-animaux) - [Déroulement du jeu](#déroulement-du-jeu) - [Déroulement des TP](#déroulement-des-tp) - [Évaluation](#évaluation) - [Structure de l'application](#structure-de-lapplication) - [Énoncés](#énoncés) Cette introduction explique comment cette ressource va se dérouler, ce qu'il y aura à réaliser, et comment vous serez évaluées et évalués. Pour découvrir le langage **Swift**, nous proposons de développer le modèle d'un jeu traditionnel chinois appelé le **Dou Shou Qi** dont les origines remontraient au Vème siècle. # Dou Shou Qi ## **But du jeu** : - occuper la tanière de son adversaire - ou manger toutes ses pièces - ou l'empêcher de bouger. ## **Matériel** : Chaque joueur possède 8 pions numérotés (pour représenter leur force) et représentant des animaux : **Rat** 🐭 (1), **Chat** 🐱 (2), **Chien** 🐶 (3), **Loup** 🐺 (4), **Léopard** 🐆 (5), **Tigre** 🐯 (6), **Lion** 🦁 (7) et **Éléphant** 🐘 (8). Le plateau de jeu est une grille à deux dimensions de 10 lignes et 7 colonnes. Il est fait de 4 types de cases : - **Jungle** 🌿 : aucune particularité - **Lac** 💧 : interdit à tous les animaux sauf le **Rat** ; le **Lion** et le **Tigre** peuvent sauter par-dessus. - **Tanière** 🪹 : un joueur ne peut pas se déplacer sur sa propre **Tanière** et doit aller sur la **Tanière** de l'adversaire pour gagner - **Piège** 🪤 : un pion sur un piège (quel que soit le côté du plateau) a une force de **0**. La grille originale ressemble à : 🌿 🌿 🪤 🪹 🪤 🌿 🌿 🌿 🌿 🌿 🪤 🌿 🌿 🌿 🌿 🌿 🌿 🌿 🌿 🌿 🌿 🌿 💧 💧 🌿 💧 💧 🌿 🌿 💧 💧 🌿 💧 💧 🌿 🌿 💧 💧 🌿 💧 💧 🌿 🌿 💧 💧 🌿 💧 💧 🌿 🌿 🌿 🌿 🌿 🌿 🌿 🌿 🌿 🌿 🌿 🪤 🌿 🌿 🌿 🌿 🌿 🪤 🪹 🪤 🌿 🌿 (la tanière du haut est celle du joueur 1, celle du bas du joueur 2). De plus, certaines cases sont les cases de départ des pions : 🦁 🌿 🪤 🪹 🪤 🌿 🐯 🌿 🐶 🌿 🪤 🌿 🐱 🌿 🐭 🌿 🐆 🌿 🐺 🌿 🐘 🌿 💧 💧 🌿 💧 💧 🌿 🌿 💧 💧 🌿 💧 💧 🌿 🌿 💧 💧 🌿 💧 💧 🌿 🌿 💧 💧 🌿 💧 💧 🌿 🐘 🌿 🐺 🌿 🐆 🌿 🐭 🌿 🐱 🌿 🪤 🌿 🐶 🌿 🐯 🌿 🪤 🪹 🪤 🌿 🦁 (où les animaux du haut sont ceux du joueur 1, et ceux du bas du joueur 2). ## Pouvoir des animaux - Tous les animaux peuvent _manger_ un animal de force égale ou inférieure, avec les exceptions suivantes : - l'éléphant ne peut pas _manger_ le rat, - le rat peut _manger_ l'éléphant, - on ne peut pas _manger_ son propre animal. - Les animaux ne peuvent se déplacer que sur une case adjacente (même ligne ou même colonne) - Les animaux ne peuvent pas se déplacer sur leur propre **Tanière** - Les animaux ne peuvent pas se déplacer dans l'eau (sauf le **Rat**). Attention, le **Rat** ne peut pas sortir de l'eau pour attaquer l'**éléphant** adverse, mais il peut le faire pour attaquer le **rat** adverse. - Le **lion** et le **tigre** peuvent sauter par-dessus les lacs (en restant sur la même ligne ou sur la même colonne), **sauf** si un **rat** est dans le lac, sur la trajectoire du saut. ## Déroulement du jeu Chaque joueur doit à son tour de jeu déplacer l'un de ses animaux. # Déroulement des TP L'objectif des TP est de réaliser cette application en 5 TP durant 6 semaines. Les énoncés seront donnés en début de semaine ainsi qu'une liste de thème à travailler pour bien réussir le TP. La sixième semaine sert de tampon, pour rattraper le retard accumulé pendant les semaines précédentes. Pour chacune des 5 premières semaines, il est conseillé de : - avant le TP : - travailler les thèmes donnés en avance, via : - la [documentation officielle du langage Swift](https://www.swift.org/documentation/) - le [livre Apple sur le langage Swift](https://docs.swift.org/swift-book/documentation/the-swift-programming-language/) - les [ressources de cours sur code first](https://codefirst.iut.uca.fr/documentation/mchCoursDocusaurus/docusaurus/Swift/) - profiter du résumé en cours et poser des questions sur les parties non comprises - pendant le TP : - réaliser au maximum les tâches demandées - et les faire valider par l'enseignant pour obtenir validation de l'acquisition des compétences - après le TP : - faire le point sur le "reste à faire" et s'organiser pour la semaine suivante - faire le point sur les acquis que vous n'avez pas fait valider pour solliciter l'enseignant à la séance suivante Pour la sixième semaine : - profiter du dernier cours pour poser les dernières questions techniques - profiter du dernier TP pour rattraper le retard et faire valider ses derniers acquis non validés par l'enseignant. > Note : > Les ressources de cours sur code first ne remplacent pas la documentation officielle. Elles apportent des conseils sur l'ordre de lecture dans la réalisation des TP. > # Évaluation Une fiche de compétences à acquérir et des points à réaliser en TP sera préparée et accessible pour chaque TP sur code first. Vous aurez accès aux évaluations de l'enseignant au fur et à mesure de son évaluation. Pour obtenir une validation, vous devrez prouver votre acquisition des compétences à l'enseignant via : un entretien oral ou un examen écrit. La note finale sera composée de l'ensemble des acquis validés par l'enseignant à la dernière minute du dernier TP. # Structure de l'application Voici un diagramme de classes volontairement simplifié présentant grossièrement les différents acteurs de l'application que vous devez réaliser : ```mermaid classDiagram direction TB Game --> "1" Rules : rules Game --> "1" Board : board Game --> "2" Player: players Rules <|.. ClassicRules Rules <|.. VerySimpleRules Rules ..> Board Board --> "*,*" Cell : grid Player <|-- RandomPlayer Player <|-- HumanPlayer class Board { +insert(piece:, atRow:, andColumn:) +removePiece(atRow:, andColumn:) } class Cell { +cellType : CellType +initialOwner: Owner +piece : Piece? } class Rules { +createBoard() : Board$ +getNextPlayer() : Owner +isMoveValid(Board, Move) : Bool +isGameOver(Board, Int, Int) : Bool } class Player { +chooseMove(in: Board, with: Rules) Move? } class Game { +init(withRules:, andPlayer1:, andPlayer2: Player) +start() } ``` - ```Board``` représente le plateau de jeu et est composé d'un tableau à deux dimensions de ```Cell``` : il est responsable de l'insertion, de la suppression et donc du déplacement des pions. - ```Rules``` représente les règles du jeu. Comme elles sont assez touffues (```ClassicRules```), je vous proposerai des règles simplifiées (```VerySimpleRules```). ```Rules``` indique qui est le prochain joueur, si un coup est valide, si la partie est terminée, etc. - ```Player``` représente un joueur. Nous en réaliserons deux versions en particulier : une *IA* qui jouera aléatoirement (```RandomPlayer```) et un joueur humain (```HumanPlayer```). - ```Game``` : sert de médiateur et d'ordonnanceur pour la gestion globale du jeu. L'application à réaliser est une application en lignes de commandes qui permettra de jouer dans un terminal et ressemblera au résultat ci-dessous : Vous travaillerez sur : - ```Board``` et ```Cell``` pendant les deux premières semaines, - ```Rules``` et ```VerySimpleRules``` pendant la 3ème semaine, - ```Player```, ```RandomPlayer``` et ```HumanPlayer``` pendant la 4ème semaine, - ```Game``` et l'application finale pendant la 5ème semaine. Des énoncés plus détaillés vous seront donnés au début de chaque semaine. # Énoncés - [Semaine 1](./subject_week1.md) **Home** | [Semaine 1](./subject_week1.md) --- Copyright © 2023-2024 Marc Chevaldonné While writing this tutorial, I was listening to...

On The Corner

Miles Davis (1972)