{"id":22273515,"url":"https://github.com/dfleta/rock-paper-scissors-spock-lizard","last_synced_at":"2026-06-24T08:31:56.579Z","repository":{"id":274984090,"uuid":"458381990","full_name":"dfleta/rock-paper-scissors-spock-lizard","owner":"dfleta","description":"Basic AI programming","archived":false,"fork":false,"pushed_at":"2025-01-31T14:04:00.000Z","size":30,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-25T16:51:34.403Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Python","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/dfleta.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,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-02-12T00:38:07.000Z","updated_at":"2025-01-31T14:04:04.000Z","dependencies_parsed_at":"2025-01-30T14:44:56.004Z","dependency_job_id":"a2c2aece-06fb-475e-a590-9add582ae79c","html_url":"https://github.com/dfleta/rock-paper-scissors-spock-lizard","commit_stats":null,"previous_names":["dfleta/rock-paper-scissors-spock-lizard"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/dfleta/rock-paper-scissors-spock-lizard","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dfleta%2Frock-paper-scissors-spock-lizard","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dfleta%2Frock-paper-scissors-spock-lizard/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dfleta%2Frock-paper-scissors-spock-lizard/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dfleta%2Frock-paper-scissors-spock-lizard/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dfleta","download_url":"https://codeload.github.com/dfleta/rock-paper-scissors-spock-lizard/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dfleta%2Frock-paper-scissors-spock-lizard/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34724735,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-24T02:00:07.484Z","response_time":106,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"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-12-03T13:13:01.263Z","updated_at":"2026-06-24T08:31:56.482Z","avatar_url":"https://github.com/dfleta.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"Práctica curso Programación para IA\n===================================\n\nExtender el código disponible en `05_RPS_More_AI.py` con la funcionalidad necesaria para\nimplementar la variante lagarto - Spock del juego piedra, papel o tijeras.\n\n[Práctica curso Programacion para IA](#práctica-curso-programacion-para-ia)\n  - [Solución](#solución)\n  - [Refactorizaciones](#refactorizaciones)\n  - [Testing](#testing)\n\n\n## Solución\n\nSolución propuesta en [`RPS_spock_lizard.py`](.src/../src/RPS_spock_lizard.py)\n\n## Refactorizaciones\n\nEs necesario refactorizar la función `assess_game()` para conseguir una solución abierta a la extensión y cerrada a la modificación, o principio Open/Closed (OCP) de SOLID.\n\nLa inclusión de nuevas categorías en el juego original produce una extensión de la estructura `if-elif-else` que deriva en código cableado, o cierto [input kludge antipattern](https://sourcemaking.com/antipatterns/input-kludge).\n\nPodría haber optado por eliminar la cláusula `if-elif-else` implementando polimorfismo de clase, pero he optado por expresar en el diccionario `Victories` -que ya estaba implementado en el código inicial- las reglas de la lógica del juego de manera declarativa, para mejorar la legibilidad del código. \n\nNo es una solución 100% OCP puesto que si las categorías del juego aumentan no sería viable extender el diccionario, pero confiemos en que la serie _Big Bang Theory_ no goce de una secuela y aumenten el juego con nuevas acciones ;) \n\nPara ello, he extendido el comportamiento del tipo enumerado `GameAction` simulando la diferencia de conjuntos en la función `minus(excluded_actions)`. Podría haber usado el tipo `set` de Python pero rompia la interfaz `list` necesaria en la función `get_random_computer_action()`. \n\nHe refactorizado la función `get_random_computer_action()` para reutilizarla en `get_winner_action(game_action)`.\n\nFinalmente, he encapsulado la lógica el juego en la clase `Game`. He decidido no usar una clase con métodos estáticos para poder generar distintas instancias del juego. \n\n\n## Testing\n\nEn todo proceso de refactorización de código es necesario incluir un conunto de casos test en aquellos comportamientos más susceptibles de presentar defectos.\n\nAunque no he practicado TDD estricta (que es como suelo codificar), he incluído casos test para eliminar defectos del código cuando he estimado que la lógica estaba completada.\n\nEs necesario contar con `pytest` instalado en el entorno virtual.\n\nPara seleccionar sólo los casos test de la lógica extendida: \n\n```bash\n$ pytest -v -m lizard\n$ pytest -v -m spock\n```\n\n## AIML\n\nHe simplicado la salida por consola de la app al mensaje:\n\n`\"%s wins %s. You lost!\" %(computer_action.name, user_action.name)`\n\nEs posible implementar las salidas de la aplicación de una manera más explícita usando un fichero `.aiml` y accediendo a los elementos XML con el módulo `xml.etree.ElementTree`.","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdfleta%2Frock-paper-scissors-spock-lizard","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdfleta%2Frock-paper-scissors-spock-lizard","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdfleta%2Frock-paper-scissors-spock-lizard/lists"}