Wyniki się skończyły, konkurs się zakończył.
Zwycięzcą jest EvilBot arshajii z 14 zwycięstwami przed Neo-Botem z 13 wygranymi oraz CentreBot i LastStand z 11 wygranymi każda.
Wyniki z ostatniego biegu
Results:
java Rifter: 9 match wins (45 total bout wins)
java EvadeBot: 10 match wins (44 total bout wins)
java EvilBot: 14 match wins (59 total bout wins)
java LastStand: 11 match wins (43 total bout wins)
java UltraBot: 9 match wins (40 total bout wins)
python ReadyAimShoot.py: 8 match wins (36 total bout wins)
./SpiralBot: 0 match wins (1 total bout wins)
python DodgingTurret.py: 8 match wins (43 total bout wins)
ruby1.9 TroubleAndStrafe.rb: 8 match wins (41 total bout wins)
./RandomBot: 1 match wins (6 total bout wins)
python StraightShooter.py: 8 match wins (41 total bout wins)
python mineminemine.py: 3 match wins (14 total bout wins)
./CamperBot: 5 match wins (20 total bout wins)
python3.3 CunningPlanBot.py: 3 match wins (15 total bout wins)
node CentreBot.js: 11 match wins (44 total bout wins)
node Neo-Bot.js: 13 match wins (59 total bout wins)
python NinjaPy.py: 3 match wins (19 total bout wins)
To wyzwanie dla króla wzgórza . Celem jest napisanie bota, który pokona więcej botów niż jakikolwiek inny.
Gra
Wszystkie boty będą stawiane naprzeciwko siebie 2 na arenie 10x10 z zadaniem zmniejszenia energii przeciwnika z 10 do 0, zanim jego własna energia zostanie zmniejszona do 0.
Każdy mecz będzie się składał z 5 pojedynków. Zwycięzca meczu wygrywa najwięcej pojedynków. Całkowita liczba zwycięstw w meczu i zwycięstw w walce zostanie zapisana przez program kontrolny i zostanie wykorzystana do ustalenia ogólnego zwycięzcy konkursu. Zwycięzca otrzymuje wielki zielony tyk i uwielbienie mas.
Każda walka będzie przebiegać w kilku rundach. Na początku każdej rundy każdemu botowi zostanie podany aktualny stan areny, a następnie bot odpowie poleceniem, aby ustalić, co chce dalej zrobić. Po otrzymaniu obu poleceń przez program sterujący oba polecenia są wykonywane jednocześnie, a poziomy energii areny i bota są aktualizowane w celu odzwierciedlenia nowego stanu. Jeśli oba boty nadal mają dość energii, aby kontynuować, gra przechodzi do następnej rundy. Będzie limit 1000 rund na walkę, aby zapewnić, że żadna walka nie będzie trwała wiecznie, a jeśli ten limit zostanie osiągnięty, zwycięzcą zostanie bot o największej energii. Jeśli oba boty mają taką samą energię, walka jest remisem i żaden bot nie dostanie punktu za wygraną (byłoby tak, jakby obaj przegrali).
Bronie
Każdy bot będzie miał do dyspozycji szereg broni:
- Pociski przeciwpancerne. Podróżują one 3 pola na raz i powodują 1 punkt energii obrażeń.
- Pociski Przemieszczają się one o 2 pola na raz i powodują 3 punkty energii obrażeń w punkcie uderzenia oraz 1 punkt obrażeń na wszystkich bezpośrednio otaczających polach.
- Miny Są one upuszczane na jeden z kwadratów bezpośrednio otaczających bota i powodują 2 punkty energii obrażeń po nadepnięciu oraz 1 punkt energii obrażeń dla wszystkiego, co stoi na jednym z bezpośrednio otaczających pól.
- Puls elektromagnetyczny. Powoduje nieprawidłowe działanie obwodów ruchu obu botów przez 2 tury, co oznacza, że nie mogą się poruszać. Mogą jednak nadal rozmieszczać broń (tak, wiem, że to nie jest realistyczne, ale to gra. To nie powinno być prawdziwe życie). Edycja: Każde wdrożenie EMP będzie kosztowało jeden punkt energii dla bota, który go używa.
Pociski / pociski mogą uderzać tylko robotami lub ścianami. Trafią każdego bota, który znajduje się na dowolnym kwadracie, przez który przechodzą. Znikają, gdy coś uderzą.
We wszystkich przypadkach immediately surrounding squares
oznacza 8 kwadratów, do których bot może przejść w następnym ruchu - sąsiedztwie Moore.
Polecenia
0
nic nie robić.N
,NE
,E
,SE
,S
,SW
,W
,NW
Są wszystkie polecenia kierunek i przesunąć bot jeden kwadrat w danym kierunku. Jeśli bot nie może się ruszyć w tym kierunku, ponieważ na placu znajduje się ściana lub inny bot, bot pozostaje tam, gdzie jest. Poruszanie się na placu, który już zawiera pocisk lub pocisk, jest bezpieczne, ponieważ pocisk / pocisk zostanie uznany za znajdujący się już w drodze z tego kwadratu.B
następnie spacja, a następnie jedno z poleceń kierunku wystrzeliwuje pocisk przebijający pancerz w tym kierunku.M
następnie spacja, a następnie jedno z poleceń kierunku wystrzeliwuje pocisk w tym kierunku.L
po którym następuje spacja, a następnie jedno z poleceń kierunkowych upuszcza minę lądową na ten kwadrat obok bota. Jeśli kwadrat jest już zajęty przez ścianę lub bota, polecenie jest ignorowane. Jeśli mina zostanie zrzucona na inną minę, detonuje ją. Spowoduje to uszkodzenie robota upuszczającego i każdego innego bota w zasięgu oryginalnej miny.P
odpala EMP.
Ponieważ na jedną rundę można wydać tylko jedno polecenie, bot może jedynie poruszać się, strzelać / rozmieszczać broń, a nie robić obu jednocześnie.
Kolejność poleceń
Ruch jednego z botów zawsze będzie na pierwszym miejscu, a wszystkie ruchy będą podejmowane dwukrotnie, aby uwzględnić, że inny bot stoi na drodze, ale znika z drogi.
Przykład
- Bot1 próbuje się poruszyć,
E
ale Bot2 jest już na tym polu - Program sterujący przechodzi do Bot2.
- Bot2 próbuje się poruszać
S
i odnosi sukces, ponieważ nic nie stoi na przeszkodzie. - Bot1 otrzymuje drugą próbę wykonania swojego ruchu. Tym razem się to udaje i Bot1 porusza się
E
.
Gdy boty wykonają dowolne ruchy, które chcą wykonać, broń zostanie wystrzelona, a wszystkie pociski (nowe i poprzednio wystrzelone) przesuną określoną liczbę pól.
Arena
Na początku każdej rundy bot otrzyma bieżący stan gry jako jedyny argument wiersza poleceń programu:
X.....LLL.
..........
..........
..........
M.........
..........
..........
..........
..........
...B.....Y
Y 10
X 7
B 3 9 W
M 0 4 S
L 6 0
B 3 9 S
L 7 0
L 8 0
Najpierw arena składa się z 10 linii po 10 znaków. Jest otoczony ścianami, których nie pokazano. Znaczenie znaków jest następujące:
.
reprezentuje pusty kwadratY
reprezentuje twojego bota.X
reprezentuje bota przeciwnika.L
reprezentuje minę lądową.B
przedstawia pocisk w locie.M
reprezentuje pocisk w locie.
Następnie pozostała energia botów, jeden bot na linię. Tylko jedna spacja oddzieli identyfikator bota od jego poziomu energii. Podobnie jak na arenie, Y
reprezentuje twojego bota i X
reprezentuje przeciwnika. Wreszcie pojawia się lista pocisków i min, ich pozycji i (w razie potrzeby) nagłówków, ponownie po jednym w wierszu.
Program sterujący
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#define NUMBOTS 2
#define BOUTSPERMATCH 5
#define ROUNDSPERBOUT 1000
#define MAXFILENAMESIZE 100
#define MAXWEAPONS 100
#define DISPLAYBOUTS true
typedef struct
{
int x, y, energy;
char cmd[5];
} Bot;
int getxmove(char cmd[5]);
int getymove(char cmd[5]);
int newposinbounds(int oldx, int oldy, int dx, int dy);
int directhit(Bot bot, int landmine[2]);
int landminecollision(int landmine1[2], int landmine2[2]);
int inshrapnelrange(Bot bot, int landmine[2]);
int directiontoint(char direction[5], char directions[8][3]);
void deployweapons(Bot *bot, Bot *enemy, int bullets[MAXWEAPONS][3], int missiles[MAXWEAPONS][3], int landmines[MAXWEAPONS][2], char directions[8][3]);
void cleararena(char arena[10][11]);
int main()
{
FILE *fp;
Bot b1, b2;
int bot1, bot2, bot1bouts, bot2bouts;
int bout, round, loop, totalprojectiles, dx, dy;
char bots[NUMBOTS][MAXFILENAMESIZE]=
{
"./donowt ",
"php -f huggybot.php "
};
char directions[8][3]={"N", "NE", "E", "SE", "S", "SW", "W", "NW"};
char openstring[5000], argumentstring[4000], bot1string[6], bot2string[6];
int matcheswon[NUMBOTS],boutswon[NUMBOTS];
int missiles[MAXWEAPONS][3];
int bullets[MAXWEAPONS][3];
int landmines[MAXWEAPONS][2];
int paralyzedturnsremaining=0;
bool bot1moved;
char arena[10][11];
char projectiles[300][10];
for(loop=0;loop<NUMBOTS;loop++)
{
matcheswon[loop]=0;
boutswon[loop]=0;
}
srand(time(NULL));
for(bot1=0;bot1<NUMBOTS-1;bot1++)
{
for(bot2=bot1+1;bot2<NUMBOTS;bot2++)
{
bot1bouts=bot2bouts=0;
printf("%s vs %s ",bots[bot1],bots[bot2]);
for(bout=0;bout<BOUTSPERMATCH;bout++)
{
printf("%d ",bout);
//setup the arena for the bout
b1.x=1;b1.y=1;
b2.x=9;
//b1.y=rand()%10;
b2.y=rand()%10;
b1.energy=b2.energy=10;
//clear the previous stuff
memset(missiles, -1, sizeof(missiles));
memset(bullets, -1, sizeof(bullets));
memset(landmines, -1, sizeof(landmines));
for(round=0;round<ROUNDSPERBOUT;round++)
{
//draw the arena based on current state
cleararena(arena);
totalprojectiles=0;
for(loop=0;loop<MAXWEAPONS;loop++)
{
if(bullets[loop][0]!= -1)
{
arena[bullets[loop][1]][bullets[loop][0]]='B';
sprintf(projectiles[totalprojectiles], "%c %d %d %s\n", 'B', bullets[loop][0], bullets[loop][1], directions[bullets[loop][2]]);
totalprojectiles+=1;
}
if(missiles[loop][0]!= -1)
{
arena[missiles[loop][1]][missiles[loop][0]]='M';
sprintf(projectiles[totalprojectiles], "%c %d %d %s\n", 'M', missiles[loop][0], missiles[loop][1], directions[missiles[loop][2]]);
totalprojectiles+=1;
}
if(landmines[loop][0]!= -1)
{
arena[landmines[loop][1]][landmines[loop][0]]='L';
sprintf(projectiles[totalprojectiles], "%c %d %d\n", 'L', landmines[loop][0], landmines[loop][1]);
totalprojectiles+=1;
}
}
//send the arena to both bots to get the commands
// create bot1's input
arena[b1.y][b1.x]='Y';
arena[b2.y][b2.x]='X';
sprintf(bot1string, "Y %d\n", b1.energy);
sprintf(bot2string, "X %d\n", b2.energy);
strcpy(argumentstring, "'");
strncat(argumentstring, *arena, 10*11);
strcat(argumentstring, bot1string);
strcat(argumentstring, bot2string);
for(loop=0;loop<totalprojectiles;loop++)
{
strcat(argumentstring, projectiles[loop]);
}
strcat(argumentstring, "'");
sprintf(openstring, "%s %s", bots[bot1], argumentstring);
// send it and get the command back
fp=popen(openstring, "r");
fgets(b1.cmd, 5, fp);
fflush(NULL);
pclose(fp);
// create bot2's input
arena[b2.y][b2.x]='Y';
arena[b1.y][b1.x]='X';
sprintf(bot2string, "Y %d\n", b2.energy);
sprintf(bot1string, "X %d\n", b1.energy);
strcpy(argumentstring, "'");
strncat(argumentstring, *arena, 10*11);
strcat(argumentstring, bot2string);
strcat(argumentstring, bot1string);
for(loop=0;loop<totalprojectiles;loop++)
{
strcat(argumentstring, projectiles[loop]);
}
strcat(argumentstring, "'");
sprintf(openstring, "%s %s", bots[bot2], argumentstring);
// send it and get the command back
fp=popen(openstring, "r");
fgets(b2.cmd, 5, fp);
fflush(NULL);
pclose(fp);
if(DISPLAYBOUTS)
{
arena[b1.y][b1.x]='A';
arena[b2.y][b2.x]='B';
printf("\033c");
printf("Round: %d\n", round);
printf("%s", arena);
sprintf(bot1string, "A %d\n", b1.energy);
sprintf(bot2string, "B %d\n", b2.energy);
printf("%s%s", bot1string, bot2string);
}
//do bot movement phase
if(paralyzedturnsremaining==0)
{
// move bot 1 first
bot1moved=false;
dx=dy=0;
dx=getxmove(b1.cmd);
dy=getymove(b1.cmd);
if(newposinbounds(b1.x, b1.y, dx, dy))
{
if(!(b1.x+dx==b2.x) || !(b1.y+dy==b2.y))
{
bot1moved=true;
b1.x=b1.x+dx;
b1.y=b1.y+dy;
}
}
// move bot 2 next
dx=dy=0;
dx=getxmove(b2.cmd);
dy=getymove(b2.cmd);
if(newposinbounds(b2.x, b2.y, dx, dy))
{
if(!(b2.x+dx==b1.x) || !(b2.y+dy==b1.y))
{
b2.x=b2.x+dx;
b2.y=b2.y+dy;
}
}
if(!bot1moved) // if bot2 was in the way first time, try again
{
dx=dy=0;
dx=getxmove(b1.cmd);
dy=getymove(b1.cmd);
if(newposinbounds(b1.x, b1.y, dx, dy))
{
if(!(b1.x+dx==b2.x) || !(b1.y+dy==b2.y))
{
b1.x=b1.x+dx;
b1.y=b1.y+dy;
}
}
}
//check for landmine hits
for(loop=0;loop<MAXWEAPONS;loop++)
{
if(landmines[loop][0]!= -1)
{
if(directhit(b1, landmines[loop]))
{
b1.energy-=2;
if(inshrapnelrange(b2, landmines[loop]))
{
b2.energy-=1;
}
landmines[loop][0]= -1;
landmines[loop][1]= -1;
}
if(directhit(b2, landmines[loop]))
{
b2.energy-=2;
if(inshrapnelrange(b1, landmines[loop]))
{
b1.energy-=1;
}
landmines[loop][0]= -1;
landmines[loop][1]= -1;
}
}
}
}
else
{
paralyzedturnsremaining-=1;
}
//do weapons firing phase
if(strcmp(b1.cmd, "P")==0)
{
paralyzedturnsremaining=2;
b1.energy--;
}
else if(strcmp(b2.cmd, "P")==0)
{
paralyzedturnsremaining=2;
b2.energy--;
}
deployweapons(&b1, &b2, bullets, missiles, landmines, directions);
deployweapons(&b2, &b1, bullets, missiles, landmines, directions);
//do weapons movement phase
int moves;
for(loop=0;loop<MAXWEAPONS;loop++)
{
dx=dy=0;
if(bullets[loop][0]!= -1)
{
dx=getxmove(directions[bullets[loop][2]]);
dy=getymove(directions[bullets[loop][2]]);
for(moves=0;moves<3;moves++)
{
if(newposinbounds(bullets[loop][0], bullets[loop][1], dx, dy))
{
bullets[loop][0]+=dx;
bullets[loop][1]+=dy;
if(directhit(b1, bullets[loop]))
{
b1.energy-=1;
bullets[loop][0]= -1;
bullets[loop][1]= -1;
bullets[loop][2]= -1;
}
if(directhit(b2, bullets[loop]))
{
b2.energy-=1;
bullets[loop][0]= -1;
bullets[loop][1]= -1;
bullets[loop][2]= -1;
}
}
else
{
bullets[loop][0]= -1;
bullets[loop][1]= -1;
bullets[loop][2]= -1;
dx=dy=0;
}
}
}
};
for(loop=0;loop<MAXWEAPONS;loop++)
{
dx=dy=0;
if(missiles[loop][0]!= -1)
{
dx=getxmove(directions[missiles[loop][2]]);
dy=getymove(directions[missiles[loop][2]]);
for(moves=0;moves<2;moves++)
{
if(newposinbounds(missiles[loop][0], missiles[loop][1], dx, dy))
{
missiles[loop][0]+=dx;
missiles[loop][1]+=dy;
if(directhit(b1, missiles[loop]))
{
b1.energy-=3;
if(inshrapnelrange(b2, missiles[loop]))
{
b2.energy-=1;
}
missiles[loop][0]= -1;
missiles[loop][1]= -1;
missiles[loop][2]= -1;
}
if(directhit(b2, missiles[loop]))
{
b2.energy-=3;
if(inshrapnelrange(b1, missiles[loop]))
{
b1.energy-=1;
}
missiles[loop][0]= -1;
missiles[loop][1]= -1;
missiles[loop][2]= -1;
}
}
else
{
if(inshrapnelrange(b1, missiles[loop]))
{
b1.energy-=1;
}
if(inshrapnelrange(b2, missiles[loop]))
{
b2.energy-=1;
}
missiles[loop][0]= -1;
missiles[loop][1]= -1;
missiles[loop][2]= -1;
dx=dy=0;
}
}
}
}
//check if there's a winner
if(b1.energy<1 || b2.energy<1)
{
round=ROUNDSPERBOUT;
}
}
// who has won the bout
if(b1.energy<b2.energy)
{
bot2bouts+=1;
boutswon[bot2]+=1;
}
else if(b2.energy<b1.energy)
{
bot1bouts+=1;
boutswon[bot1]+=1;
}
}
if(bot1bouts>bot2bouts)
{
matcheswon[bot1]+=1;
}
else if(bot2bouts>bot1bouts)
{
matcheswon[bot2]+=1;
}
printf("\n");
}
}
// output final scores
printf("\nResults:\n");
printf("Bot\t\t\tMatches\tBouts\n");
for(loop=0;loop<NUMBOTS;loop++)
{
printf("%s\t%d\t%d\n", bots[loop], matcheswon[loop], boutswon[loop]);
}
}
int getxmove(char cmd[5])
{
int dx=0;
if(strcmp(cmd, "NE")==0)
dx= 1;
else if(strcmp(cmd, "E")==0)
dx= 1;
else if(strcmp(cmd, "SE")==0)
dx= 1;
else if(strcmp(cmd, "SW")==0)
dx= -1;
else if(strcmp(cmd, "W")==0)
dx= -1;
else if(strcmp(cmd, "NW")==0)
dx= -1;
return dx;
}
int getymove(char cmd[5])
{
int dy=0;
if(strcmp(cmd, "N")==0)
dy= -1;
else if(strcmp(cmd, "NE")==0)
dy= -1;
else if(strcmp(cmd, "SE")==0)
dy= 1;
else if(strcmp(cmd, "S")==0)
dy= 1;
else if(strcmp(cmd, "SW")==0)
dy= 1;
else if(strcmp(cmd, "NW")==0)
dy= -1;
return dy;
}
int newposinbounds(int oldx, int oldy, int dx, int dy)
{
return (oldx+dx>=0 && oldx+dx<10 && oldy+dy>=0 && oldy+dy<10);
}
int directhit(Bot bot, int landmine[2])
{
return (bot.x==landmine[0] && bot.y==landmine[1]);
}
int landminecollision(int landmine1[2], int landmine2[2])
{
return ((landmine1[1]==landmine2[1]) && abs(landmine1[0]==landmine2[0]));
}
int inshrapnelrange(Bot bot, int landmine[2])
{
return (abs(bot.x-landmine[0])<2 && abs(bot.y-landmine[1])<2);
}
int directiontoint(char direction[5], char directions[8][3])
{
int loop,returnval=8;
for(loop=0;loop<8;loop++)
{
if(strcmp(directions[loop], direction)==0)
returnval=loop;
}
return returnval;
}
void deployweapons(Bot *bot, Bot *enemy, int bullets[MAXWEAPONS][3], int missiles[MAXWEAPONS][3], int landmines[MAXWEAPONS][2], char directions[8][3])
{
int loop;
if(strlen(bot->cmd)>2)
{
if(bot->cmd[0]=='B')
{
int weaponslot=0;
while(bullets[weaponslot][0]!= -1)
weaponslot+=1;
bullets[weaponslot][0]=bot->x;
bullets[weaponslot][1]=bot->y;
bullets[weaponslot][2]=directiontoint(bot->cmd+2, directions);
if(bullets[weaponslot][2]>7)
{
// direction wasn't recognized so clear the weapon
bullets[weaponslot][0]= -1;
bullets[weaponslot][1]= -1;
bullets[weaponslot][2]= -1;
}
}
if(bot->cmd[0]=='M')
{
int weaponslot=0;
while(missiles[weaponslot][0]!= -1)
weaponslot+=1;
missiles[weaponslot][0]=bot->x;
missiles[weaponslot][1]=bot->y;
missiles[weaponslot][2]=directiontoint(bot->cmd+2, directions);
if(missiles[weaponslot][2]>7)
{
// direction wasn't recognized so clear the weapon
missiles[weaponslot][0]= -1;
missiles[weaponslot][1]= -1;
missiles[weaponslot][2]= -1;
}
}
if(bot->cmd[0]=='L')
{
int weaponslot=0;
while(landmines[weaponslot][0]!= -1)
weaponslot+=1;
if(newposinbounds(bot->x, bot->y, getxmove(bot->cmd+2), getymove(bot->cmd+2)))
{
landmines[weaponslot][0]=bot->x+getxmove(bot->cmd+2);
landmines[weaponslot][1]=bot->y+getymove(bot->cmd+2);
//check for landmine hits
for(loop=0;loop<MAXWEAPONS;loop++)
{
if(landmines[loop][0]!= -1)
{
if(landminecollision(landmines[weaponslot], landmines[loop]) && weaponslot!=loop)
{
if(inshrapnelrange(*bot, landmines[loop]))
{
bot->energy-=1;
}
if(inshrapnelrange(*enemy, landmines[loop]))
{
enemy->energy-=1;
}
landmines[loop][0]= -1;
landmines[loop][1]= -1;
landmines[weaponslot][0]= -1;
landmines[weaponslot][1]= -1;
}
}
}
}
}
}
}
void cleararena(char arena[10][11])
{
int loop;
memset(arena, '.', 110);
for(loop=0;loop<10;loop++)
{
arena[loop][10]='\n';
}
}
Program sterujący wywoła twojego bota z linii poleceń. Z tego powodu programy, których nie można wywołać z wiersza poleceń, zostaną uznane za nieprawidłowe . Przepraszam tych, których język nie działa w ten sposób, ale ręczne wykonanie każdego meczu byłoby niepraktyczne.
intx13 uprzejmie napisał solidniejszą wersję programu sterującego z kilkoma poprawkami błędów, które można znaleźć tutaj .
Sugestie dotyczące ulepszeń lub poprawek błędów w programie sterującym są mile widziane.
Boty testowe
Żaden z botów testowych nie zostanie uwzględniony w przebiegach punktacji. Są tylko do celów testowych.
Dudley DoNowt (C)
int main(int argc, char *argv)
{
printf("0");
}
Nic nie robi bez względu na sytuację. Nie oczekuje się, że wygra dużo.
HuggyBot (PHP)
<?php
$arena=$argv[1];
list($meX, $meY)=findMe($arena);
list($oppX, $oppY)=findOpp($arena);
if($meY<$oppY)
{
if($meX<$oppX)
echo "SE";
elseif($meX==$oppX)
echo "S";
else
echo "SW";
}
elseif($meY==$oppY)
{
if($meX<$oppX)
echo "E";
else
echo "W";
}
else
{
if($meX<$oppX)
echo "NE";
elseif($meX==$oppX)
echo "N";
else
echo "NW";
}
function findMe($arena)
{
return find("Y", explode("\n", $arena));
}
function findOpp($arena)
{
return find("X", explode("\n", $arena));
}
function find($char, $array)
{
$x=0;
$y=0;
for($loop=0;$loop<10;$loop++)
{
if(strpos($array[$loop], $char)!==FALSE)
{
$x=strpos($array[$loop], $char);
$y=$loop;
}
}
return array($x, $y);
}
?>
Próbuje dostać się tuż obok przeciwnika. Wrażliwe na miny, ponieważ ich nie szuka. Sprawia, że strzelanie pociskami jest mniej skuteczną taktyką dla przeciwnika, gdy osiągnie swój cel.
Wyniki
Ostateczny przebieg punktacji nastąpi po 23:59 24 marca 2014 r . Będę regularnie przeprowadzał testy, aby uczestnicy mogli zobaczyć, w jaki sposób ich boty układają się przeciwko obecnemu przeciwnikowi.
Wpisy
Wpisy powinny zawierać źródło twojego bota oraz argument wiersza poleceń, którego będę musiał użyć, aby go uruchomić. Możesz opublikować tyle wpisów, ile chcesz, ale każda odpowiedź powinna zawierać tylko jednego bota.
Ważny
Wygląda na to, że niektóre wpisy chcą zapisać na dysku, aby zachować pewien stan między uruchomieniami. Są to nowe zasady dotyczące zapisu na dysk.
- Możesz zmodyfikować źródło swojego bota. Modyfikacja dowolnego innego bota jest oszustwem i spowoduje dyskwalifikację robota, który go popełnił.
- Możesz pisać do pliku utworzonego w celu przechowywania stanu. Ten plik musi być przechowywany w podkatalogu katalogu, w którym znajduje się bot. Podkatalog zostanie nazwany
state
. Zapisywanie w jakiejkolwiek innej części systemu plików (innej niż twoje własne źródło) jest zabronione.