Kết quả là trong, cuộc thi kết thúc.
Người chiến thắng là EvilBot của arshajii với 14 trận thắng trước Neo-Bot với 13 trận thắng và CentreBot và LastStand với 11 trận thắng.
Điểm từ lần chạy cuối cùng
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)
Đây là một thử thách vua đồi . Mục đích là để viết một bot sẽ đánh bại nhiều bot khác hơn bất kỳ bot nào khác.
Tro choi
Tất cả các bot sẽ được đọ sức với nhau 2 lần trong một đấu trường 10x10 với nhiệm vụ giảm năng lượng của đối thủ xuống từ 10 xuống 0 trước khi năng lượng của chính nó giảm xuống 0.
Mỗi trận đấu sẽ bao gồm 5 trận. Người chiến thắng trong trận đấu là người chiến thắng nhiều trận nhất. Tổng số trận thắng và trận thắng sẽ được chương trình kiểm soát lưu trữ và sẽ được sử dụng để xác định người chiến thắng chung cuộc của cuộc thi. Người chiến thắng nhận được đánh dấu lớn màu xanh lá cây và sự suy đoán của quần chúng.
Mỗi cơn sẽ tiến hành trong một số vòng. Vào đầu mỗi vòng, trạng thái hiện tại của đấu trường sẽ được trao cho mỗi bot và sau đó bot sẽ trả lời bằng một lệnh để xác định những gì nó muốn làm tiếp theo. Khi cả hai lệnh đã được nhận bởi chương trình điều khiển, cả hai lệnh được thực thi cùng lúc và mức năng lượng của đấu trường và bot được cập nhật để phản ánh trạng thái mới. Nếu cả hai bot vẫn còn đủ năng lượng để tiếp tục trò chơi sẽ đi vào vòng tiếp theo. Sẽ có giới hạn 1000 vòng mỗi lần để đảm bảo không có trận đấu nào diễn ra mãi mãi và trong trường hợp đạt đến giới hạn này, người chiến thắng sẽ là bot có nhiều năng lượng nhất. Nếu cả hai bot đều có năng lượng như nhau thì trận đấu là một trận hòa và không bot nào có được điểm cho chiến thắng (sẽ như thể cả hai đều thua).
Vũ khí
Mỗi bot sẽ có một số vũ khí:
- Đạn xuyên giáp. Chúng di chuyển 3 ô vuông cùng một lúc và gây ra 1 điểm năng lượng sát thương.
- Tên lửa. Chúng di chuyển 2 ô vuông cùng một lúc và gây ra 3 điểm năng lượng sát thương tại điểm va chạm và 1 điểm sát thương trong tất cả các ô vuông xung quanh ngay lập tức.
- Mìn. Chúng được thả vào một trong những ô vuông ngay lập tức xung quanh bot và gây ra 2 điểm năng lượng sát thương khi bước lên và 1 điểm năng lượng gây sát thương cho bất cứ thứ gì đứng trong một trong những ô vuông xung quanh.
- Xung điện từ. Làm cho các mạch chuyển động của cả hai bot bị trục trặc trong 2 lượt, có nghĩa là chúng không thể di chuyển. Tuy nhiên, họ vẫn có thể triển khai vũ khí (vâng tôi biết điều đó không thực tế, nhưng đó là một trò chơi. Nó không phải là cuộc sống thực). Chỉnh sửa: Mỗi lần triển khai EMP sẽ tiêu tốn một điểm năng lượng cho bot sử dụng nó.
Đạn / tên lửa chỉ có thể tác động với bot hoặc tường. Họ sẽ đánh bất kỳ bot nào trong bất kỳ ô vuông nào mà chúng đi qua. Họ biến mất một khi họ đã đánh một cái gì đó.
Trong mọi trường hợp immediately surrounding squares
có nghĩa là 8 ô vuông mà bot có thể di chuyển đến trong lần di chuyển tiếp theo - khu phố Moore.
Các lệnh
0
không làm gì cả.N
,NE
,E
,SE
,S
,SW
,W
,NW
Là tất cả các lệnh hướng và di chuyển các bot một hình vuông theo hướng nhất định. Nếu bot không thể di chuyển theo hướng đó vì có một bức tường hoặc một bot khác trong hình vuông, thì bot vẫn giữ nguyên vị trí của nó. Di chuyển vào một hình vuông đã chứa một viên đạn hoặc tên lửa là an toàn vì viên đạn / tên lửa sẽ được coi là đã trên đường ra khỏi hình vuông đó.B
theo sau là một khoảng trống và sau đó một trong những mệnh lệnh sẽ bắn một viên đạn xuyên giáp theo hướng đó.M
theo sau là một khoảng trắng và sau đó một trong các lệnh điều hướng sẽ bắn một tên lửa theo hướng đó.L
theo sau là một khoảng trắng và sau đó một trong các lệnh điều hướng thả một mỏ đất trên quảng trường đó bên cạnh bot. Nếu hình vuông đã bị chiếm bởi một bức tường hoặc bot, lệnh sẽ bị bỏ qua. Nếu một quả mìn được thả xuống một quả mìn khác, nó sẽ kích nổ nó. Điều này sẽ làm hỏng bot khi thả và bất kỳ bot nào khác trong phạm vi của bom mìn ban đầu.P
bắn EMP.
Vì chỉ có thể đưa ra một lệnh cho mỗi vòng, bot chỉ có thể di chuyển hoặc bắn / triển khai vũ khí, không thể thực hiện cả hai cùng một lúc.
Thứ tự các lệnh Chuyển
động của một trong hai bot sẽ luôn đến trước và tất cả các chuyển động sẽ được thử hai lần để giải thích cho một bot khác cản đường nhưng di chuyển ra khỏi đường đi.
Thí dụ
- Bot1 cố gắng di chuyển
E
nhưng Bot2 đã ở trong hình vuông đó - Chương trình điều khiển chuyển sang Bot2.
- Bot2 cố gắng di chuyển
S
và thành công vì không có gì cản trở. - Bot1 có một nỗ lực thứ hai trong việc di chuyển. Lần này nó thành công và Bot1 di chuyển
E
.
Một khi các bot đã thực hiện bất kỳ chuyển động nào chúng muốn thực hiện, vũ khí sẽ được bắn và tất cả các tên lửa (mới và được bắn trước đó) sẽ di chuyển số lượng hình vuông được xác định trước của chúng.
Đấu trường
Vào đầu mỗi vòng, bot sẽ nhận trạng thái chơi hiện tại dưới dạng đối số dòng lệnh duy nhất của chương trình:
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
Đấu trường đến đầu tiên bao gồm 10 dòng gồm 10 ký tự. Nó được bao quanh với những bức tường không được hiển thị. Ý nghĩa của các nhân vật như sau:
.
đại diện cho một hình vuông trốngY
đại diện cho bot của bạn.X
đại diện cho bot đối thủ.L
đại diện cho một quả mìn.B
đại diện cho một viên đạn trong chuyến bay.M
đại diện cho một tên lửa trong chuyến bay.
Tiếp theo là năng lượng còn lại của các bot, một bot trên mỗi dòng. Chỉ có một không gian sẽ tách định danh bot khỏi mức năng lượng của nó. Như trong đấu trường, Y
đại diện cho bot của bạn và X
đại diện cho đối thủ của bạn. Cuối cùng là một danh sách các tên lửa và mìn, vị trí của chúng và (nếu thích hợp), một lần nữa trên mỗi dòng.
Chương trình điều khiển
#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';
}
}
Chương trình điều khiển sẽ gọi bot của bạn từ dòng lệnh. Vì lý do này, các chương trình không thể được gọi từ dòng lệnh sẽ được coi là không hợp lệ . Tôi xin lỗi những người có ngôn ngữ lựa chọn không hoạt động theo cách đó, nhưng thực hiện mỗi trận đấu bằng tay sẽ không thực tế.
intx13 đã vui lòng viết một phiên bản mạnh mẽ hơn của chương trình điều khiển với một số lỗi mà bạn có thể tìm thấy ở đây .
Đề xuất cải tiến hoặc sửa lỗi cho chương trình kiểm soát được hoan nghênh.
Kiểm tra bot
Không có bot thử nghiệm nào được đưa vào các lần chạy. Chúng chỉ nhằm mục đích thử nghiệm.
Dudley DoNowt (C)
int main(int argc, char *argv)
{
printf("0");
}
Không có gì bất kể tình huống. Không mong thắng được nhiều.
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);
}
?>
Cố gắng để có được ngay bên cạnh đối thủ. Dễ bị mìn vì nó không tìm thấy chúng. Làm cho tên lửa bắn trở thành một chiến thuật kém hiệu quả hơn cho đối thủ khi đạt được mục tiêu.
Kết quả
Việc ghi điểm cuối cùng sẽ được thực hiện sau 23:59 ngày 24 tháng 3 năm 2014 . Tôi sẽ chạy thử nghiệm thường xuyên để những người tham gia có thể thấy các bot của họ đang chống lại phe đối lập hiện tại như thế nào.
Mục
Các mục nhập nên bao gồm nguồn bot của bạn và đối số dòng lệnh tôi sẽ cần sử dụng để chạy nó. Bạn có thể đăng nhiều mục khác nhau như bạn muốn, nhưng mỗi câu trả lời chỉ nên chứa một bot.
Quan trọng
Có vẻ như một số mục muốn ghi vào đĩa để giữ lại một số trạng thái giữa các lần chạy. Đây là những quy tắc mới liên quan đến việc ghi vào đĩa.
- Bạn có thể sửa đổi nguồn bot của riêng bạn. Sửa đổi bất kỳ bot nào khác là gian lận và sẽ dẫn đến việc bot vi phạm bị loại.
- Bạn có thể ghi vào một tập tin được tạo ra cho mục đích lưu trữ trạng thái. Tập tin này phải được lưu trữ trong thư mục con của thư mục nơi bot của bạn được đặt. Thư mục con sẽ được đặt tên
state
. Viết thư cho bất kỳ phần nào khác của hệ thống tệp (không phải là nguồn của riêng bạn) không được phép.