:- use_module('ia - version 3.0.pl').
:- use_module(library(lambda)).
:- use_module(library(clpfd)).
:- dynamic proposition/1.
:- dynamic coups/1.
dialog('Mastermind XPCE',
[ object :=
Client_d,
parts :=
[ Client_d := dialog('Client de mastermind'),
GroupBox := dialog_group(paramètres, box),
Longueur_item := int_item(longueur),
Lettres_item := int_item(lettres),
Doubles_item := menu(doubles),
Affiche := label(affiche),
Combinaison := text_item(combinaison),
Button5 := button(ok),
Proposition := text_item('proposition '),
BP_item := int_item('bien placées'),
MP_item := int_item('mal placées'),
Liste := browser(resultats),
Button2 := button('Recommence'),
Button3 := button('Terminé'),
Button4 := button('Envoi')
],
modifications :=
[ GroupBox := [radius := 25,
label_font := font(times, bold, 14)],
Affiche := [font := font(times, bold, 14)],
Combinaison := [value_font := font(times, bold, 15)],
Proposition := [value_font := font(times, bold, 15)],
Longueur_item := [selection := 5,
range := [low := 3, high := 26]],
Lettres_item := [selection := 8,
range := [low := 3, high := 26]],
Doubles_item := [append := [non,oui]]
],
layout :=
[ area(GroupBox,
area(5, 10, 470, 150)),
area(Longueur_item,
area(15, 40, 120, 60)),
area(Lettres_item,
area(150, 40, 100, 60)),
area(Doubles_item,
area(280, 40, 100, 60)),
area(Affiche,
area(15, 80, 300, 25)),
area(Combinaison,
area(15, 115, 300, 25)),
area(Button5,
area(350, 120, 80, 24)),
area(Proposition,
area(15, 180, 300, 25)),
area(BP_item,
area(15, 230, 150, 60)),
area(MP_item,
area(190, 230, 150, 60)),
area(Button2,
area(500, 16, 80, 24)),
area(Button3,
area(500, 62, 80, 24)),
area(Button4,
area(350, 190, 80, 24)),
area(Liste,
area(15, 270, 450, 200))
],
behaviour :=
[
Button2 := [message := message(@prolog, recommence,
Combinaison, Proposition, BP_item, MP_item, Liste)],
Button3 := [message := message(Client_d, destroy)],
Button4 := [message := message(@prolog, joue, Proposition, BP_item, MP_item, Liste)],
Button5 := [message := message(@prolog, test_combinaison,
Combinaison, Proposition, BP_item, MP_item)],
Longueur_item := [message := message(@prolog, affiche_parametres,
Longueur_item?selection,
Lettres_item?selection,
Doubles_item?selection,
Affiche,
Combinaison,
Liste,
BP_item,
MP_item)
],
Lettres_item := [message := message(@prolog, affiche_parametres,
Longueur_item?selection,
Lettres_item?selection,
Doubles_item?selection,
Affiche,
Combinaison,
Liste,
BP_item,
MP_item
)
],
Doubles_item := [message := message(@prolog, affiche_parametres,
Longueur_item?selection,
Lettres_item?selection,
Doubles_item?selection,
Affiche,
Combinaison,
Liste,
BP_item,
MP_item)
]
],
initialise :=
[
Longueur_item := message(Longueur_item, execute)
]
]).
xpce_test_IA :-
make_dialog(D, 'Mastermind XPCE'),
get(D, member, browser, Liste),
get(Liste, list_browser, LB),
send(LB, font, font(screen, bold, 15)),
get(@display, size, S),
send(D,open_centered, point(S?width/2, S?height/2)).
affiche_parametres(Longueur, Lettres, Doubles, Affiche, Combinaison, Liste, BP_item, MP_item) :-
retractall('ia.pl':guess(_,_)),
retractall('ia.pl':parametres(_,_,_)),
assert('ia.pl':parametres(Longueur, Lettres, Doubles)),
Max is 0'a +Lettres - 1,
atom_codes(A, [Max]),
( Doubles = non
-> sformat(Str, 'La combinaison est composée de ~w lettres de a à ~w, sans doublons.',
[Longueur, A])
; sformat(Str, 'La combinaison est composée de ~w lettres de a à ~w, avec doublons.',
[Longueur, A])),
send(BP_item, range, low := 0, high := Longueur),
send(MP_item, range, low := 0, high := Longueur),
send(BP_item, selection, 0),
send(MP_item, selection, 0),
send(Combinaison, clear),
send(Liste, clear),
send(Affiche, selection, Str).
lance_IA(Proposition, BP_item, MP_item) :-
bulls_and_cows(Suggestion),
retractall(proposition(_)),
assert(proposition(Suggestion)),
maplist(\X^Y^(Y is X+97), Suggestion, Ms),
atom_codes(Guess, Ms),
send(Proposition, selection, Guess),
send(BP_item, selection, 0),
send(MP_item, selection, 0).
joue(Proposition, BP_item, MP_item, Liste) :-
get(Proposition, selection, Combi),
retract(proposition(Suggestion)),
get(BP_item, selection, BP),
get(MP_item, selection, MP),
retract(coups(Coups)),
Coups1 is Coups + 1,
assert(coups(Coups1)),
sformat(A, '~w : ~w Bulls ~w Cows ~w', [Coups1, Combi, BP, MP]),
send(Liste, append, A),
assert('ia.pl':guess(Suggestion, [BP, MP])),
length(Suggestion, Len),
(BP = Len
-> bravo
;
lance_IA(Proposition, BP_item, MP_item)).
test_combinaison(Combinaison, Proposition, BP_item, MP_item) :-
retractall(coups(_)),
assert(coups(0)),
get(Combinaison, selection, Combi),
(bonne_combinaison(Combi)
-> lance_IA(Proposition, BP_item, MP_item)
; send(@display, inform, 'La combinaison proposée est incorrecte'),
send(Combinaison, clear)
).
bonne_combinaison(Combinaison) :-
'ia.pl':parametres(Longueur, Lettres, Doubles),
atom_codes(Combinaison,Ms),
length(Ms, Longueur),
maplist(\X^(X >= 0'a, X < Lettres + 0'a), Ms),
(Doubles = non -> all_distinct(Ms); true).
recommence(Combinaison, Proposition, BP_item, MP_item, Liste) :-
retractall('ia.pl':guess(_,_)),
send(Combinaison, clear),
send(Proposition, clear),
send(BP_item, selection, 0),
send(MP_item, selection, 0),
send(Liste, clear).
bravo :-
new(D, dialog('Mastermind')),
new(L, label(name,'J''ai trouvé !!!')),
send(L, size, size(100, 40)),
send(L, font, font(times, bold, 75)),
send(L, label_format, center),
send(D, append, L),
new(L1, label(name1, image('happy.bm'))),
send(D, append, L1, right),
new(B, button(ok, message(D, destroy))),
send(B, font, font(times, normal, 20)),
send(D, append, B),
get(@display, size, S),
send(D, open_centered, point(S?width/2, S?height/2)).