Форум: "Прочее";
Текущий архив: 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