{"id":18041262,"url":"https://github.com/cblavier/simon","last_synced_at":"2025-04-05T01:44:32.703Z","repository":{"id":39178982,"uuid":"252168052","full_name":"cblavier/simon","owner":"cblavier","description":"Simon Game, in Elixir / Phoenix","archived":false,"fork":false,"pushed_at":"2023-01-05T18:13:47.000Z","size":2932,"stargazers_count":2,"open_issues_count":26,"forks_count":1,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-02-10T10:18:05.071Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Elixir","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/cblavier.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2020-04-01T12:25:36.000Z","updated_at":"2020-04-11T12:32:51.000Z","dependencies_parsed_at":"2023-02-04T09:45:37.879Z","dependency_job_id":null,"html_url":"https://github.com/cblavier/simon","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cblavier%2Fsimon","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cblavier%2Fsimon/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cblavier%2Fsimon/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cblavier%2Fsimon/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/cblavier","download_url":"https://codeload.github.com/cblavier/simon/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247276098,"owners_count":20912287,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-10-30T15:08:56.891Z","updated_at":"2025-04-05T01:44:32.683Z","avatar_url":"https://github.com/cblavier.png","language":"Elixir","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Simon\n\nCe projet est un code challenge dont le but est d'apprendre le fonctionnement des `GenServer` Elixir en implémentant une IA joueur pour le Simon's Game.\n\n[![Alt text](https://img.youtube.com/vi/G6p7zRsECaI/0.jpg)](https://www.youtube.com/watch?v=G6p7zRsECaI)\n\n## Démarrage du serveur\n\nPremière étape, s'assurer que le projet actuel fonctionne sur votre poste.\n\nIl n'y a pas de base de données, il suffit donc de lancer :\n- `mix deps.get`\n- `mix phx.server`\n- `cd assets \u0026\u0026 npm install`\n\nEn appuyant sur \"START\" la partie doit démarrer puis s'arrêter aussitôt.\n\nL'application est constituée de ces composants :\n\n- `GameLive` est une `LiveView` qui permet de démarrer la partie puis de suivre son avancement.\n- `GameServer` est un `GenServer` qui gère l'état de la partie, donne le tour de jeu au joueur et s'assure que les séquences de couleurs entrées sont correctes. `GameServer` notifie l'ensemble de ses listeners (les joueurs et la liveview) des évènements de la partie.\n- Les IA des joueurs, que vous allez implémenter (une même IA peut être instantiée plusieurs fois avec des noms différents)\n\n## Coder votre IA\n\n**Vous allez coder votre IA sous la forme d'une branche + pull request sur ce repo.**\n\nL'IA de votre joueur doit être capable de jouer correctement une partie sur toute la longueur de la séquence.\nVotre serveur sera codée sous la forme d'un GenServer qui implémente les fonctions suivantes :\n\n* `start_link/1` \n  * Le tableau d'options suivantes lui sera passé `[game_server: game_server, name: name, guess_delay: guess_delay, round_delay: round_delay]`\n    * `game_server` est le pid du process qui gère la partie\n    * `name` est une string qui représente le nom donné à votre joueur\n    * `guess_delay` est une durée en ms qui représente le temps après chaque couleur lorsque votre IA donne sa séquence.\n    * `round_delay` est une durée en ms qui représente le temps à attendre au début de votre tour avant de donner la première couleur de la séquence.\n\n  - Lorsque votre serveur est démarré, il doit d'abord rejoindre la partie en faisant un appel de type `cast` au `GameServer` avec le message suivant : `{:join, player_pid, player_name}`\n\n* Gérer les messages `handle_info/2` suivants \n  * `{:sequence_color, round, color}`\n    * Ce message est lancé plusieurs fois par le `GameServer` pour indiquer la séquence en cours (au tour 3, le `GameServer` va envoyer 3x ce message d'affilée pour chacune des couleurs; au début du tour 10 ce message sera lancé 10x)\n    * `round` est le numéro du tour en cours\n    * `color` est un atom parmi `:red`, `:yellow`, `:green` et `:blue` \n\n  * `{:your_round, round}`\n    * Ce message n'est adressé qu'au joueur qui a été choisi par le `GameServer` pour jouer le tour en cours.\n    * `round` est le numéro du tour en cours\n    * Lorsque ce message est adressé à votre IA, elle doit:\n      1. Attendre `round_delay` ms\n      2. Attendre `guess_delay` ms\n      3. Envoyer au `GameServer` un message de type `call` avec les paramètres suivants `{:color_guess, color}`. **Attention, cet appel doit être effectué avec un timeout :infinity !!!**\n      4. Vérifier le résultat de l'appel : si `:ok` on reprend à l'étape 2 jusqu'à ce que la séquence soit terminée, Si `:bad_guess` on s'arrête là.\n\n  * `{:current_player, {player_pid, player_name}}`\n    * Ce message est adressé à tous les joueurs (en même temps que :your_round) pour indiquer à tous quel joueur a commencé son tour.\n    * `player_pid` est le process du joueur qui prend le tour\n    * `player_name` est le nom du joueur qui prend le tour\n\n  * `{:guess, color, {player_pid, player_name}}`\n    * Ce message est adressé à tous les joueurs (en même temps que :your_round) pour indiquer à tous quel coup vient d'être joué.\n    * `color` est la couleur qui vient d'être jouée\n    * `player_pid` est le process du joueur qui vient de jouer\n    * `player_name` est le nom du joueur qui vient de jouer\n\n  * `{:win}`\n    * La partie vient de se terminer en arrivant au bout la séquence sans erreur 🥳\n\n  * `{:lose}`\n    * La partie vient de se terminer sur une erreur 😞\n\n## Tester votre IA\n\nEvidemment via la LiveView mais également avec `ExUnit`. Vous pouvez vous inspirer du test de `game_server_test.exs`.    \n\n## Supporter des perks\n\nAfin d'apporter un peu de sel aux parties, vos IA vont être dotées de facultées qui malheureusement feront toutes prendre fin à la partie de manièré prématurée.\n\nVotre IA doit supporter la fonction suivante : \n\n  - `supported_perks/0` qui retourne un tableau d'atoms de cette forme : `[:color_blind, :amnesic]`\n  - au lancement de la partie, votre player sera aléatoirement doté d'un _perk_ parmi la liste supportée par votre IA via une nouvelle option `perk` passée à `start_link/1`\n\nImplémentez les perks que vous souhaitez, voici quelques exemples :\n\n  - `:color_blind` : ne fait pas la différence entre bleu et rouge.\n  - `:short_memory` : ne se souvient que des 5 derniers tours, pour le reste, c'est du hasard 🎲.\n  - `:rebel` : n'écoute pas les séquences du `GameServer`, uniquement les coups joués par les autres joueurs.\n  - `:asshole` : envoie des fausses séquences aux autres joueurs.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcblavier%2Fsimon","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcblavier%2Fsimon","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcblavier%2Fsimon/lists"}