결과는 대회가 끝났습니다.
승자는 arshajii의 EvilBot 이 14 승, Neo-Bot보다 13 승, CentreBot 및 LastStand는 각각 11 승입니다.
마지막 경기에서 얻은 점수
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)
이것은 왕의 도전입니다. 다른 봇보다 더 많은 봇을 이길 수있는 봇을 작성하는 것이 목표입니다.
게임
봇은 자신의 에너지가 0으로 감소되기 전에 상대의 에너지를 10에서 0으로 낮추는 작업으로 10x10 경기장에서 한 번에 서로 2에 대해 움푹 패입니다.
각 경기는 5 번의 시합으로 구성됩니다. 경기의 승자가 가장 많은 시합의 승자입니다. 경기 승리 및 한판 승의 총 횟수는 제어 프로그램에 의해 저장되며 대회의 전체 우승자를 결정하는 데 사용됩니다. 승자는 큰 녹색 진드기와 대중의 숭배를받습니다.
각 시합은 여러 차례 진행됩니다. 각 라운드의 시작 부분에서 경기장의 현재 상태가 각 봇에 제공되고 봇은 다음에 무엇을할지 결정하는 명령으로 응답합니다. 제어 프로그램이 두 명령을 모두 수신하면 두 명령이 동시에 실행되고 경기장 및 봇 에너지 레벨이 새로운 상태를 반영하도록 업데이트됩니다. 두 봇에 여전히 충분한 에너지가 있다면 게임은 다음 라운드로 진행됩니다. 한 번에 한 번만 경기를하지 않기 위해 한 번에 한 라운드 당 1000 라운드가 있으며,이 한도에 도달하면 가장 많은 에너지를 가진 봇이 승자가됩니다. 두 봇이 모두 같은 에너지를 가지고 있다면 한판 승부가 무승부이며 어느 봇도 승점을 얻지 못합니다 (두 잃어버린 것처럼).
무기
각 봇은 여러 가지 무기를 사용할 수 있습니다.
- 장갑 관통 총알. 이들은 한 번에 3 칸씩 이동하여 1의 에너지 피해를 입 힙니다.
- 미사일. 이것들은 한 번에 2 칸씩 이동하며 충격 지점에서 3의 에너지 피해를 입히고, 즉시 인접한 모든 칸에서 1의 피해를줍니다.
- 지뢰. 이들은 봇을 바로 둘러싼 사각형 중 하나에 떨어 뜨려 밟으면 2의 에너지 피해 지점과 1 개의 에너지가 바로 인접한 사각형 중 하나에 서있는 데미지를 입 힙니다.
- 전자기 펄스. 두 봇의 이동 회로가 2 턴 동안 오작동을 일으켜 움직일 수 없습니다. 그러나 그들은 여전히 무기를 배치 할 수 있습니다 (예, 그것이 현실적이지는 않지만 게임이라는 것을 알고 있습니다. 현실이 아니어야합니다). 편집 : 각 EMP 배포는이를 사용하는 봇에 대해 하나의 에너지 포인트가 필요합니다.
총알 / 미사일은 봇이나 벽에만 영향을 줄 수 있습니다. 그들은 그들이 여행하는 사각형 중 하나에있는 모든 봇을 칠 것입니다. 일단 무언가를 치면 사라집니다.
모든 경우 immediately surrounding squares
에 봇이 다음 이동시 무어 지역으로 이동할 수있는 8 개의 사각형을 의미합니다.
명령
0
아무것도하지 마세요.N
,NE
,E
,SE
,S
,SW
,W
,NW
모든 방향의 명령입니다 주어진 방향으로 봇 하나의 사각형을 이동합니다. 정사각형에 벽이나 다른 봇이있어 봇이 해당 방향으로 이동할 수없는 경우 봇은 원래 위치에 유지됩니다. 총알 / 미사일이 이미 해당 사각형을 벗어나는 것으로 간주되므로 이미 총알이나 미사일이 포함 된 사각형으로 이동하는 것이 안전합니다.B
다음에 공백이오고 방향 명령 중 하나가 해당 방향으로 갑옷 관통 탄환을 발사합니다.M
다음에 공백이 오면 방향 명령 중 하나가 해당 방향으로 미사일을 발사합니다.L
다음에 공백이오고 방향 명령 중 하나가 봇 옆의 광장에 지뢰를 떨어 뜨립니다. 사각형이 이미 벽이나 봇에 의해 점유되어 있으면 명령이 무시됩니다. 지뢰가 다른 지뢰에 떨어지면 폭발합니다. 이렇게하면 떨어 뜨리는 로봇과 원래 지뢰 범위 내의 다른 로봇이 손상됩니다.P
EMP를 시작합니다.
라운드 당 하나의 명령 만 주어질 수 있기 때문에 봇은 무기를 동시에 이동하거나 발사 / 배포 할 수 있으며 동시에 둘 다 수행 할 수는 없습니다.
명령 순서
어느 한 쪽 로봇의 움직임이 항상 우선하며, 모든 다른 움직임은 다른 로봇이 방해가되지만 방해가되는 것을 설명하기 위해 두 번 시도됩니다.
예
- 봇 1은 움직이려고
E
하지만 봇 2는 이미 그 광장에 있습니다. - 제어 프로그램이 Bot2로 이동합니다.
- Bot2는
S
아무 것도 없기 때문에 움직이고 성공합니다. - Bot1은 이동을 시도합니다. 이번에는 성공하고 Bot1이 움직
E
입니다.
봇이 원하는 이동을하면 무기가 발사되고 모든 발사체 (신규 및 이전에 발사)가 사전 정의 된 수의 제곱을 이동합니다.
경기장
각 라운드가 시작될 때 봇은 프로그램의 유일한 명령 줄 인수로 현재 플레이 상태를받습니다 :
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
경기장은 10 줄의 10 줄로 구성됩니다. 표시되지 않은 벽으로 둘러싸여 있습니다. 문자의 의미는 다음과 같습니다.
.
빈 사각형을 나타냅니다Y
당신의 봇을 나타냅니다.X
상대 봇을 나타냅니다.L
지뢰를 나타냅니다.B
비행 중에 총알을 나타냅니다.M
비행 중 미사일을 나타냅니다.
그 다음에는 봇의 남은 에너지가 한 줄에 하나씩 있습니다. 하나의 공간 만 봇 식별자를 에너지 수준과 분리합니다. 경기장과 마찬가지로 Y
봇을 X
나타내며 상대를 나타냅니다. 마지막으로 발사체와 지뢰, 그들의 위치 및 (필요한 경우) 표제의 목록을 한 줄에 하나씩 다시 제공합니다.
제어 프로그램
#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';
}
}
제어 프로그램은 명령 줄에서 봇을 호출합니다. 이러한 이유로 명령 행에서 호출 할 수없는 프로그램은 유효하지 않은 것으로 간주됩니다 . 선택한 언어가 그런 식으로 작동하지 않는 사람들에게 사과하지만 각 경기를 수동으로 수행하는 것은 비현실적입니다.
intx13 은 여기에서 찾을 수있는 몇 가지 버그 수정과 함께보다 강력한 버전의 제어 프로그램을 친절하게 작성했습니다 .
제어 프로그램의 개선 또는 버그 수정에 대한 제안을 환영합니다.
테스트 봇
없음 테스트 봇은 점수 실행에 포함되지 않습니다. 그들은 단지 테스트 목적입니다.
더들리 도노 트 (C)
int main(int argc, char *argv)
{
printf("0");
}
상황에 관계없이 아무 것도하지 않습니다. 많이 이길 것으로 예상되지 않습니다.
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);
}
?>
상대방 바로 옆에 가려고합니다. 지뢰를 찾지 않기 때문에 지뢰에 취약합니다. 발사 미사일이 목표를 달성 할 때 상대에게 덜 효과적인 전술을 만듭니다.
결과
최종 채점은 2014 년 3 월 24 일 23:59 이후 에 실시됩니다 . 참가자들이 자신의 봇이 현재 반대에 어떻게 쌓이는 지 확인할 수 있도록 테스트 실행을 정기적으로 실행합니다.
출품작
출품작에는 봇의 소스와이를 실행하기 위해 사용해야하는 명령 줄 인수가 포함되어야합니다. 원하는만큼 다른 게시물을 게시 할 수 있지만 각 답변에는 하나의 봇만 포함되어야합니다 .
중대한
실행 중 일부 상태를 유지하기 위해 일부 항목이 디스크에 쓰려고하는 것 같습니다. 디스크 쓰기와 관련된 새로운 규칙입니다.
- 자신의 봇 소스를 수정할 수 있습니다. 다른 봇을 수정하면 부정 행위가되며 해당 봇이 실격 처리됩니다.
- 상태 저장을 위해 작성된 파일에 쓸 수 있습니다. 이 파일은 봇이 위치한 디렉토리의 하위 디렉토리에 저장해야합니다. 서브 디렉토리 이름은으로 지정
state
됩니다. 파일 시스템의 다른 부분 (자체 소스 이외의)에 쓰는 것은 허용되지 않습니다.