:-
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
)
)
.