|
|
|
Линус |
|
|||
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 8.12.2014 Репутация: нет Всего: нет |
Добрый вечер) помогите решить задачу на SWI Prolog с пояснением. Напишите программу, играющую в «крестики и нулики» на бесконечной плоскости. Заранее спасибо)
|
|||
|
||||
rrrFer |
|
|||
Бывалый Профиль Группа: Участник Сообщений: 208 Регистрация: 11.5.2008 Где: Красноярск Репутация: нет Всего: 1 |
Здравствуйте. Могу помочь, но что именно у вас не получается?
|
|||
|
||||
Линус |
|
|||
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 8.12.2014 Репутация: нет Всего: нет |
Для меня это новый язык программирования, мне в нем ничего не понятно. Помогите пожалуйста решить(((
|
|||
|
||||
rrrFer |
|
|||
Бывалый Профиль Группа: Участник Сообщений: 208 Регистрация: 11.5.2008 Где: Красноярск Репутация: нет Всего: 1 |
Как вы вообще представляете себе игру?
Ясно что юзер должен ставить крестики и нолики, каким образом он укажет в какую клетку нудно ставить? В шахматах, например, у клеток есть имена типа "e2", но у вас поле бесконечное. Вы пишите, что программа должна играть, т.е. вам ИИ нужен. Я не видел нигде нормальных алгоритмов для гомоку (бесконечных крестиков-ноликов), вы нашли хотя бы литературу по теме? Задача более чем нетривиальна, я не думаю что ее вот так просто кто-то будет решать. |
|||
|
||||
Линус |
|
|||
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 8.12.2014 Репутация: нет Всего: нет |
database
z(integer,integer,symbol) predicates predicates kartinka hod(integer,symbol,symbol) blok(symbol,symbol) chem(integer,symbol) naob(symbol,symbol) goal write("Kto hodit pervym? (1 - chelovek, 0 - kompjuter) "), readint(Igrok),write("chem? (1 - krestikami, 0 - nolikami) "), readint(N),chem(N,I1),naob(I1,I2),hod(Igrok,I1,I2),!, nl,nl; write("Pravila narusheny."),nl. clauses z(1,1,"-"). z(1,2,"-"). z(1,3,"-"). z(2,1,"-"). z(2,2,"-"). z(2,3,"-"). z(3,1,"-"). z(3,2,"-"). z(3,3,"-"). chem(1,x). chem(0,o). naob(x,o). naob(o,x). hod(0,S,_):- blok(S,S),!,kartinka,write("Kompjuter vyigral!"). hod(0,S,C):- blok(S,C),!,kartinka,hod(1,C,S). hod(0,S,C):- retract(z(2,2,"-")),!,assert(z(2,2,S)), kartinka,hod(1,C,S). hod(0,S,C):- z(R,St,"-"), (R+St) mod 2=0,retract(z(R,St,"-")),!, assert(z(R,St,S)),kartinka,hod(1,C,S). hod(0,S,C):- retract(z(R,St,"-")),!,assert(z(R,St,S)), kartinka,hod(1,C,S). hod(1,C,S):- z(_,_,"-"),write("Hodi:","ctroka (ot 1 do 3) - "), readint®,R>0,R<4,write("ctolbec (ot 1 do 3) - "), readint(St),St>0,St<4,retract(z(R,St,"-")),!, assert(z(R,St,C)),hod(0,S,C). hod(_,_,_):- not(z(_,_,"-")),nl,write("Nichja!"). blok(S,C):- z(N1,St,C),z(N2,St,C),N1<>N2, retract(z(N3,St,"-")),!,assert(z(N3,St,S)); z(R,N1,C),z(R,N2,C),N1<>N2,retract(z(R,N3,"-")),!, assert(z(R,N3,S)); z(I,I1,C),I=I1,z(J,J1,C),J=J1,I<>J,z(K,K1,"-"),K=K1, retract(z(K,K1,"-")),!,assert(z(K,K1,S)); z(I,J,C),I+J=4,z(N,K,C),N<>I,N+K=4,z(M,L,"-"),M+L=4, retract(z(M,L,"-")),!,assert(z(M,L,S)). kartinka:- z(1,1,S1),z(1,2,S2),z(1,3,S3),z(2,1,S4),z(2,2,S5), z(2,3,S6),z(3,1,S7),z(3,2,S8),z(3,3,S9),!, write("Hod kompjutera."),nl,nl, write(S1,S2,S3),nl,write(S4,S5,S6),nl,write(S7,S8,S9),nl,nl. Я нашла код....но он не работает в SWI пролог |
|||
|
||||
rrrFer |
|
||||
Бывалый Профиль Группа: Участник Сообщений: 208 Регистрация: 11.5.2008 Где: Красноярск Репутация: нет Всего: 1 |
Я могу поправить вам этот код под SWI prolog, но он не имеет отношения к вашей задаче.
У вас сказано
Но в задаче поле 3 на 3 клетки:
Вот тут задаются начальные значения клеток. Разница огромная
Этот ответ добавлен с нового Винграда - http://vingrad.com |
||||
|
|||||
Линус |
|
|||
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 8.12.2014 Репутация: нет Всего: нет |
я тогда ничего не понимаю....помогите пожалуйста решить эту задачу, а остальные я сделаю по примеру этой задачи
|
|||
|
||||
rrrFer |
|
||||||
Бывалый Профиль Группа: Участник Сообщений: 208 Регистрация: 11.5.2008 Где: Красноярск Репутация: нет Всего: 1 |
Ну а что не получается то?
Вы пробовали сами переписать на SWI Prolog? Хотя бы начните делать это, а лучше начните писать свой собственный код, т.к. то, что вы скинули писал какой-то негодяй (все запутанно специально). Предикат z тут описывает клетки поля. Предикат block выполняет ход компьютера, ну например
Он принимает вражеский символ (С) и ищет я клетки (z), в которых стоит заданный символ, такие что расположены на одной линии (St у клеток совпадает). У клеток не должна совпадать еще и вторая координата (это должны быть различные клетки) - об этом говорит N1<>N2. Если такая клетка найдена, то игрок может выиграть за один ход, т.к. ситуация примерно такая
Вот вместо собаки он поставит туда крестик. соответственно в это место надо влепить нолик.
Разберитесь так с остальным кодом и попробуйте хотя бы переписать сами. Этот ответ добавлен с нового Винграда - http://vingrad.com |
||||||
|
|||||||
Линус |
|
|||
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 8.12.2014 Репутация: нет Всего: нет |
Очень срочно нужно решить эту задачу....помогите пожалуйста, люди добрые!!!!
|
|||
|
||||
rrrFer |
|
|||
Бывалый Профиль Группа: Участник Сообщений: 208 Регистрация: 11.5.2008 Где: Красноярск Репутация: нет Всего: 1 |
Прочитайте еще раз первый ответ в этой теме ВНИМАТЕЛЬНО:
Если вы сами не понимаете что от вас требует препод, то как мы можем вам помочь? |
|||
|
||||
Фантом |
|
|||
Вы это прекратите! Профиль Группа: Участник Клуба Сообщений: 1516 Регистрация: 23.3.2008 Репутация: 6 Всего: 49 |
Судя по тому, что это задание в декабре дали человеку, который совершенно не понимает, как его делать, и за полторы недели сам не сделал ничего, то мы имеем дело со студентом, вконец задолбавшим собственных преподавателей либо идиотизмом, либо безделием (или и тем, и другим сразу), которому подсунули такое задание, чтобы он гарантированно не смог его откуда-нибудь списать, и его можно было спокойно отчислить. Мне кажется, что нам не следует мешать им в этом полезном занятии. |
|||
|
||||
Линус |
|
|||
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 8.12.2014 Репутация: нет Всего: нет |
database - db %секция для объявления предикатов базы данных
доска(SLIST) predicates %секция для объявления предикатов nondeterm линия(ilist) %здесь я не уверен, нужен ли nondeterm, но без него программа не запускается и вылазит 590 ошибка вынужденный_ход(integer) угроза(ilist,integer) пусто(integer) крестик(integer) нолик(integer) % *1 arg(slist,integer,string) clauses %секция для описания фактов и правил вынужденный_ход(К):- линия(Клетки), угроза(Клетки,К),!. линия([1,2,3]). линия([4,5,6]). линия([7,8,9]). линия([1,4,7]). линия([2,5,8]). линия([3,6,9]). линия([1,5,9]). линия([3,5,7]). угроза([X,Y,Z],X):- пусто(X), крестик(Y), крестик(Z),!. угроза([X,Y,Z],Y):- пусто(Y), крестик(X), крестик(Z),!. угроза([X,Y,Z],Z):- пусто(Z), крестик(X), крестик(Y),!. пусто(К):- retract(доска(SS)), arg(SS,К,С), assert(доска(SS)), С="-",!. % *2 крестик(К):- retract(доска(SS)), arg(SS,К,С), asserta(доска(SS)), С="X",!. % *2 нолик(К):- retract(доска(SS)), arg(SS,К,С), asserta(доска(SS)), С="O",!. % *2 arg([H|_],1,H):-!. arg([_|T],N,Y):- M = N-1, arg(T,M,Y). |
|||
|
||||
rrrFer |
|
|||
Бывалый Профиль Группа: Участник Сообщений: 208 Регистрация: 11.5.2008 Где: Красноярск Репутация: нет Всего: 1 |
Линус
Причем тут твоя задача? у тебя крестики-нолики на неограниченном поле. Это совсем другая игра и другим названием. Она насколько нетривиальна, что годах в 80х по ней чемпионаты в совке проводились. А ты все лепишь крестики-нолики 3х3. Ты нас читаешь? - там написаны конкретные вопросы.
nondeterm нужен, т.к. каждая линия - это отдельное "решение". Это сообщение отредактировал(а) rrrFer - 23.12.2014, 14:13 |
|||
|
||||
Правила форума Prolog | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Void. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Prolog | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |