Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2009.11.08;
Скачать: [xml.tar.bz2];

Вниз

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

 
Kerk ©   (2009-09-04 12:23) [0]

Описание:
**********************

На поле(квадратное, размер от 20х20)
случайно кидается от 2х до 10 экземпляров вирусов каждого класса(от 2х до 6 классов).
Каждый экземпляр вируса случайно получает управление.

Поучив управление, вирус может
либо ПОЙТИ* в любом из 8 направлений,
либо ПОМОЧЬ* в любом из 8 направлений.

ПОЙТИ ***
Ход вируса зависит от того, свободно ли поле куда он собирается пойти.
1. Если поле свободно, осуществляется перемещение.

2. Если поле занято чужим вирусом, происходит атака.
При этом, у чужого(атакуемого) вируса отнимается половина жизни атакующего.
И, после этого, атакующий получает ответ в виде отнимания половины оставшейся жизни у того, на кого он напал.
(пусть вирус Q с жизнью 100 атакует вирус W с жизнью 100. после атаки будет у Q 75, у W 50)
При достижении уровня жизни отметки 0, вирус умирает.

3. Если поле занято своим вирусом, происходит размножение.
При этом появляется новый экземпляр вируса того же класса, что и родители,
с жизнью = половина жизни родителя(кто инициировал рождение)
Рожденный экземпляр появляется на соседнем с родителем поле
Рождение возможно, только если на соседнем с родителем поле есть место.

ПОМОЧЬ ***
Отнимаеся жизнь у вируса (в любом случае) и передается по направлению.
Если там, куда происходит передача, стоит враг - он тоже получит помощь.
Если там, куда происходит передача, никого нет - помощь уйдет в никуда (никто не получит ее).
В любом случае жизнь у помогающего вируса отнимется.

Периодически происходит увеличение жизни всех вирусов на всем поле.

СМЫСЛ:
********************************************
Играющий пишет программу действий для своего класса вирусов, с целью остаться на поле только этому классу вирусов.
Писать надо в синтаксисе delphi.
Эта программа пока тупо подставляется между begin и end, компилится в *.dll, после чего dll грузится
и всем вирусам присваится адрес экспортной процедурки.
Интерпретатор здорово грузит из за работы со строками + могу ошибится, а тут все готово
Можно, конечно использовать всякие asm push XX бла-бла-бла pop XX end; :)
Но считать это не спортивным и предать анафеме :)
подробности:
tMyAction=procedure(MLL,N,O,S,W,NO,SO,SW,NW,NL,OL,SL,WL,NOL,SOL,SWL,NWL:integer;  var MVR,ACT,DX,DY,HLP:integer);
tSoldier=class
public
  MyAction:tMyAction;
и соответственно,
 RNDS:=random(length(Soldiers)); //случайный солдат получает управление
 if Soldiers[RNDS]<>nil then
 begin
   SetAroundForSoldier(Soldiers[RNDS]);   //пересчитываются переменные N,O,S,W,NO...

   if addr(Soldiers[RNDS].MyAction)<>Nil  //если есть программа действия, вызывается
    then Soldiers[RNDS].MyAction(

 else begin  //если нет действия у вируса-солдата, сходить рандомно
      sign1:=random;       dx:=random(2);       if sign1>0.5 then dx:=dx*(-1);
      sign2:=random;       dy:=random(2);       if sign2>0.5 then dy:=dy*(-1);
   end;

library GetAction; exports GetActionA name "GetAction";
Procedure GetActionA(MLL,N,O,S,W,NO,SO,SW,NW,NL,OL,SL,WL,NOL,SOL,SWL,NWL:integer; var MVR,ACT,DX,DY,HLP:integer);
function RND:integer;  var    sign:double;  begin    sign:=random;    result:=random(2);    if sign>0.5 then result:=result*(-1);  end;
begin
// пример-умолчание. Не подставляется вообщето, но если б подставлялся, то было б тоже самое
ACT:=0;
DX:=RND;
DY:=RND;
HLP:=0;
end;

**********************


 
Kerk ©   (2009-09-04 12:23) [1]

Правила:
**********************

Есть переменные-стороны света.
(-+. это DX и DY относительно экземпляра вируса. т.е. направлению N (на север(вверх)), соответствует .- (DX=0 DY=-1)

--   .-    +-
  NV  N  NO

-. W       O +.

  SW  S  SO
-+    .+    ++

Данные переменные =1 если там никого и 0 если кто-то есть.
И -1 если координаты плохие (край)
Те же переменные с L на конце(NL, NOL..) дают уровень жизни с той клетки,
если там свой. И 0 иначе.

Есть 4 переменные, которые надо вернуть (3 обязательно)
ACT DX DY (HLP)
ACT = 0 или 1 - Идем или помогаем
DX DY - клетка куда идем или помогаем
HLP - на скока помогаем (от нас отнимется, туда прибавится)

+ Еще одна переменная MLL. (MyLevelLife)
Это свой уровень жизни.

+ Еще одна переменная MVR. (MyVar)
Это память, своя для каждого экземпляра.
Сюда можно сохранить число, которое останется до следующего получения управления

Функция RND. Вернет случайно -1, или 0, или 1

ИТОГО, Полный список:
const
MLL,N,O,S,W,NO,SO,SW,NW,NL,OL,SL,WL,NOL,SOL,SWL,NWL:integer;

var
MVR,ACT,DX,DY,HLP:integer

+ Функция RND

**********************


 
Kerk ©   (2009-09-04 12:24) [2]

Примеры:
**********************

Данная программа по умолчанию
ACT:=0;       //  Действие. 0 - движение, 1 - помощь
DX:=RND;      //  RND функция дающая 1 или 0 или -1
DY:=RND;
HLP:=0;      // В принципе, не обязательно в данном случае
//-----------------------------------------------------------------------------

// А Eсли дополнить ее, т.е. еще дописать как ниже - получится вирус-размножитель.
// Быстро захватывает все пространство и выигрывает, если никто из других не успел ничего создать.
// Иначе, медленно но верно, проиграет.
// Смысл его прораммы - Если хоть одна ххL не =0,
// значит там свой,значит идем туда размножаться.
ACT:=0;  //сначала сделаем стандартно, чтоб если просчитаемся, хоть что-то делал
DX:=RND;
DY:=RND;
HLP:=0;
if NWL<>0 then begin DX:=-1; DY:=-1; end;
if NL<>0 then begin DX:=0; DY:=-1; end;
if NOL<>0 then begin DX:=1; DY:=-1; end;
if OL<>0 then begin DX:=1; DY:=0; end;
if SOL<>0 then begin DX:=1; DY:=1; end;
if SL<>0 then begin DX:=0; DY:=1; end;
if SWL<>0 then begin DX:=-1; DY:=+1; end;
if WL<>0 then begin DX:=-1; DY:=0; end;
//-----------------------------------------------------------------------------

// Случайный, но Исключает простой в действиях, что повышает активность.
// Уверенно выигрывает у случайного, если воюют уже сформировавшиеся коллонии.
// если воюют уже сформировавшиеся коллонии проигрывает Воину
ACT:=0;
repeat
DX:=RND;
DY:=RND;
until (DX<>0) and (DY<>0);
//-----------------------------------------------------------------------------

// А так получится вирус-воин
// Пинает всех врагов, которых видит.
ACT:=0;  //сначала сделаем стандартно, чтоб если просчитаемся, хоть что-то делал
DX:=RND;
DY:=RND;
HLP:=0;
//если там не пусто, но уровень жизни нам не говорят, значит враг. Атаковать.
if (NW=0) and (NWL=0) then begin DX:=-1; DY:=-1; end;
if (N=0) and (NL=0) then begin DX:=0; DY:=-1; end;
if (NO=0) and (NOL=0) then begin DX:=1; DY:=-1; end;
if (O=0) and (OL=0) then begin DX:=1; DY:=0; end;
if (SO=0) and (SOL=0) then begin DX:=1; DY:=1; end;
if (S=0) and (SL=0) then begin DX:=0; DY:=1; end;
if (SW=0) and (SWL=0) then begin DX:=-1; DY:=+1; end;
if (W=0) and (WL=0) then begin DX:=-1; DY:=0; end;
//-----------------------------------------------------------------------------

// Осторожный воин
ACT:=0;  //сначала сделаем стандартно, чтоб если просчитаемся, хоть что-то делал
DX:=RND;
DY:=RND;
HLP:=0;
if MLL<40 then exit; // толков пинаться, если жизни мало и вдруг убьют в ответке
//если там не пусто, но уровень жизни нам не говорят, значит враг. Атаковать.
if (NW=0) and (NWL=0) then begin DX:=-1; DY:=-1; end;
if (N=0) and (NL=0) then begin DX:=0; DY:=-1; end;
if (NO=0) and (NOL=0) then begin DX:=1; DY:=-1; end;
if (O=0) and (OL=0) then begin DX:=1; DY:=0; end;
if (SO=0) and (SOL=0) then begin DX:=1; DY:=1; end;
if (S=0) and (SL=0) then begin DX:=0; DY:=1; end;
if (SW=0) and (SWL=0) then begin DX:=-1; DY:=+1; end;
if (W=0) and (WL=0) then begin DX:=-1; DY:=0; end;
//-----------------------------------------------------------------------------

// Помощник
ACT:=0;  //сначала сделаем стандартно, чтоб если просчитаемся, хоть что-то делал
DX:=RND;
DY:=RND;
HLP:=0;
// если в округе тока свои
if (NWL<>0) and (NL<>0) and (NOL<>0) and (OL<>0) and (SOL<>0) and (SL<>0) and (SWL<>0) and (WL<>0)
then if MLL>50 then // если у самого жизни много
begin
// если у соседа жизни не под завязку, то свыше 50 скинуть ему.
if (NWL<100) then begin ACT:=1; DX:=-1; DY:=-1; HLP:=MLL-50; exit; end;
if (NL<100) then begin ACT:=1; DX:=0; DY:=-1; HLP:=MLL-50; exit; end;
if (NOL<100) then begin ACT:=1; DX:=1; DY:=-1; HLP:=MLL-50; exit; end;
if (OL<100) then begin ACT:=1; DX:=1; DY:=0; HLP:=MLL-50; exit; end;
if (SOL<100) then begin ACT:=1; DX:=1; DY:=1; HLP:=MLL-50; exit; end;
if (SL<100) then begin ACT:=1; DX:=0; DY:=1; HLP:=MLL-50; exit; end;
if (SWL<100) then begin ACT:=1; DX:=-1; DY:=+1; HLP:=MLL-50; exit; end;
if (WL<100) then begin ACT:=1; DX:=-1; DY:=0; HLP:=MLL-50; exit; end;
end;

**********************
Примеры:
================================================================================ =============

Идеи,
Поправки к правилам, реализации,
примеры программ вирусов,
критика,
- принимаются :)


 
Kerk ©   (2009-09-04 12:25) [3]

(c) Vlad Oshin, у него проблемы с доступом к сайту какие-то


 
test ©   (2009-09-04 14:00) [4]

Только это не вирусы, а роботы, старая игра для программистов, там еще какие то условия были что можно писать что нельзя.


 
Игорь Шевченко ©   (2009-09-04 14:13) [5]

Дьюдни. Core wars

http://ru.wikipedia.org/wiki/%D0%91%D0%BE%D0%B9_%D0%B2_%D0%BF%D0%B0%D0%BC%D1%8F%D1%82%D0%B8


 
@!!ex ©   (2009-09-04 14:21) [6]

Действительно Core wars. Только упрощенные.


 
БарЛог ©   (2009-09-04 14:55) [7]

Тут можно и атаку с защитой прикрутить, а потом и магию :)

Можно сделать также, чтоб сначала на поле случайным образом "сундучки" появлялись (например, +20 жизней, +1 атаки и т.п.).


 
БарЛог ©   (2009-09-04 15:02) [8]

> БарЛог ©   (04.09.09 14:55) [7]
А, забыл сказать... после этого получится HEROES III :)


 
Kerk ©   (2009-09-04 15:04) [9]

Исходники
http://code.progler.ru/view/658


 
boriskb ©   (2009-09-04 15:06) [10]

Вариации на тему войны программ "хищников" и "травоядных"
Хотя я столько и не живу, но кажется уже 100 лет назад писал :)


 
Мдфв   (2009-09-04 15:21) [11]

мда..
все уже придумано :(
Ладно, буду думать дальше :)

если ерунда будет при посте - прошу прощения,
с masterofmusic через php форму уже третий раз пытаюсь написать..


 
test ©   (2009-09-04 15:29) [12]

Кстати какой то продвинутый вариант у Вирта был.


 
Омлет   (2009-09-04 15:51) [13]

Последний раз здесь, по-моему, Сyborg устраивал робовар.
Было интересно, пока не нашли непобедимую стратегию )


 
AlexDan ©   (2009-09-04 23:28) [14]

Вопрос вообще очень интересный, по моему теория ведёт к очень известной игре (хотя это даже философия), Жизнь - http://ru.wikipedia.org/wiki/%D0%98%D0%B3%D1%80%D0%B0_%D0%B6%D0%B8%D0%B7%D0%BD%D1%8C
один из сайтов - http://elvisti.kiev.ua/skl/index.html
её мат-модель http://elvisti.kiev.ua/skl/applet3/life.html
очень немаленькая история и очень много поклонников..)


 
@!!ex ©   (2009-09-05 07:55) [15]

> [14] AlexDan ©   (04.09.09 23:28)

Ничего общего ИМХО.

P.S.
А зачем здесь ссылки на "жизнь"?
Типа здесь есть люди, которые о ней не знают??


 
test ©   (2009-09-05 08:25) [16]

@!!ex ©   (05.09.09 07:55) [15]
Все знать невозможно.


 
Anatoly Podgoretsky ©   (2009-09-05 09:23) [17]

> AlexDan  (04.09.2009 23:28:14)  [14]

По приведеному описанию,данный вариант игры ближе к Core Wars, чем к Life


 
Vlad Oshin ©   (2009-09-10 10:05) [18]

Да, хотя вырастил его из Life, она была прообразом

Но все равно, еще правила разнообразить, подрисовать получше и можно поиграть.

Только самому с собой соревноваться не интересно :)

Может сделать юзабельной, и куда то на dawnload(бесплатно, естествн) выложить?.. Пусть мне пишут на почту свои программки вирусов..
Три человека напишут - буду считать миссию выполненной :)


 
test ©   (2009-09-10 10:07) [19]

Vlad Oshin ©   (10.09.09 10:05) [18]
Ты сначала, спецификацию дай на каком языке писать, куда писать, правила для поведения ограничения.


 
Vlad Oshin ©   (2009-09-10 10:36) [20]

Если скачать из кладовки
там есть текстовый файл, как пользоваться
и примеры программок


 
Аноним   (2009-09-10 11:38) [21]

вот это было интересно
http://stanfy.com.ua/contest/


 
makvell   (2009-09-10 13:31) [22]

А мне из такой серии robocode нравится, больше возможностей :)
ЗЫ Кто там яву хотел изучать? Можно с этой игрой ;)


 
Slym ©   (2009-09-11 10:27) [23]

Есть еще вариант игры:
магнитное поле 10 на 10, каждая ячейка случайно "заряжена" + или -
"враги" тоже имеют случайный заряд, и на ходятся в противоположных углах...
Ходят одновременно, информация о поле и враге до начала хода доступна игрокам
Во время хода игроки могут сменить свой заряд или заряд соседнего поля или поля соседнего с врагом...
направление и дальность хода вычисляется суммой потенциалов соседних клеток и зарядом игрока, (за поле не вылетаем)

выигрывает тот кто дойдет первым до противоположного угла



Страницы: 1 вся ветка

Форум: "Прочее";
Текущий архив: 2009.11.08;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.53 MB
Время: 0.005 c
3-1229329218
namco
2008-12-15 11:20
2009.11.08
sql server + delphi как сделать


15-1252653672
KSergey
2009-09-11 11:21
2009.11.08
SSI+PHP


15-1252276329
KilkennyCat
2009-09-07 02:32
2009.11.08
TTreeNode с Визибле-Невизибле


2-1253875179
sergeii
2009-09-25 14:39
2009.11.08
Помогите с размерами форм


1-1223062788
FlashParty
2008-10-03 23:39
2009.11.08
Delphi 2007 — INDY 10 — Работа с Gmail





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский