Hasilnya sudah masuk, kontes sudah berakhir.
Pemenangnya adalah EvilBot arshajii dengan 14 kemenangan di depan Neo-Bot dengan 13 kemenangan dan CentreBot dan LastStand dengan 11 kemenangan masing-masing.
Skor dari putaran terakhir
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)
Ini adalah tantangan raja-dari-bukit . Tujuannya adalah untuk menulis bot yang akan mengalahkan bot lainnya lebih dari yang lain.
Permainan
Semua bot akan diadu satu sama lain 2 pada satu waktu di arena 10x10 dengan tugas mengurangi energi lawan turun dari 10 ke 0 sebelum energinya sendiri dikurangi menjadi 0.
Setiap pertandingan akan terdiri dari 5 pertarungan. Pemenang pertandingan adalah pemenang pertarungan terbanyak. Jumlah total kemenangan pertandingan dan kemenangan pertarungan akan disimpan oleh program kontrol dan akan digunakan untuk menentukan pemenang kontes secara keseluruhan. Pemenang menerima tanda centang hijau besar dan pujian dari massa.
Setiap pertarungan akan berlangsung dalam sejumlah putaran. Pada awal setiap putaran, kondisi saat ini dari arena akan diberikan kepada masing-masing bot dan bot kemudian akan merespon dengan perintah untuk menentukan apa yang ingin dilakukan selanjutnya. Setelah kedua perintah diterima oleh program kontrol, kedua perintah dieksekusi pada waktu yang sama dan level energi arena dan bot diperbarui untuk mencerminkan status baru. Jika kedua bot masih memiliki energi yang cukup untuk melanjutkan permainan, lanjutkan ke babak berikutnya. Akan ada batas 1000 putaran per pertarungan untuk memastikan tidak ada pertarungan yang berlangsung selamanya, dan jika batas ini tercapai, pemenang akan menjadi bot dengan energi terbanyak. Jika kedua bot memiliki energi yang sama, pertarungan adalah seri dan kedua bot tidak akan mendapatkan poin untuk menang (itu akan seolah-olah mereka berdua kalah).
Senjata
Setiap bot akan memiliki sejumlah senjata:
- Peluru yang menembus armor. Ini berjalan 3 kotak pada satu waktu dan menyebabkan 1 titik energi kerusakan.
- Rudal. Ini berjalan 2 kotak pada satu waktu dan menyebabkan 3 titik energi kerusakan pada titik tumbukan, dan 1 titik kerusakan di semua kotak di sekitarnya.
- Ranjau darat. Ini dijatuhkan di salah satu kotak segera mengelilingi bot dan menyebabkan 2 titik energi kerusakan ketika diinjak, dan 1 titik energi kerusakan apa pun yang berdiri di salah satu kotak langsung di sekitarnya.
- Denyut elektro-magnetik. Menyebabkan kegagalan sirkuit gerak kedua bot selama 2 putaran, artinya mereka tidak bisa bergerak. Namun, mereka masih bisa menggunakan senjata (ya saya tahu itu tidak realistis, tapi itu permainan. Seharusnya bukan kehidupan nyata). Sunting: Setiap penyebaran EMP akan dikenakan biaya satu titik energi ke bot yang menggunakannya.
Peluru / misil hanya dapat berdampak dengan bot, atau dinding. Mereka akan mengenai bot yang ada di kotak mana pun yang mereka lalui. Mereka menghilang begitu mereka menabrak sesuatu.
Dalam semua kasus immediately surrounding squares
berarti 8 kotak yang dapat dipindahkan bot pada langkah selanjutnya - lingkungan Moore.
Perintahnya
0
tidak melakukan apapun.N
,NE
,E
,SE
,S
,SW
,W
,NW
Semua perintah arah dan memindahkan bot satu persegi di arah tertentu. Jika bot tidak dapat bergerak ke arah itu karena ada dinding atau bot lain di alun-alun, bot tetap di tempatnya. Pindah ke kotak yang sudah berisi peluru atau rudal adalah aman karena peluru / rudal akan dianggap sudah dalam perjalanan keluar dari kotak itu.B
diikuti oleh spasi dan kemudian salah satu perintah arah menembakkan peluru menembus zirah ke arah itu.M
diikuti oleh spasi dan kemudian salah satu perintah arah menembakkan rudal ke arah itu.L
diikuti oleh spasi dan kemudian salah satu perintah arah menjatuhkan ranjau darat di alun-alun di sebelah bot. Jika kotak sudah ditempati oleh dinding atau bot, perintah ini diabaikan. Jika ranjau darat dijatuhkan ke ranjau darat lain, ia meledakkannya. Ini akan merusak bot yang melakukan dropping, dan bot lainnya dalam jarak ranjau darat asli.P
menembakkan EMP.
Karena hanya satu perintah yang dapat diberikan per putaran, bot hanya bisa bergerak atau menembakkan / menggunakan senjata, tidak melakukan keduanya pada saat yang sama.
Urutan perintah
. Gerakan bot baik akan selalu didahulukan, dan semua gerakan akan dicoba dua kali untuk memperhitungkan bot lain berada di jalan tetapi bergerak keluar dari jalan.
Contoh
- Bot1 mencoba bergerak
E
tetapi Bot2 sudah ada di kotak itu - Program kontrol pindah ke Bot2.
- Bot2 mencoba bergerak
S
dan berhasil karena tidak ada yang menghalangi. - Bot1 mendapat upaya kedua dalam melakukan gerakannya. Kali ini berhasil dan Bot1 bergerak
E
.
Setelah bot melakukan gerakan apa pun yang mereka inginkan, senjata akan ditembakkan dan semua proyektil (baru dan yang sebelumnya ditembakkan) akan memindahkan jumlah kotak yang telah ditentukan sebelumnya.
Arena
Pada awal setiap putaran bot akan menerima status permainan saat ini sebagai satu-satunya argumen baris perintah program:
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
Arena hadir pertama kali terdiri dari 10 baris 10 karakter. Dikelilingi dengan dinding yang tidak ditampilkan. Arti karakter adalah sebagai berikut:
.
mewakili kotak kosongY
mewakili bot Anda.X
mewakili bot lawan.L
mewakili ranjau darat.B
mewakili peluru dalam penerbangan.M
mewakili sebuah rudal dalam penerbangan.
Ini diikuti oleh sisa energi bot, satu bot per baris. Hanya satu ruang yang akan memisahkan pengidentifikasi bot dari tingkat energinya. Seperti di arena, Y
mewakili bot Anda dan X
mewakili lawan Anda. Akhirnya muncul daftar proyektil dan ranjau darat, posisi mereka dan (jika perlu) pos, sekali lagi satu per baris.
Program kontrol
#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 kontrol akan memanggil bot Anda dari baris perintah. Karena alasan ini, program yang tidak dapat dipanggil dari baris perintah akan dianggap tidak valid . Saya meminta maaf kepada mereka yang bahasa pilihannya tidak bekerja seperti itu, tetapi melakukan setiap pertandingan secara manual tidak praktis.
intx13 telah menulis versi yang lebih baik dari program kontrol dengan beberapa perbaikan bug yang dapat Anda temukan di sini .
Saran untuk perbaikan atau perbaikan bug untuk program kontrol dipersilahkan.
Bot uji
Tak satu pun dari bot uji akan dimasukkan dalam penilaian berjalan. Mereka hanya untuk tujuan pengujian.
Dudley DoNowt (C)
int main(int argc, char *argv)
{
printf("0");
}
Tidak melakukan apa pun terlepas dari situasinya. Tidak diharapkan menang banyak.
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);
}
?>
Mencoba tepat di samping lawan. Rentan terhadap ranjau darat karena tidak mencari mereka. Membuat peluru kendali menjadi taktik yang kurang efektif untuk lawan saat mencapai tujuannya.
Hasil
Run skor akhir akan dilakukan setelah 23:59 pada 24 Maret 2014 . Saya akan menjalankan tes berjalan secara teratur sehingga pendatang dapat melihat bagaimana bot mereka menumpuk melawan oposisi saat ini.
Entri
Entri harus menyertakan sumber bot Anda, dan argumen baris perintah yang harus saya gunakan untuk menjalankannya. Anda boleh memposting sebanyak mungkin entri berbeda, tetapi setiap jawaban hanya boleh berisi satu bot.
Penting
Tampaknya beberapa entri ingin menulis ke disk untuk mempertahankan beberapa status di antara proses. Ini adalah aturan baru tentang penulisan ke disk.
- Anda dapat memodifikasi sumber bot Anda sendiri. Memodifikasi bot lain yang curang dan akan mengakibatkan bot menyinggung didiskualifikasi.
- Anda dapat menulis ke file yang dibuat untuk tujuan penyimpanan. File ini harus disimpan di subdirektori dari direktori tempat bot Anda berada. Subdirektori akan diberi nama
state
. Menulis ke bagian lain dari sistem file (selain dari sumber Anda sendiri) tidak diizinkan.