commit ed2b1b152d01f24d6b33a67f641dffc1b9274e22 Author: Axel Viala Date: Tue Oct 6 20:34:48 2020 +0200 initial commit let's droid dance. diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..6a77570 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "PaintDroid" +version = "0.1.0" +authors = ["Auteur Conseil: Deux type `enum` vous serons utile! ;) Une pour l'orientation, une pour +> le les instructions! + +Dans le fichier d'instructions vous aurrez les caractères suivants possibles: + +- L: Oriente le robot de 90 degrée à gauche par exemple passe de orientation: N à W +- R: Oriente le robot de 90 degrée à droite par exemple passe de orientation: N à E +- F: Avance dans le sens de l'orientation d'une case + +## Collisions + +En cas de collision avec un autre robot lors d'un déplacement le robot devra +dire sur la sortie standard: + +Cas des collisions: Faire dire `"Robot ID Collision en (x, y)"` + +Format du fichier definisant le monde: + +```txt +5 5 // X_max Y_max +1 1 N // position du robot en x=1 y=1 orientation = nord +FLLFRF + +3 2 S // position du robot 2 x=3 y=2 orientation=South +FFLFRRF + +``` + +Pour representer: + +- un robot une simple structure suffira. +- La structure pour contenir les robots pourras être un `vec` + +### Conclusion version 0.1.0 + +Dans certe première itération, vous devrez pouvoir faire la simulation des robots, +depuis un fichier d'instruction, et afficher a la fin leurs positions finales. + +#### Tests + +A venir + +## Version 0.2.0 Affichage implementation de Display + +Dans cette version on va écrire du code pour afficher la positions des robots et +dessiner la grille. + +Vous devrez pouvoir dessiner quelque chose comme cela en partant de la grille donnée en exemple plus haut +dans votre terminal: + +```txt +Terrain { x_max = 5; y_max = 5 } +Robots [ + { id = 0, x = 1; y = 1; orientation: North }, + { id = 1; x = 3; y = 2; orientation: South }, +] +Etat initial +============================ +5 . . . . . . +4 . . . . . . +3 . . . . . . +2 . . . ⬇ . . +1 . ⬆ . . . . +0 . . . . . . + 0 1 2 3 4 5 +Etat final +============================= +5 . . . . . . +4 . . . . . . +3 . . . . . . +2 . . . . . . +1 . ➡ . . . . +0 . . . ⬅ . . + 0 1 2 3 4 5 +``` + +Libre a vous d'adapter l'affichage tant que cela reste lisible. + +Pour réaliser cela on peut implementer un trait pour nos structures qui s'appelle +`Display` c'est un peu comme un contrat, qui garanti que si une structure, +l'implemente alors on peut avoir une representation humaine sous forme de `String`. + +Vous pouvez implementer aussi `Debug` pour vous faciliter la lecture en debuggant +votre code. + +## version 0.3.0 : un peu d'aléatoire + +Programmer ce qui est neccessaire pour que a chaque *tick* de façon aléatoire un +robot avance sa liste d'instruction serait symbolisée par simplement aucune liste +d'instructions. + +Programmer ce qui est neccessaire pour que a chaque *tick* de façon aléatoire un +robot avance sa liste d'instruction serait symbolisée par simplement aucune liste +d'instructions. + +## version 0.4.0 : un peu de couleurs + +A présent les robots lorsque ils se déplacent laissent une couleur sur les cases +qu'ils ont traversée, les couleurs sont determinées à partir de l'id d'un robot. + +Les couleurs seront des couleurs affichables en terminal, à vous d'ecrire une +fonction qui va des id vers les couleurs. indice: fonction de hashage, trait `Hash`. + +Une couleur se degrade progressivement sur 5 tours et disparait elle reste destructrice jusque a +sa disparition totale. + +Si un robot traverse la couleur d'un autre robot il est mis hors service, il est +hors jeu pour le reste de la partie et sera symbolisé par `'🤖'` par exemple il +reste un element dans lequel les autres robots peuvent entrer en collision. + +La collision entre deux robots n'implique pas de mise hors service. + +Programmer ce qui est neccessaire pour que a chaque *tick* de façon aléatoire un +robot avance sa liste d'instruction serait symbolisée par simplement aucune liste +d'instructions. + +Pour vous aider avec les couleurs vous pouvez utiliser la crate [termion](https://lib.rs/crates/termion) +ou [colored](https://crates.io/crates/colored). + +## version 0.5.0 : Paralellization des Robot'z + +A présent dans ce bonus, faites le neccessaire pour pouvoir avoir plusieurs robots +qui agisent en parallèlle, vous devrez découvrir l'usage des threads, channels, +`Mutex`, `Arc` ou bien utiliser une bibliothèque comme [Rayon](https://docs.rs/rayon/1.4.1/rayon/) qui abstrait cela. + +Voici le chapitre du livre sur le sujet [FearLess concurrency](https://doc.rust-lang.org/book/ch16-00-concurrency.html). + +Un petit exercice pour faire des threads est dans exercices/ + +## version 0.6.0 : De-Serialisation/Serialisation de l'etat du monde + +Utilisez une bibliothèque comme [Serde](https://github.com/serde-rs/serde) +pour écrire sur un fichier l'etat des structures de données du jeu pour par +exemple arretter une partie en cas de `Ctrl-C`. + +## Version 0.7.0 : Gestion du parsing rationnelle + +Utilisez une bibliothèque de votre choix pour gérer le parsing le format de fichier des robots. + +Telle que : + +- [nom](https://github.com/Geal/nom) +- [pest](https://github.com/pest-parser/pest) +- [lalrpop](https://github.com/lalrpop/lalrpop) + +## Version 0.8.0 : Industrialisation et lib de jeu vidéo + +Choissisez une bibliothèque pour faire des jeux vidéo en Rust et faites vous plaisir +pour améliorer avec de la gestion des assets, 3D ou autre dans votre projet si vous en êtes +la je peux plus vous retenir. + +Site pour choisir ses lib/framework de jeu: + +Conseil de game-engine: + +- [Bevy](https://bevyengine.org/) +- [Amethyst.rs](https://amethyst.rs/) + +## Version 0.9.0 : Vous avez dit IA + +Programmer ou entrainner une petite IA pour ce jeu. C'est pas simple c'est du gros +bonus. ;) +Le but d'une IA est de survivre en envoyant des commandes pour eviter d'être mise hors +service. Plusieurs IA devraient pouvoir jouer ensemble. diff --git a/Two_robots.txt b/Two_robots.txt new file mode 100644 index 0000000..6fd4a60 --- /dev/null +++ b/Two_robots.txt @@ -0,0 +1,8 @@ + +5 5 // X_max Y_max + +1 1 N // position du robot 2 en x=1 y=1 orientation=nord +FLLFRF // Liste d'instruction du robot + +3 2 S // position du robot 2 x=3 y=2 orientation=South +FFLFRRF diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..375a7a6 --- /dev/null +++ b/src/main.rs @@ -0,0 +1,3 @@ +fn main() { + println!("BeBoP?"); +}