Hi, this is a clue game in prolog.

I'm posting it to thank everyone that takes the time to post and help people, like me.

The program is spanish, cause in from México, but it's a clue game.

Features:

Write and read *.txt files, and use their content to compare data in the input stream.
Generate random variables.
"If.. then.." prolog structures

Fully functional, I recommend you to use GProlog, I haven't tetsed it in SWI-PROLOG

Hope helps somebody and if you like, you're welcome to improve it or modify it ONLY under GPL Licence 3.0 or later.

User Manual

After compiling you should write "nuevo." in the prolog interpreter to generate *txt files that contains the weapon, place and suspect of the murder.

writting "sospechosos." shows all suspects for the game, you must use their color id in order to make a clue

writting "armas." shows a weapon list for the game

writting "lugares." shows the places avaiable in the game where the murder could happen

for making an acusation you need to write: "acusar(color,weapon,place)."

ex: acusar(rojo,pistola,salon).

when you get somehing the program will tell you writting "LOGRO" otherwise it will give you a hint writting "PISTA" to find out the other clues.

IMPORTANT: DO NOT REMOVE LICENCE HEADER IT'S A GNU LICENCE VIOLATION, LICENCE HEADER IS IN SPANISH THIS IS FREE SOFTWARE YOU CAN USE IT MODIFY IT AND DISTRIBUTE UNDER GNU PUBLIC LICENCE CONDITIONS

AFTER COMMENT %Inicio del Código the prolog program begins

Regards! :)

% Culpable - Un juego de adivinanzas y asesinos en Prolog
% Copyright (C) 2011  Yahvé Erubiel López Barrera <yahve.erubiel@gmail.com>
%
% Este programa es software libre: usted puede redistribuirlo y/o modificarlo
% bajo los términos de la Licencia Pública General GNU publicada 
% por la Fundación para el Software Libre, ya sea la versión 3 
% de la Licencia, o (a su elección) cualquier versión posterior.
%
% Este programa se distribuye con la esperanza de que sea útil, pero 
% SIN GARANTÍA ALGUNA; ni siquiera la garantía implícita 
% MERCANTIL o de APTITUD PARA UN PROPÓSITO DETERMINADO. 
% Consulte los detalles de la Licencia Pública General GNU para obtener 
% una información más detallada. 

% Debería haber recibido una copia de la Licencia Pública General GNU 
% junto a este programa. 
% En caso contrario, consulte <http://www.gnu.org/licenses/>.

%Inicio del Código

%Lugares
lugar(1,biblioteca).
lugar(2,cafeteria).
lugar(3,asta).
lugar(4,sanitarios).
lugar(5,laboratorio).
lugar(6,salon).

%Pistas lugares
pista_lugar(biblioteca,1,'Lo usan profesores y alumnos').
pista_lugar(biblioteca,2,'No puedes distraer a los demás').
pista_lugar(biblioteca,3,'Si quieres aprender, ahí debes de ir').

pista_lugar(cafeteria,1,'Muchos se reunen en este lugar').
pista_lugar(cafeteria,2,'Hay mucho bullicio').
pista_lugar(cafeteria,3,'Puedes tomar asiento y descansar').

pista_lugar(asta,1,'Muchos se reunen en este lugar').
pista_lugar(asta,2,'Hay mucho bullicio').
pista_lugar(asta,3,'El sonido del agua es común').

pista_lugar(sanitarios,1,'A veces hay que esperar').
pista_lugar(sanitarios,2,'Todos acuden después de clases').
pista_lugar(sanitarios,3,'El sonido del agua es común').

pista_lugar(laboratorio,1,'En este lugar se aprende').
pista_lugar(laboratorio,2,'Hay de diferentes tipos').
pista_lugar(laboratorio,3,'Todos deben vestir igual').

pista_lugar(salon,1,'En este lugar se aprende').
pista_lugar(salon,2,'Hay de diferentes tipos').
pista_lugar(salon,3,'Conoces a muchos compañeros').

%Armas
arma(1,cuerda).
arma(2,tubo).
arma(3,cuchillo).
arma(4,llave).
arma(5,candelabro).
arma(6,pistola).

%Pistas armas
pista_arma(cuerda,1,'Sólo mortal en manos de un profesional').
pista_arma(cuerda,2,'Es rudimentaria').
pista_arma(cuerda,3,'Cuando la ves, se te hace un nudo en la garganta').

pista_arma(tubo,1,'Es muy simple').
pista_arma(tubo,2,'Es un arma metálica').
pista_arma(tubo,3,'Es alargada').

pista_arma(cuchillo,1,'Es perfecta para intimidar').
pista_arma(cuchillo,2,'Hay de muchos tipos').
pista_arma(cuchillo,3,'No puede faltar en la mesa').

pista_arma(llave,1,'Se puede llevar en la mano').
pista_arma(llave,2,'Sólo puede matar si se golpea muy fuerte').
pista_arma(llave,3,'La usan los gallegos').

pista_arma(candelabro,1,'Suele iluminar').
pista_arma(candelabro,2,'Es un arma metálica').
pista_arma(candelabro,3,'Es alargada').

pista_arma(pistola,1,'Es un arma comun entre los asaltantes').
pista_arma(pistola,2,'Es un arma metálica').
pista_arma(pistola,3,'Esta arma se porta usualmente bajo la gabardina').

%Sospechosos
sospechoso(1,'La Chilindrina',rojo).
sospechoso(2,'Don ramon',azul).
sospechoso(3,'El Chavo del 8',amarillo).
sospechoso(4,'Salinas',tricolor).
sospechoso(5,'La Tigresa',rosa).
sospechoso(6,'El Coco',blanco).

%Pistas sospechosos
pista_sospechosos(rojo,1,'Es una mujer').
pista_sospechosos(rojo,2,'Vive en una vecindad').
pista_sospechosos(rojo,3,'Pertenece al grupo de los niños').

pista_sospechosos(azul,1,'Vive en una vecindad').
pista_sospechosos(azul,2,'Es una persona mayor').
pista_sospechosos(azul,3,'Tiene bigote').

pista_sospechosos(amarillo,1,'Vive en una vecindad').
pista_sospechosos(amarillo,2,'Personaje infantil').
pista_sospechosos(amarillo,3,'Usa un sombrerito').

pista_sospechosos(tricolor,1,'Da mucho miedo').
pista_sospechosos(tricolor,2,'Tiene mucho dinero').
pista_sospechosos(tricolor,3,'Es de mente muy brillante').

pista_sospechosos(rosa,1,'Es una mujer').
pista_sospechosos(rosa,2,'Da mucho miedo').
pista_sospechosos(rosa,3,'Tiene mucho dinero').

pista_sospechosos(blanco,1,'Es un personaje ficticio').
pista_sospechosos(blanco,2,'Todos los niños lo conocen').
pista_sospechosos(blanco,3,'Personaje infantil').

%Creación del Culpable
nuevo:-random(1,6,L),random(1,6,A),random(1,6,S),sospechoso(S,_,X),lugar(L,Y),arma(A,Z),seleccionar_sospechoso(X),seleccionar_lugar(Y),seleccionar_arma(Z),nl,write('Has iniciado un nuevo juego'),nl,sospechosos,armas,lugares,instrucciones.

%Generar archivos que contienen los datos de el sospechoso,lugar y arma
seleccionar_sospechoso(X):-open('sospechoso.txt',write,Culpable),write(Culpable,(X)),nl(Culpable),close(Culpable).
seleccionar_lugar(Y):-open('lugar.txt',write,Culpable),write(Culpable,(Y)),nl(Culpable),close(Culpable).
seleccionar_arma(Z):-open('arma.txt',write,Culpable),write(Culpable,(Z)),nl(Culpable),close(Culpable).

%Acusacion
acusar(X,Y,Z):-verificar_acusacion(X,Y,Z).

%Mostar sospechosos
sospechosos:-nl,write('Presuntos culpables:'),nl,write('-La Chilindrina -  color: rojo'),nl,write('-Don Ramón color:azul'),nl,write('-El Chavo del 8 - color:amarillo'),nl,write('-Salinas - color:tricolor'),nl,write('-La Tigresa - color:rosa'),nl,write('-El Coco - color:blanco'),nl.

%Mostar armas
armas:-nl,write('Armas que se usaron:'),nl,write('-cuerda'),nl,write('-tubo'),nl,write('-cuchillo'),nl,write('-llave'),nl,write('-candelabro'),nl,write('-pistola'),nl.

%Mostar lugares
lugares:-nl,write('Lugares posibles del homicidio:'),nl,write('-biblioteca'),nl,write('-cafeteria'),nl,write('-sanitarios'),nl,write('-laboratorio'),nl,write('-salón'),nl,write('-asta'),nl.

%Instrucciones
instrucciones:-nl,write('INSTRUCCIONES'),nl,write('Formula una acusación mediante el comando: acusar'),nl,write('Usa la sintaxis: '),nl,write('acusar(color_del_culpable,arma,lugar).'),nl,write('Para volver a ver esta pantalla usa el comando: instrucciones.'),nl,write('Para volver a ver todos los sospechosos usa el comando: sospechosos.'),nl,write('Para volver a ver todas las armas usa el comando: armas.'),nl,write('Para volver a ver todos los lugares usa el comando: lugares.'),nl.

%Verificar acusaciones
verificar_acusacion(S,A,L):-open('sospechoso.txt',read,Flujo),repeat,read_atom(Flujo,X),(X==S->true, O=1;O=0),close(Flujo),open('arma.txt',read,Flujo1),repeat,read_atom(Flujo1,Y),(Y==A->true,P=1;P=0),close(Flujo1),open('lugar.txt',read,Flujo2),repeat,read_atom(Flujo2,Z),(Z==L->true,Q=1;Q=0),close(Flujo2),ganar(O,P,Q,X,Y,Z).

ganar(A,B,C,X,Y,Z):-A==1,B==1,C==1,!,nl,write('********** Has resuelto el homicidio - ¡¡Felicidades!! **********'),nl,write('Resumen:'),nl,write('SOSPECHOSO: '),sospechoso(_,Nombre,X),write(Nombre),nl,write('ARMA: '),write(Y),nl,write('LUGAR: '),write(Z),reiniciar;nl,(A==1->true,nl,write('**LOGRO: Has descubierto al asesino'),nl;write('**EL SOSPECHOSO ES INCORRECTO**'),nl,write('PISTA: La siguiente pista te ayudara a identificar al sospechoso:'),nl,random(1,3,PS),pista_sospechosos(X,PS,PistaSos),write('+ '),write(PistaSos),nl),nl,(B==1->true,nl,write('**LOGRO: Has descubierto el arma'),nl;write('**EL ARMA ES INCORRECTA**'),nl,write('PISTA: La siguiente pista te ayudara a identificar el arma:'),nl,random(1,3,PA),pista_arma(Y,PA,PistaArm),write('+ '),write(PistaArm),nl),nl,(C==1->true,nl,write('**LOGRO: Has descubierto el lugar'),nl;write('**EL LUGAR ES INCORRECTO**'),nl,write('PISTA: La siguiente pista te ayudara a identificar el lugar:'),nl,random(1,3,PL),pista_lugar(Z,PL,PistaLug),write('+ '),write(PistaLug),nl).

%Reinicar juego

reiniciar:-nl,write('Desea jugar una nueva ronda(s/n): '),read(X),(X==s->true,nuevo;terminar).

%Terminar juego

terminar:-halt.