@ -1,2 +1,187 @@
|
||||
# DouShouQi
|
||||
# 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)
|
||||
|
||||
|
||||
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 :
|
||||
|
||||
<img src="./images/Terminal.png" width="600px"/>
|
||||
|
||||
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.
|
||||
|
||||
---
|
||||
Copyright © 2023-2024 Marc Chevaldonné
|
||||
|
||||
While writing this tutorial, I was listening to...
|
||||
|
||||
<table>
|
||||
<tr>
|
||||
<td>
|
||||
<img src="./images/listeningto/on_the_corner.jpg" width="120"/>
|
||||
</td>
|
||||
<td>
|
||||
<div>
|
||||
<p><b>On The Corner</b></p>
|
||||
<p><i>Miles Davis</i> (1972)</p>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
After Width: | Height: | Size: 229 KiB |
After Width: | Height: | Size: 130 KiB |
After Width: | Height: | Size: 98 KiB |
After Width: | Height: | Size: 32 KiB |
After Width: | Height: | Size: 92 KiB |
After Width: | Height: | Size: 53 KiB |
After Width: | Height: | Size: 17 KiB |
After Width: | Height: | Size: 25 KiB |
After Width: | Height: | Size: 153 KiB |
After Width: | Height: | Size: 103 KiB |
After Width: | Height: | Size: 152 KiB |
After Width: | Height: | Size: 60 KiB |
After Width: | Height: | Size: 101 KiB |
After Width: | Height: | Size: 82 KiB |
After Width: | Height: | Size: 100 KiB |
After Width: | Height: | Size: 724 KiB |
After Width: | Height: | Size: 108 KiB |
After Width: | Height: | Size: 82 KiB |
After Width: | Height: | Size: 119 KiB |
After Width: | Height: | Size: 71 KiB |
After Width: | Height: | Size: 146 KiB |
After Width: | Height: | Size: 94 KiB |
After Width: | Height: | Size: 63 KiB |
After Width: | Height: | Size: 138 KiB |
After Width: | Height: | Size: 32 KiB |
After Width: | Height: | Size: 114 KiB |
After Width: | Height: | Size: 44 KiB |
After Width: | Height: | Size: 56 KiB |
After Width: | Height: | Size: 108 KiB |
After Width: | Height: | Size: 30 KiB |
After Width: | Height: | Size: 93 KiB |
After Width: | Height: | Size: 124 KiB |
After Width: | Height: | Size: 129 KiB |