Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Языки программирования > Prolog
Перезагрузить страницу Крестики-нолики (пять в ряд)
Ответ
 
Опции темы Опции просмотра
  (#16 (permalink)) Старый
arlat arlat вне форума
Member
 
Аватар для arlat
 
Сообщений: 399
Сказал(а) спасибо: 21
Поблагодарили 17 раз(а) в 16 сообщениях
Регистрация: 18.12.2009
Адрес: Минск
По умолчанию 26.03.2020, 18:16

Цитата:
Сообщение от SergeMukhin78 Посмотреть сообщение
...
Цитата:
Сообщение от Винитарх Посмотреть сообщение
...
Вот сейчас можно предметно изучать глюки в обработке событий, тем более они накапливаются.

1) двойной клик
Почему он срабатывает как одиночный клик?
2) обработка нажатия кнопок
После выполнения обработки для кнопок [|<] и [>|] идет зависание.
Далее после любого события (даже просто клик вне окна приложения) идет повторная сработка события, потом все "отвисает" и работает дальше нормально.
Там есть рекурсия, но рекурсия при обработке события есть и в других местах, например предикат play_loop...

Т.е. что-то не так, очень возможно у меня


не пиши длинный предикат
Ответить с цитированием
  (#17 (permalink)) Старый
Винитарх Винитарх вне форума
Специалист
 
Аватар для Винитарх
 
Сообщений: 8,074
Сказал(а) спасибо: 3
Поблагодарили 329 раз(а) в 328 сообщениях
Регистрация: 01.03.2003
Адрес: Краснодар
По умолчанию 27.03.2020, 13:50

Я запустил Вашу программу. Она играет очень хорошо по сравнению со мной. Правда я первый раз в жизни играл в эту игру. Ни разу не выиграл. Пробовал раз 10.
Ответы:
1) Двойной щелчок включает в себя и одиночный щелчок. Последовательность событий (мыши и др.) чётко определена виндой:
https://docs.microsoft.com/ru-ru/dot...-windows-forms
2) Надо смотреть Ваш исходник. Это попозже.
Ответить с цитированием
  (#18 (permalink)) Старый
Винитарх Винитарх вне форума
Специалист
 
Аватар для Винитарх
 
Сообщений: 8,074
Сказал(а) спасибо: 3
Поблагодарили 329 раз(а) в 328 сообщениях
Регистрация: 01.03.2003
Адрес: Краснодар
По умолчанию 27.03.2020, 16:20

Цитата:
Сообщение от arlat Посмотреть сообщение
2) обработка нажатия кнопок
После выполнения обработки для кнопок [|<] и [>|] идет зависание.
Далее после любого события (даже просто клик вне окна приложения) идет повторная сработка события, потом все "отвисает" и работает дальше нормально.
Там есть рекурсия, но рекурсия при обработке события есть и в других местах, например предикат play_loop...
Вот здесь зарыта собака красного цвета:

turn_home(Ms) :-
moveInProcess = 1,
turn_back(Ms),
_IsSuccessful = vpi::processEvents(),
!,
turn_home(Ms).
turn_home(_).

turn_back(Ms) :-
xo_step_once(_Mark, _Step, Coor),
Coor = coor(I, J),
draw_cell(I, J, cell_back, 1),
programControl::sleep(Ms),
draw_cell(I, J, cell_space, 1),
xo_back(),
draw_cell(I, J, cell_back, 1),
programControl::sleep(Ms),
draw_cell(I, J, cell_space, 1),
move_set_state(),
!.

Вся беда из-за двух используемых предикатов. Вы используете programControl::sleep(Ms) и одновременно с этим зачем-то пользуетесь vpi::processEvents(). Любая анимация делается по таймеру. Запрограммируйте таймер, например на пол секунды, и по каждому тику таймера выполняйте один раз turn_back(). При этом, если нажаты другие интерфейсные кнопки на форме, то они должны отключить таймер, что приведёт к прекращению отката ходов игры назад. Время между тиками таймера можно менять, это аналог Вашего параметра Ms.

Резюме: избавляйтесь от красного цвета, а все "длительные" операции выполняйте по таймеру.
Ответить с цитированием
  (#19 (permalink)) Старый
arlat arlat вне форума
Member
 
Аватар для arlat
 
Сообщений: 399
Сказал(а) спасибо: 21
Поблагодарили 17 раз(а) в 16 сообщениях
Регистрация: 18.12.2009
Адрес: Минск
По умолчанию 27.03.2020, 17:12

Цитата:
Сообщение от Винитарх Посмотреть сообщение
Двойной щелчок включает в себя и одиночный щелчок. Последовательность событий (мыши и др.) чётко определена виндой
Это все известно, и, если бы была возможность нормально обработать очередь событий, то я бы уж как-нибудь выкрутил этот момент...
пытался уже
обидно, это же все-таки среда как-бы более высокого уровня, сказано двойной клик, значит двойной...


не пиши длинный предикат
Ответить с цитированием
  (#20 (permalink)) Старый
arlat arlat вне форума
Member
 
Аватар для arlat
 
Сообщений: 399
Сказал(а) спасибо: 21
Поблагодарили 17 раз(а) в 16 сообщениях
Регистрация: 18.12.2009
Адрес: Минск
По умолчанию 27.03.2020, 17:23

Цитата:
Сообщение от Винитарх Посмотреть сообщение
Вся беда из-за двух используемых предикатов. Вы используете programControl::sleep(Ms) и одновременно с этим зачем-то пользуетесь vpi::processEvents().
но вот здесь это не мешает
Visual Prolog Код:
play_loop() :-
    xo_cell_exists(),
    not( play_end(0) ),
    play_check(comp_play, Mark),
    play_auto(Mark),
    play_end(1),
    !.
play_loop() :-
    xo_cell_exists(),
    not( play_end(0) ),
    play_check(comp_play, _Mark),
    _IsSuccessful = vpi::processEvents(),
    !,
    play_loop().
play_loop().

play_auto(Mark) :-
    tuple(Mark, Mode) in [tuple(o, normal), tuple(x, echo)],
    xo_play_once(Mode, PlayCell, _RuleName, _Rule),
    xo_mark_cell(Mode, PlayCell),
    xo_forth_clear(),
    move_set_state(),
    PlayCell = cell(coor(I, J), _),
    draw_cell(I, J, cell_flash, 1),
    programControl::sleep(250),
    draw_cell(I, J, cell_space, 1),
    !.
можно поставить игру Компьютер-Компьютер и все нормально крутиться, и анимация, и на ходу отрабатывают прочие функции типа смены уровня, ход назад (не home, просто back), подсветка последнего хода, везде анимация, отрабатывает и дальше крутиться на авто, а то и на ходу если изменили одну из отметок на Человек, то останавливается как надо, без каких либо "висов"...


не пиши длинный предикат
Ответить с цитированием
Ads.
  (#21 (permalink)) Старый
arlat arlat вне форума
Member
 
Аватар для arlat
 
Сообщений: 399
Сказал(а) спасибо: 21
Поблагодарили 17 раз(а) в 16 сообщениях
Регистрация: 18.12.2009
Адрес: Минск
По умолчанию 27.03.2020, 17:27

Цитата:
Сообщение от Винитарх Посмотреть сообщение
и одновременно с этим зачем-то пользуетесь vpi::processEvents()
я бы так не формулировал, использую как надо, на рекурсии отдаю управление, там если надоело смотреть можно кликнуть в незначимую область формы и процесс останавливается, так же как для play_loop, смотрим play_check, и если уже не авто, то все нормально останавливается.


не пиши длинный предикат
Ответить с цитированием
  (#22 (permalink)) Старый
arlat arlat вне форума
Member
 
Аватар для arlat
 
Сообщений: 399
Сказал(а) спасибо: 21
Поблагодарили 17 раз(а) в 16 сообщениях
Регистрация: 18.12.2009
Адрес: Минск
По умолчанию 27.03.2020, 17:31

Цитата:
Сообщение от Винитарх Посмотреть сообщение
Вся беда из-за двух используемых предикатов. Вы используете programControl::sleep(Ms) и одновременно с этим зачем-то пользуетесь vpi::processEvents(). Любая анимация делается по таймеру.
очень стремные какие-то утверждения, зачем мне лишние навороты на таймер, и еще может не на один в таком случае


не пиши длинный предикат
Ответить с цитированием
  (#23 (permalink)) Старый
arlat arlat вне форума
Member
 
Аватар для arlat
 
Сообщений: 399
Сказал(а) спасибо: 21
Поблагодарили 17 раз(а) в 16 сообщениях
Регистрация: 18.12.2009
Адрес: Минск
По умолчанию 27.03.2020, 18:24

Цитата:
Сообщение от Винитарх Посмотреть сообщение
Вот здесь зарыта собака красного цвета
Или sleep или processEvents отключаю, все нормально, только совместно дают этот "эффект"


не пиши длинный предикат
Ответить с цитированием
  (#24 (permalink)) Старый
Винитарх Винитарх вне форума
Специалист
 
Аватар для Винитарх
 
Сообщений: 8,074
Сказал(а) спасибо: 3
Поблагодарили 329 раз(а) в 328 сообщениях
Регистрация: 01.03.2003
Адрес: Краснодар
По умолчанию 27.03.2020, 18:30

Мне кажется, что с таймером было-бы проще.
Хотя, дело хозяйское.
Но причину "зависания" кроме как в vpi::processEvents я не вижу. Там вроде бы вовсе нечему "виснуть".
Ответить с цитированием
Ads
  (#25 (permalink)) Старый
arlat arlat вне форума
Member
 
Аватар для arlat
 
Сообщений: 399
Сказал(а) спасибо: 21
Поблагодарили 17 раз(а) в 16 сообщениях
Регистрация: 18.12.2009
Адрес: Минск
По умолчанию 27.03.2020, 18:56

ну вот, после обсуждения - заработало
похоже ViP рекурсию в отдельный поток запускает, может именно хвостовую, или что-то в этом роде, и что-то там конфликтует, короче, где есть отрисовки (sleep) надо откатывать и входить в рекурсию на другой альтернативе...
Visual Prolog Код:
turn_home(Ms) :-
    moveInProcess = 1,
    turn_back(Ms),
    fail.
turn_home(Ms) :-
    moveInProcess = 1,
    _IsSuccessful = vpi::processEvents(),
    !,
    turn_home(Ms).
turn_home(_).

turn_back(Ms) :-
    xo_step_once(_Mark, _Step, Coor),
    Coor = coor(I, J),
    draw_cell(I, J, cell_back, 1),
    programControl::sleep(Ms),
    draw_cell(I, J, cell_space, 1),
    xo_back(),
    draw_cell(I, J, cell_back, 1),
    programControl::sleep(Ms),
    draw_cell(I, J, cell_space, 1),
    move_set_state(),
    !.
сейчас все правильно, даже на одном home спокойно запускается еще один...


не пиши длинный предикат

Последний раз редактировалось arlat; 27.03.2020 в 19:02
Ответить с цитированием
  (#26 (permalink)) Старый
arlat arlat вне форума
Member
 
Аватар для arlat
 
Сообщений: 399
Сказал(а) спасибо: 21
Поблагодарили 17 раз(а) в 16 сообщениях
Регистрация: 18.12.2009
Адрес: Минск
По умолчанию 27.03.2020, 19:27

Цитата:
Сообщение от Винитарх Посмотреть сообщение
Мне кажется, что с таймером было-бы проще.
проще не знаю, а попробовать потом попробую, а вот обработка двойной клик без одиночного пока огорчает...


не пиши длинный предикат
Ответить с цитированием
  (#27 (permalink)) Старый
Винитарх Винитарх вне форума
Специалист
 
Аватар для Винитарх
 
Сообщений: 8,074
Сказал(а) спасибо: 3
Поблагодарили 329 раз(а) в 328 сообщениях
Регистрация: 01.03.2003
Адрес: Краснодар
По умолчанию 27.03.2020, 19:39

Кстати, а по чему конкретно двойной щелчок? По форме или по какому-нить контролу? И по какому?
От ответа на этот вопрос зависит последовательность событий и наш совет
Ответить с цитированием
  (#28 (permalink)) Старый
SergeMukhin78 SergeMukhin78 вне форума
Member
 
Сообщений: 659
Сказал(а) спасибо: 17
Поблагодарили 53 раз(а) в 53 сообщениях
Регистрация: 28.03.2012
По умолчанию 27.03.2020, 22:33

Цитата:
Сообщение от arlat Посмотреть сообщение
похоже ViP рекурсию в отдельный поток запускает
как это? и что здесь поток? если thread (не stream), то мы не его запускаем, надо явно запускать.
Ответить с цитированием
  (#29 (permalink)) Старый
arlat arlat вне форума
Member
 
Аватар для arlat
 
Сообщений: 399
Сказал(а) спасибо: 21
Поблагодарили 17 раз(а) в 16 сообщениях
Регистрация: 18.12.2009
Адрес: Минск
По умолчанию 29.03.2020, 10:01

Цитата:
Сообщение от SergeMukhin78 Посмотреть сообщение
если thread (не stream), то мы не его запускаем
Да это так, предположение, thread имелось ввиду.
А в чем же все-таки тогда была проблема?
Вы может и не запускаете, может особенности винды?
Собственно, если нашлось решение, то мне без разницы
А вот с двойным кликом - засада


не пиши длинный предикат
Ответить с цитированием
  (#30 (permalink)) Старый
SergeMukhin78 SergeMukhin78 вне форума
Member
 
Сообщений: 659
Сказал(а) спасибо: 17
Поблагодарили 53 раз(а) в 53 сообщениях
Регистрация: 28.03.2012
По умолчанию 29.03.2020, 10:19

Цитата:
Сообщение от arlat Посмотреть сообщение
А в чем же все-таки тогда была проблема?
Вы может и не запускаете, может особенности винды?
Видимо это проблемы GUI. А я в них особо не разбираюсь :(

Windows запускает кучу своих thread в наших приложениях, но они никак себя не проявляют и можно забыть об этом.
Ответить с цитированием
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Игра крестики нолики YOtaMix Haskell 6 04.05.2015 22:40
Крестики нолики на 2 игрока akord Prolog 1 31.05.2011 02:12
Крестики-нолики от Alison shape Prolog 13 16.02.2011 15:28
крестики-Нолики собственно((( mgadan Форум программистов 0 23.01.2009 17:28
КРЕСТИКИ-НОЛИКИ imported_Lis Prolog 22 26.11.2008 19:44
Крестики-нолики в Perl Ksenia88 Perl 0 12.03.2007 00:11
Срочно! Крестики нолики. RahXephon Pascal 9 29.05.2006 00:27
и опять крестики-нолики Malah Prolog 1 07.01.2006 22:24
Крестики-нолики на Prolog Nancy_Dildo Prolog 3 22.05.2005 18:09
Библиотечные крестики нолики KachoK Игры разума 51 02.03.2005 01:28
Крестики-нолики MuffinMan Prolog 0 01.01.2005 23:53
Крестики - нолики пять в ряд как реализовать Ve-Ve Алгоритмы 9 02.01.2004 23:53



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов