Empecemos diciendo que esto es mitad aporte, mitad solicitud de ayuda porque el proyecto lo llevo a medias.
Mis capacidades en programación dejan bastante que desear y seguro que en esta comunidad hay muchas personas que saben cómo hacer lo que queda por hacer y lo que ya está hecho hacerlo mejor.
Vamos al grano:
-Las partidas de Codenames necesitan 25 palabras distribuidas aleatoriamente para 8 espías rojos, 8 azules, 8 civiles y 1 asesino.
(En las reglas son 9 para equipo inicial y solo 7 civiles; esto se cambia con facilidad)
Esta parte la he programado utilizando Wolfram Language porque ya tiene integradas un montón de funciones para jugar con palabras.
Así que, dándome de alta en Wolfram Programming Lab, creé un pequeño script para generar "escenarios" automáticamente.
m=Capitalize[RandomWord[25,Language->"Spanish"]];
TextGrid[{m[[1;;5]],m[[6;;10]],m[[11;;15]],m[[16;;20]];m[[21;;25]]},BaseStyle->{Black,Bold,30},Frame->All]
a={0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,3};
a=RandomSample[a,25];
ArrayPlot[{a[[1;;5]],a[[6;;10]],a[[11;;15]],a[[16;;20]];a[[21;;25]]},Mesh->True,ColorRules->{0->Red,1->Blue,2->Gray,3->Black}]Este script genera la siguiente salida:
Y, en principio, ya estamos listos para jugar.
Pero digo en principio porque las palabras que pueden salir puede que no las conozca ni su padre (ocurre con frecuencia) y es que la función RandomWord saca cualquier palabra del diccionario de español que tiene integrado Wolfram Language.
Una solución sería hacer una lista, por ejemplo, de las 2000 palabras más usadas en español (listadas por ejemplo en
http://corpus.rae.es/lfrecuencias.html) y tirar de ellas.
Bien, hasta aquí lo que está hecho. Ahora lo que tengo hecho a medias.
A priori no me pareció muy difícil generar una IA que hiciera de jefe de cada grupo de espías, dándonos las claves que nos lleven a identificar las palabras de nuestros espías y así hacer el juego on-line.
Esto resulta relaivamente fácil si el idioma fuera el inglés porque Wolfram Language tiene implementadas muchas funciones sobre palabras inglesas.
(Para empezar, cuando genera palabras al azar, puedes limitarlas a que sean solo nombres y de tipo común o bien conocidas)
La manera de proceder sería la siguiente:
Haciendo uso de la función WordData y metiendo cada una de las 25 palabras generadas inicialmente se pueden crear listas de palabras equivalentes ("synonism"), palabras más generales ("NarrowerTerms") o más específicas ("BroaderTerms") de cada una de ellas.
Esas palabras son las que puede usar la IA para darnos las pistas automáticamente.
Sorry but you are not allowed to view spoiler contents.
Además se pueden ver qué palabras relacionadas se repiten para cada una de las 25 palabras generadas y así dar el número de espías que puedes destapar con esa palabra clave (además puedes evitar usar palabras que puedan llevar a destapar un espía del equipo contrario)
Y poco más... salvo que todo esto solo parece poder usarse en el entorno de Wolfram Language y no soy muy partidario de los entornos cerrados.
Ahora bien, para hacerlo en español deberíamos poder contar con un diccionario que genere terminos relacionados con cada palabra y hacer lo mismo que para el inglés. Aquí las posibilidades se disparan más allá de mi tiempo actual. Preguntando en Twitter (gracias a @ruescasd)he llegado a:
TesauroOntologíaTaxonomíaNo sé muy bien las diferencias pero cada uno de esos diccionarios proporciona palabras relacionadas con una dada.
Así que, habría que buscar una versión online accesible e importar el diccionario a Wolfram Language.
Por último queda la historia de producir de todo esto una página web para poder jugar e ir interactuando con las respuestas de los jugadores.
Bueno, pues aquí lo dejo. Espero que sea de utilidad y que si alguien puede aportar cómo resolver todo o parte de lo que queda, se lo agradeceré porque así aprenderé un montón.