Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.11.08;
Скачать: CL | DM;

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.018 c
2-1253710111
webpauk
2009-09-23 16:48
2009.11.08
Неувязка с Parent


3-1229329218
namco
2008-12-15 11:20
2009.11.08
sql server + delphi как сделать


15-1252331396
картман
2009-09-07 17:49
2009.11.08
Словоформы


15-1252299382
Andy BitOff
2009-09-07 08:56
2009.11.08
Java


8-1198161253
ZXMaster
2007-12-20 17:34
2009.11.08
chroma key DirectShow