Форум программистов, компьютерный форум, киберфорум
Prolog
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/47: Рейтинг темы: голосов - 47, средняя оценка - 4.83
0 / 0 / 0
Регистрация: 04.06.2011
Сообщений: 4

Игра "Восемь" (пятнашки) [Visual Prolog 5.2]

04.06.2011, 18:32. Показов 9224. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
вот код.
не могу разобратся как работает.
особенно кусок текста, отмеченный красным.
помогите пожалуйста?
скоро зачет...

Prolog
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
domains
 
kletka=c(integer,integer)
list=kletka*
list1=list*
list2=integer*
 
predicates
 
state(list)
mandist(kletka,kletka,integer)
poisk(list,list1)
diff(integer,integer,integer)
goal_state(list)
select(list1,list,integer,list)
generate(list,list1,list1)
member(list,list1)
member(integer,list2)
score(kletka,kletka,integer)
totdist(list,list,integer)
seq(list,integer)
seq(list,kletka,integer)
swap(list,list,kletka,kletka)
s(list,list)
h(list,integer)
invert(list1,list1)
invert(list1,list1,list1)
writeresult(list1)
write_pos(list)
num(kletka,list,integer)
run
 
clauses
goal_state([c(2,2),c(1,3),c(2,3),c(3,3),c(3,2),c(3,1),c(2,1),c (1,1),c(1,2)]).
state([c(3,3),c(1,3),c(2,2),c(2,3),c(3,2),c(3,1),c(2,1),c (1,1),c(1,2)]).
poisk(S,R):- goal_state(S),invert(R,R1),writeresult(R1),nl.
poisk (S, R) :-
generate (S,[],R1),
select(R1,S1,1000,S),
poisk( S1, [S1|R]).
generate (S,R,RR):-
s(S,S1),
not(member(S1,R)),
generate(S,[S1|R],RR).
generate(_,R,R).
 
mandist ( c(X1,Y1), c(X2,Y2), D):-
diff(X1,Y1,DX),diff(X2,Y2,DY),
D=DX+DY.
diff(X,Y,Z):-Z=X-Y,Z>0;
Z=Y-X.
 
select([],SS,_,SS):- !.
select([S1|T],SS,N,_S):-
h(S1,H),
H<N,
select(T,SS,H,S1).
select([_|T],SS,N,S):-
select(T,SS,N,S).
 
totdist([],[],0).
totdist([S1|T],[S|T1],SS):-
totdist(T,T1,T2),
mandist(S1,S,M),SS=M+T2.
 
score(c(2,2),_,1).
score(c(1,3),c(2,3),0).
score(c(2,3),c(3,3),0).
score(c(3,2),c(3,1),0).
score(c(2,1),c(1,1),0).
score(c(1,1),c(1,2),0).
score(c(1,2),c(1,3),0).
score(_,_,2).
 
h([_E|S1],H):-goal_state([_E1|S]),
totdist(S1,S,T),
seq(S1,SS),
H=T+SS*3.
 
seq([First|Tail],S):-
seq([First|Tail],First,S).
 
seq([X,Y|Tail],First,S):-
score(X,Y,K),
seq([Y|Tail],First,S1),
S=S1+K.
seq([Lost],First,S):-
score(Lost,First,S).
[COLOR="Red"]s([Empty|Tail1],[Node|Tail2]):-
swap(Tail1,Tail2,Empty,Node).
swap([Node|Tail],[Empty|Tail],Empty,Node):-
mandist(Node,Empty,1).
swap([H|Tail1],[H|Tail2],Empty,Node):-
swap(Tail1,Tail2,Empty,Node).[/COLOR]
 
member(Name,[Name|_]).
member(Name,[_|Tail]):-member(Name,Tail).
 
write_pos(S):-
member(Y,[3,2,1]),nl,
member(X,[1,2,3]),
num(c(X,Y),S,N),
write(N," "),
fail.
write_pos(_):-nl,nl.
 
num(S,[S|_],0): - !.
num(S,[_|R],N): -
num(S,R,N1),N=N1+1.
 
writeresult([]): - !.
 
writeresult([S|R]): -
write_pos(S),writeresult(R).
 
invert(X,Y):-invert(X,[],Y).
invert([],L,L): - !.
invert([H|T1],T2,T3): -
invert(T1,[H|T2],T3).
run :- state(S),
poisk(S,[S]).
 
goal
 
run.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
04.06.2011, 18:32
Ответы с готовыми решениями:

Игра "Восемь" (пятнашки) [Visual Prolog 5.2] - Prolog
Как можно изменить входное положение чисел. Я так понял порядок записывается в state. Ибо кроме как: 1 3 0 8 2 4 7 6 5 ничего...

Игра Гранди Visual Prolog
Предложите нахождение выиграшной стратегии для игры Гранди, если есть 7 монет и первым ходит игрок MIN на прологе Игра заключается в...

Игра Пятнашки [Visual Prolog 5.2]
Доброго времени суток всем! В прологе полный 0, долго разбиралась, как можно реализовать данную игру. В итоге нашла данный код в интернете,...

5
 Аватар для emppu2007
92 / 92 / 6
Регистрация: 04.05.2011
Сообщений: 171
04.06.2011, 20:56
Во-первых, оформление можно было сделать в соответствующем стиле.
Во-вторых, надо было написать комментарии того, что уже успели разобрать.
А то получается, что процедура s использует процедуру swap, а swap использует mandist и т.д.
Т.е., по сути, вы хотите чтобы здесь вам объяснили не просто красный кусок, а всю программу.

И ещё - во многих книгах (не помню насчёт Братко, но в Сошникове (Парадигма логического программирования) точно есть) разобрана эта игра. Я бы даже сказал, разжёвана.
Как в принципе и на многих сайтах, где её исходники валяются.
1
0 / 0 / 0
Регистрация: 04.06.2011
Сообщений: 4
04.06.2011, 21:23  [ТС]
извините насчет оформления. Просто первый раз в жизни зарегился в форуме, чтобы узнать что то)
не могу никак преподу объяснить, что делает этот кусок кода.
знаю что меняет клетки местами, а вот как все это происходит???
я вообще в Prologe дуб дубом(((
как бы ему коротко и правильно объяснить???
0
0 / 0 / 0
Регистрация: 04.06.2011
Сообщений: 4
07.06.2011, 14:14  [ТС]
Prolog
1
2
3
4
5
6
7
write_pos(S):-
member(Y,[3,2,1]),nl,
member(X,[1,2,3]),
num(c(X,Y),S,N),
write(N," "),
fail.
write_pos(_):-nl,nl.
как работает этот кусок кода???
0
 Аватар для emppu2007
92 / 92 / 6
Регистрация: 04.05.2011
Сообщений: 171
07.06.2011, 16:16
Prolog
1
2
3
4
5
6
7
8
9
10
11
% S- это какой-то список, который проверяется в процедуре num
write_pos(S):-
% проверяем X,Y на принадлежность соответствующим спискам
member(Y,[3,2,1]),nl,
member(X,[1,2,3]),
% заносим в процедуру num какой-то параметр "c" с соответствующими X,Y
% Исходя из того, какое у нас "с" и входной список S, получаем какую-то чиселку N
num(c(X,Y),S,N), 
write(N," "), % пишем все его значения.
fail.
write_pos(_):-nl,nl. % При любом параметре печатаем две пустых строки.
1
0 / 0 / 0
Регистрация: 04.06.2011
Сообщений: 4
08.06.2011, 20:37  [ТС]
спасибо огромное!)
завтра пойду сдавать)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
08.06.2011, 20:37
Помогаю со студенческими работами здесь

"Игра в восемь" Prolog
Есть код для решения задачи &quot;Игра в восемь&quot; на Прологе. Объясните пожалуйста как работает программа, буду очень благодарна. Нужны просто...

Нужна любая игра с числом игроков >= 2 (Visual Prolog 5.2)
Задали расчетную работу (РГР). Выбрать любую игру с количеством игроков от 2(морской бой и т.п.). Нужно запрограммировать осмысленную...

"Пятнашки" игра на Visual Basic
Привет всем! Недавно на форуме отвечал SoftIce, где выложил пример игры &quot;Пятнашки&quot; тут:...

Игра в восемь
Помогите пожалуйста. Задача методом полного перебора. Игра в восемь. Задача состоит в том, чтобы преобразовать конфигурацию,...

Поиск в ширину. Игра в восемь
https://i.**********/ubdB1Tc.png Перевести с одного вида в другой


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru