ผลลัพธ์อยู่ในการแข่งขันสิ้นสุดแล้ว
ผู้ชนะคือEvilBot ของ arshajiiพร้อมด้วย 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)
นี่เป็นความท้าทายที่ยอดเยี่ยม เป้าหมายคือการเขียนบอทที่จะเอาชนะบอทอื่น ๆ ได้มากกว่าบอทอื่น ๆ
เกม
บอททั้งหมดจะถูกหลุมต่อกัน 2 ครั้งในเวที 10x10 โดยมีภารกิจลดพลังงานของฝ่ายตรงข้ามลงจาก 10 เป็น 0 ก่อนที่พลังงานของมันจะลดลงเหลือ 0
แต่ละการแข่งขันจะประกอบด้วย 5 การแข่งขัน ผู้ชนะการแข่งขันเป็นผู้ชนะการแข่งขันมากที่สุด จำนวนทั้งหมดของการแข่งขันที่ชนะและการแข่งขันจะถูกเก็บไว้ในโปรแกรมควบคุมและจะถูกใช้เพื่อกำหนดผู้ชนะการแข่งขันโดยรวม ผู้ชนะจะได้รับเครื่องหมายสีเขียวขนาดใหญ่และการประจบสอพลอของฝูง
การแข่งขันแต่ละครั้งจะดำเนินการเป็นรอบ ที่จุดเริ่มต้นของแต่ละรอบสถานะปัจจุบันของเวทีจะมอบให้กับแต่ละบอทและบอทจะตอบกลับด้วยคำสั่งเพื่อกำหนดสิ่งที่มันต้องการจะทำต่อไป เมื่อได้รับคำสั่งจากทั้งสองโปรแกรมแล้วทั้งสองคำสั่งจะถูกดำเนินการในเวลาเดียวกันและระดับพลังงานของเวทีและบอทจะได้รับการอัพเดตเพื่อให้สอดคล้องกับสถานะใหม่ หากบอททั้งสองยังมีพลังงานเพียงพอที่จะดำเนินการต่อเกมจะเข้าสู่รอบต่อไป จะมีการ จำกัด 1,000 รอบต่อการแข่งขันเพื่อให้แน่ใจว่าไม่มีการแข่งขันจะดำเนินต่อไปตลอดไปและในกรณีที่ถึงขีด จำกัด นี้ผู้ชนะจะเป็นบอทที่มีพลังงานมากที่สุด หากบอททั้งสองมีพลังงานเท่ากันการแข่งขันนั้นเสมอกันและบอททั้งคู่จะไม่ได้รับคะแนนสำหรับการชนะ (มันจะเหมือนกับว่าพวกเขาแพ้ทั้งคู่)
อาวุธ
แต่ละบอทจะมีอาวุธจำนวนหนึ่ง:
- กระสุนเจาะเกราะ การเดินทางครั้งละ 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
เนื่องจากอาจได้รับคำสั่งเพียงหนึ่งคำสั่งต่อรอบบอทสามารถย้ายหรือยิง / ปรับใช้อาวุธเท่านั้นไม่สามารถทำทั้งสองอย่างในเวลาเดียวกัน
ลำดับของคำสั่ง
การเคลื่อนไหวของบอทใด ๆ จะมาก่อนเสมอและการเคลื่อนไหวทั้งหมดจะพยายามสองครั้งเพื่ออธิบายบอทอื่นที่กำลังขวางทาง แต่เคลื่อนออกนอกเส้นทาง
ตัวอย่าง
- Bot1 พยายามย้าย
E
แต่ Bot2 อยู่ในช่องนั้นแล้ว - โปรแกรมควบคุมย้ายไปยัง Bot2
- Bot2 พยายามย้าย
S
และประสบความสำเร็จเพราะไม่มีอะไรขวางทาง - Bot1 ได้รับความพยายามครั้งที่สองในการย้าย
E
ในครั้งนี้จะประสบความสำเร็จและย้าย Bot1
เมื่อบอททำการเคลื่อนไหวใด ๆ ที่พวกเขาต้องการอาวุธจะถูกยิงและขีปนาวุธทั้งหมด (ใหม่และก่อนหน้านี้ยิง) จะย้ายจำนวนสี่เหลี่ยมที่กำหนดไว้ล่วงหน้า
สนามกีฬา
ที่จุดเริ่มต้นของแต่ละรอบ bot จะได้รับสถานะการเล่นปัจจุบันเป็นอาร์กิวเมนต์บรรทัดคำสั่งของโปรแกรมเท่านั้น:
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ได้เขียนกรุณารุ่นที่มีประสิทธิภาพมากขึ้นของโปรแกรมควบคุมที่มีการแก้ไขข้อบกพร่องบางอย่างที่คุณสามารถหาได้ที่นี่
ข้อเสนอแนะสำหรับการปรับปรุงหรือแก้ไขข้อบกพร่องในโปรแกรมควบคุมยินดีต้อนรับ
ทดสอบบ็อต
ไม่มีบอททดสอบใด ๆ ที่จะรวมอยู่ในการให้คะแนน พวกมันแค่เพื่อการทดสอบ
Dudley DoNowt (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);
}
?>
พยายามที่จะได้รับขวาถัดจากฝ่ายตรงข้าม ความเสี่ยงต่อการทุ่นระเบิดเนื่องจากไม่ได้มองหาพวกเขา ทำให้การยิงขีปนาวุธเป็นกลยุทธ์ที่มีประสิทธิภาพน้อยกว่าสำหรับคู่ต่อสู้เมื่อบรรลุเป้าหมาย
ผลที่ได้
วิ่งให้คะแนนสุดท้ายจะทำหลังจากที่23:59 ใน 24 มีนาคม 2014 ฉันจะทำการทดสอบวิ่งเป็นประจำเพื่อให้ผู้เข้าร่วมสามารถเห็นว่าบอทของพวกเขาซ้อนกันอย่างไรกับการต่อต้านในปัจจุบัน
รายการ
รายการควรมีแหล่งที่มาของบอทของคุณและอาร์กิวเมนต์บรรทัดคำสั่งที่ฉันจะต้องใช้เพื่อเรียกใช้ คุณสามารถโพสต์ข้อความต่าง ๆ ได้มากเท่าที่คุณต้องการ แต่คำตอบแต่ละคำตอบควรมีบอทเดียวเท่านั้น
สิ่งสำคัญ
ดูเหมือนว่าบางรายการต้องการเขียนไปยังดิสก์เพื่อรักษาสถานะระหว่างการทำงาน นี่เป็นกฎใหม่เกี่ยวกับการเขียนลงดิสก์
- คุณสามารถแก้ไขแหล่งที่มาของบอทของคุณเอง การดัดแปลงบอทอื่นเป็นการโกงและจะส่งผลให้บอทที่ถูกละเมิดถูกตัดสิทธิ์
- คุณสามารถเขียนไปยังไฟล์ที่สร้างขึ้นเพื่อวัตถุประสงค์ในการจัดเก็บของรัฐ ไฟล์นี้จะต้องเก็บไว้ในไดเรกทอรีย่อยของไดเรกทอรีที่บอทของคุณอยู่
state
ไดเรกทอรีย่อยจะถูกตั้งชื่อ การเขียนไปยังส่วนอื่น ๆ ของระบบไฟล์ (นอกเหนือจากแหล่งที่มาของคุณเอง) ไม่ได้รับอนุญาต