Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Сб апр 20, 2024 01:09

...
Google Search
Forth-FAQ Spy Grafic

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 7 ] 
Автор Сообщение
 Заголовок сообщения: ТЗ *Игра «Стекеры»
СообщениеДобавлено: Пт май 11, 2007 05:51 
Не в сети
Аватара пользователя

Зарегистрирован: Вс май 07, 2006 11:38
Сообщения: 279
Откуда: Slavyansk, Ukraine
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Проект технического задания
*Игра «Стекеры»
Задача: написать модуль-«рефери» для игры двух форт-программ «роботов»

Правила игры:
Перед началом игры к модулю-«рефери» «вручную» по INCLUDE или REQUIRE подключаются две программы-игрока («бойцы»).
Инициализируя игру модуль-«рефери» кладет на стек и стек возвратов по пять чисел:
Стек возвратов:
Код:
0
1
1
1
1
вершина стека

Стек:
Код:
вершина стека
1
1
1
1
0

Затем программы-«бойцы» делают по очереди ходы, перенося по одному числу или со стека на стек возвратов или наоборот (>R или R>). Проигравшим считается «боец», допустивший исчерпание любого из стеков. За момент исчерпание стека модуль-«рефери» принимает ход «бойца» при котором на вершине стека оказывается «0».
Ограничения: «боец» может сделать подряд не более трех ходов >R и не более трех ходов R> За превышение предельно допустимого числа одинаковых ходов совершившему этот неспортивный поступок «бойцу» засчитывается техническое поражение с дисквалификацией – отстранение от всех дальнейших боев.
Обратная связь: через каждые 5 ходов модуль-«рефери» сообщает «бойцам» состояния обоих стеков.
Замечание: Для выполения хода «бойцом» рекомендуется не передавать «рефери» непосредственно слова R> и >R, а их логические эквиваленты (например 0/1)
Интерфейс: не критично.

PS Идея игры родилась сегодня ночью на IRC-чате, поэтому количество чисел на стеках, число одинаковых ходов и количество ходов после которых игроку сообщается состояние стека допустимо изменять – цифры выбраны интуитивно.

_________________
Банзай!


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пт май 11, 2007 12:13 
Не в сети

Зарегистрирован: Ср май 03, 2006 11:27
Сообщения: 1394
Откуда: St.Petersburg
Благодарил (а): 2 раз.
Поблагодарили: 11 раз.
Kamikaze писал(а):
Затем программы-«бойцы» делают по очереди ходы, перенося по одному числу или со стека на стек возвратов или наоборот (>R или R>). Проигравшим считается «боец», допустивший исчерпание любого из стеков.


Если только (>R или R>), то игровое поле можно заменить числом а действие над ним (+1 -1).
При этом, задача сводится к угадывания ходов противника.
По моему, игровым полем лучше сделать двумерным массив данных.
И как будет поддерживаться работа программ-«бойцов»?
Как я понимаю для их работы требуется как минимум процесс со своими стеками и
юзеровскими переменными. Если это просто процесс, то должно быть ограничение
на использование функций. Набор допустимых функций и определит правило игры.
Иначе, можно использовать виртуальную машину, в рамках которой программа-«боец»
может делать что хочет, но воздействовать на игровое поле может только по средствам
жесткого интерфейса.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пт май 11, 2007 12:33 
Не в сети

Зарегистрирован: Сб май 06, 2006 12:01
Сообщения: 959
Откуда: Украина, Харьков
Благодарил (а): 2 раз.
Поблагодарили: 7 раз.
Kamikaze писал(а):
или REQUIRE

на ирсе говорил, почему не подойдет - оно проверяет наличие "ключевого" слова и если слово не определено, то загружает либу.
Если программы-боты одинаковы, они должны определять какое-то одно(одинаковое) главное слово.
После загрузки первого бота на это слово нужно сделать алиас, а уже потом загружать второго бота.
Использование REQUIRE не будет загружать программу второго - "ключевое" слово-то уже определено! ;)
Поэтому, для принудительной загрузки - INCLUDE(D)!
Kamikaze писал(а):
кладет на стек и стек возвратов по пять чисел

а лучше 2 случайных числа в интервале... задаваемом параметром рефери
Kamikaze писал(а):
подряд не более трех ходов >R и не более трех ходов R>

не более трех одинаковых ходов... ;)
Kamikaze писал(а):
За превышение предельно допустимого числа одинаковых ходов совершившему этот неспортивный поступок «бойцу» засчитывается техническое поражение с дисквалификацией – отстранение от всех дальнейших боев.
Живем в реальном мире - просто проигрыш! :)
Kamikaze писал(а):
Обратная связь: через каждые 5 ходов модуль-«рефери» сообщает «бойцам» состояния обоих стеков.
достаточно размера одного из стеков, числа-то никуда не исчезают... ;)
насчет кол-ва ходов - я бы делал через каждый. В крайнем случае - через один... ;)
тогда не будет "тривиальной ничьей" - компенсации ходов противника...
И лучше ограничить максимальное число ходов, а то работать игра может доооолго... ;)

А еще можно более 2х игроков... ;)

_________________
With best wishes, in4.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пт май 11, 2007 13:42 
(я уже не знаю что мне и куда (кого?) посылать чтобы привести решение к задаче про "рефери", поэтому это решение напишу здесь. А дальше сами разбиретёсь куда это всё и как. Моё дело -- послать.)

(вообще по-моему последние сообщения -- не в тему. В том смысле что выделять их надо отсюда)

Анализ задачи:

Понятно, что "обычный стек", "R-стек" из постановки задачи -- не более чем метафоры. Использовать R-стек на самом деле, думаю нет острой необходимости.

На самом деле нет необходимости не только в двух стеках, но даже и в одном стеке. По сути, всё "состояние игры" описывается одним числом -- от нуля до десяти. Поражения засчитывается тому у кого число-состояние станет равно нулю или десяти. В таком представлении это уместнее называть "перетягиванием каната", только если команда повалится назад, она тоже проигрывает.

Далее рисуем схемку взаимодействия -- это будет эдакий треугольник. Нужно однозначно определить взаимодействие:
1. От бойца к рефери поступают сигналы -- ходы.
2. От рефери к бойцу с периодичностью поступает информация об игре.

Оба вида делаем словами в модулях бойцов:
Код:
move ( -- flag )

Боец делает "ход", это слово вызывается из тела рефери, затем он (рефери) по результатам изменяет состояние игры, делает проверки на поражение, и так далее..
Код:
board ( state -- )

Рефери вызывает это слово, чтобы уведомить бойца об обстановке. Боец, у себя, анализирует состояние игры и соответствующим образом подправляет свои внутренние структуры данных (при их наличии), чтобы привести их в актуальному виду, готовясь при следующем вызове move дать более правильный по обстановке "ход".

Само собой, что для тестирования "рефери" нужно писать и "бойцов" тоже. Но так как это сейчас лишь побочная задача и никак не прописывается, делаем их насколько возможно тупыми -- по move будет выдаваться псевдослучайное логическое значение, board ничего делать не будет (кроме поглощения значения со стека, само собой).

Я начал писать и достаточно быстро что-то написал. Но код мне резко не понравился. И тут меня осенил свет -- я вдруг понял что ООП тут более чем красиво сделает. Сказано -- сделано. Сел, переписал с объектами.

Это, кстати была первая программа моя с ООП на Форте. Вообще. Тут я не полностью уверен кто это так хорош оказался: я, или ООП, или движок ООП, но программа заработала с пол-пинка, с первого запуска.

На радостях от моего "просветления" и полпинковой послушности программы я даже и отладки не делал особой.

Так как религия и прочие тараканы в головах (не мои) не велят мне дать спокойно архив с тремя файлами, я даю вам возможность поработать мышкой самому, вставляя и копируя содержимое и имена трёх файлов:

Сам рефери:
"referee2.f"
Код:
REQUIRE KEEP ~profit/lib/bac4th.f
REQUIRE NOT ~profit/lib/logic.f
REQUIRE FOR ~profit/lib/for-next.f
REQUIRE CLASS: ~day/joop/oop.f

: in-the-red-corner   S" joe louis.f" ;
: in-the-blue-corner  S" mike tyson.f" ;

VARIABLE game
: change-game ( move -- )  IF game 1+! ELSE -1 game +! THEN ;
: lost? ( -- lost? )  5 game @ - ABS 5 =  ; \ или =0 или =10

VARIABLE moves-made
: send-updates? ( -- send? ) moves-made DUP 1+! @ 5 MOD 0= ;
: show-game ( -- ) CR ." [" game @ FOR ." ." NEXT ." |" 10 game @ - FOR ." ." NEXT ." ]" ;

CLASS: fighter <SUPER Object

2 CELLS VAR name
CELL    VAR lastMove
CELL    VAR predMove

CELL    VAR move-xt
CELL    VAR board-xt

: :move   move-xt  @ EXECUTE ;
: :board  board-xt @ EXECUTE ;

: :init 123 lastMove !  123 predMove ! ;
: :free name @ FREE THROW ;

: :set ( addr u -- ) \ закачка методов из файла
WARNING KEEP WARNING 0!
2DUP HEAP-COPY OVER name 2! \ имя сохраняем
INCLUDED
S" move"  SFIND IF move-xt !  ELSE 2DROP THEN
S" board" SFIND IF board-xt ! ELSE 2DROP THEN ;

: :print ( -- )  name 2@ CR TYPE SPACE ;

: :lost ( -- ) own :print ." lost!" ;
: :dsc ( -- )  own :print ." disqualified!" ;

: :check-moves ( move -- dsc? ) lastMove @ =  lastMove @ predMove @ = AND ;
: :record-move ( move -- ) lastMove @ predMove !  lastMove ! ;

: :make-move ( -- game-over? ) own :move ( move )
own :print DUP IF ." +" ELSE ." -" THEN
DUP own :check-moves IF own :dsc DROP TRUE EXIT THEN
DUP own :record-move
change-game
lost? DUP IF own :lost THEN ;

;CLASS

<< :move
<< :board
<< :set
<< :lost
<< :make-move

fighter :new VALUE red
in-the-red-corner red :set

fighter :new VALUE blue
in-the-blue-corner blue :set

: check-game show-game send-updates? IF game @ red :board  game @ blue :board THEN ;

: let-rumble-start
moves-made 0!
5 game !
show-game

\ Судья бросает монетку, кому делать первый ход:
32 CHOOSE 15 >
IF red blue ELSE blue red THEN TO blue TO red
\ если надо меняем местами -- у красных есть право первого хода

BEGIN
red :make-move IF EXIT THEN
check-game
blue :make-move IF EXIT THEN
check-game
AGAIN ;

STARTLOG
let-rumble-start


И два простейших бота:
"joe louis.f"
Код:
REQUIRE RANDOM lib/ext/rnd.f
REQUIRE NOT ~profit/lib/logic.f

MODULE: louis

123 ->VARIABLE r2
123 ->VARIABLE r3

\ тут должны быть мозги
\ память и прочие анализы
\ но их нет.. (пока?)

EXPORT

: move ( -- flag ) 32 CHOOSE 15 >  DUP r3 @ = OVER r2 @ = AND IF NOT THEN DUP r2 @ r3 ! r2 ! ;
: board ( state -- ) DROP ;

;MODULE

\ Луис работает случайными ударами. Но обязательно следит чтобы не дисквалифицироваться.


"mike tyson.f"
Код:
REQUIRE NOT ~profit/lib/logic.f

MODULE: tyson

\ тут должны быть мозги
\ память и прочие анализы
\ но их нет.. (пока?)

VARIABLE r

r 0!

EXPORT

: move ( -- flag ) r @ NOT DUP r ! ;
: board ( state -- ) DROP ;

;MODULE

\ Тайсон работает: "качелями", правой-левой, правой-левой. Поэтому он дисквалицироваться не может по определению.


Точно так же низзя никаким образом показывать лик проро.. э-э.. работу программы. Поэтому чтобы примерно увидеть что делается в ней, вы должны её запустить (уже после того как создадите-скопируете-вставите-сохраните, и так -- три раза).

Как я говорил, глюки возможны, так как программа почти не отлаживалась. Возможно что-то вылезет при попытках написать ботов.

Хых.. Почитал in4 и понял что, может быть, нужно добавлять ещё один вид взаимодействия -- для уведомления бота о ходах противника. Впрочем может этого и не надо из-за того что тут появляется простая тактика "компенсирования".


Последний раз редактировалось profiT Пт май 11, 2007 16:43, всего редактировалось 2 раз(а).

Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пт май 11, 2007 14:25 
Не в сети
Аватара пользователя

Зарегистрирован: Вс май 07, 2006 11:38
Сообщения: 279
Откуда: Slavyansk, Ukraine
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Mihail писал(а):
...игровое поле можно заменить числом а действие над ним (+1 -1).

Нет - стек это визитная карточка форта. Реализовать на программном уровне - но проблем, можно без стека, но выглядеть это должно именно как драка за стек двух программ-роботов.
Т.е. стек необходим чтобы "пиарить" сам Forth.

О дисквалификации:
in4 писал(а):
Живем в реальном мире - просто проигрыш! :)

Нет - недосмотр это или жульничество, но это не есть недостаток робота, а вина его автора (тренера :) ), проигнорировавшего установленные правила данной задачи-игры.

in4 писал(а):
А еще можно более 2х игроков... ;)

Да!

profiT, браво!

_________________
Банзай!


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Stackers
СообщениеДобавлено: Пт май 11, 2007 15:26 
Не в сети
Аватара пользователя

Зарегистрирован: Вс май 07, 2006 11:38
Сообщения: 279
Откуда: Slavyansk, Ukraine
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Расширяем ТЗ "про игру"! Класс игр Stackers (Forth-игры со стеком):

Игра №1 *Stacker (та, что описана выше)
Код:
Удары бойцов:
1. R>
2. >R
Ограничения на количество одинаковых ударов: не более трех (т.е. { R> R> R> R> } со стороны одного из бойцов запрещено)
"Видимость" стека бойцами: через каждые 5(?) ходов


Игра №2 *Stacker2
Код:
Удары бойцов:
1. R>
2. 2R>
3. >R
4. 2>R
Ограничения на количество одинаковых ударов: отсутствует
(т.е. использование "тупой" тактики { R> >R R> >R R> >R …} ведет к проигрышу)
"Видимость" стека бойцами: всегда(?)


Игра №3 *Blocker
Код:
Удары бойцов:
1. R>
2. 2R>
3. >R
4. 2>R
5. «блок» – ход бойца, "нейтрализующий" следующий ход противника (изменение состояния стека)
Ограничения на количество одинаковых ударов:
1й вариант - на каждую серию из четырех ударов бойца разрешено использовать не более одного удара { 2R> или 2>R } и не более двух блоков
2- вариант: на каждую серию из трех ударов бойца разрешено использовать только один удар { 2R> или 2>R } или один блок
Число ударов { R> или R> } не ограничено
"Видимость" стека бойцами: всегда


PS В рамках предложенной Profit'ом метафоры БОКС, будем считать что размер стека - это некий аналог количества раундов.

_________________
Банзай!


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Сб май 12, 2007 05:44 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
выделил в отдельную тему - надеюсь никто не против 8)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 7 ] 

Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 33


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

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
phpBB сборка от FladeX // Русская поддержка phpBB