Rakietowe boty
Jest rok 3024. Ludzie stali się zbyt rzadkim zasobem, aby ryzykować wojną, więc walka przeniosła się na roboty. Twoim zadaniem jest zbudowanie bota, jak żaden inny, którego rakiety spowodują zniszczenie wrogów i zestrzelą wszystkie nadchodzące zagrożenia.
Rozgrywka
Boty
Rozgrywka odbywa się na siatce 10 x 15. Twój bot znajduje się poza dolną krawędzią i ma trzy miejsca w punktach 6,7 i 8 siatki. Twój przeciwnik znajduje się na górze siatki, a trzy miejsca znajdują się naprzeciwko twojego.
Rakiety
Z dowolnego z tych miejsc możesz wystrzelić rakietę, zakładając, że nie został on zniszczony. Rakieta składa się z listy kierunków, która jest jej przekazywana podczas tworzenia, a po wystrzeleniu tych kierunków nie można zmienić. W każdej turze rakieta zjedzie górę listy i ruszy w tym kierunku. Rakiety poruszają się jednocześnie. Jeśli dwie rakiety zakończą się tym samym kafelkiem, obie eksplodują. Jeśli rakiety zabraknie poleceń, wybuchnie. Jeśli rakiety zabraknie paliwa, po 100 ruchach eksploduje. Kiedy rakieta eksploduje, pozostanie w tym kafelku przez 5 tur, powodując również eksplozję wszystkich innych rakiet, które się tam poruszą.
Uwaga: Z powodu jednoczesnego ruchu dwie rakiety mogą przelatywać między sobą bez eksplozji, o ile obie nie kończą tury na tym samym kafelku.
Cel
Celem każdego meczu jest zniszczenie miejsc przeciwników przy jednoczesnym utrzymaniu twojego przy życiu. Rakietę można wystrzelić z dowolnego posiadanego automatu na żywo, a przed wystrzeleniem ma ona wyznaczoną przez ciebie ścieżkę. Strzelasz rakietą co drugą turę, co oznacza, że rakiety poruszą się dwukrotnie, zanim będziesz mógł wystrzelić kolejną. Pojedynek trwa 200 tur lub do momentu zniszczenia jednego z botów.
Punktacja
Na koniec meczu otrzymujesz jeden punkt za każde miejsce na żywo, które posiadasz, i jeden punkt za każde miejsce przeciwnika, które zniszczyłeś. Oznacza to, że jest to gra o sumie zerowej, a za każdy mecz zostanie przyznanych 6 punktów.
Uruchomiony zostanie okrągły robin, dzięki czemu każdy bot skierowany będzie do siebie. Jeśli któryś z botów używa RNG, każdy pojedynek będzie zamiast tego 1000 pojedynkami.
Realizacja
Kod konkursu można znaleźć tutaj: https://github.com/Cain93/RocketBots
Każde zgłoszenie powinno rozszerzyć Bot
klasę. Musisz zastąpić fireRocket
metodę. Ta metoda otrzymuje tablicę siatki Rakiet Rocket[][]
, która reprezentuje planszę. Jesteś zawsze znajduje się w dolnej części siatki, z otworami w miejscach [-1][6]
, [-1][7]
, [-1][8]
. Na siatce będą wyświetlane niezajęte miejsca null
. Jeśli rakieta istnieje na kafelku, możesz zidentyfikować, do kogo należy, wchodząc na dis
pole. „^” to twoja rakieta, a „v” to twoi przeciwnicy.
Musisz zwrócić LinkedList of Integers, który podaje instrukcje dla twojej rakiety. Aby przejść w górę, użyj 0. Aby poruszać się w górę i w prawo, użyj 1, w prawo, użyj 2 itd. Aż do 7 w górę i w lewo. Rakieta porusza się w kolejności, w której naciskasz liczby całkowite. Na przykład poniższy kod spowoduje, że rakieta przesunie się w górę o kilka obrotów, zygzakiem o kilka obrotów, a następnie wybuchnie.
LinkedList<Integer> moves = new LinkedList<Integer>();
moves.push(0);
moves.push(0);
moves.push(0);
moves.push(1);
moves.push(7);
moves.push(1);
moves.push(7);
Aby zmienić, z którego miejsca wystrzelić rakietę, zmień curSlot
pole. 0 to twój lewy skraj, a 2 to twój skrajny prawy. Aby sprawdzić, czy miejsce jest zniszczone, użyj getSlot(int slotNumber)
.
Jeśli rakieta zakończy turę na polu, miejsce to zostanie zniszczone. Nie musisz ręcznie detonować rakiety.
Uwaga: Rakiety spawnują się w miejscu, z którego wystrzelono miejsce, ale poruszą się raz, zanim zostaną ocenione kolizje. Jeśli więc wystrzelisz rakietę ze szczeliny 0, a pierwszy ruch jest właściwy (2), zniszczysz swój środkowy otwór. Jednak strzałka w górę i w prawo (1) to bezpieczny ruch.
Jeśli chcesz nazwać swojego bota, zastąp name()
metodę.
Boty zostaną odbudowane dla każdego pojedynku, więc wszelkie zmienne statyczne zostaną zresetowane.
Powodzenia!
Niech wasze rakiety latają prawdziwie, a przeciwnicy będą tylko tlącymi się skrawkami metalu.
Wskazówka:
Celowe detonowanie rakiet w celu wywołania eksplozji jest łatwiejszym sposobem obrony niż próba zestrzelenia rakiet przeciwnika.
Przykład Bot
package bots;
import java.util.LinkedList;
import mechanics.*;
public class SimpleBot extends Bot {
public String name(){
return "Simple";
}
public LinkedList<Integer> fireRocket(Rocket[][] g){
LinkedList<Integer> l = new LinkedList<Integer>();
for(int i = 0; i < 12; i++){
l.push(0);
}
return l;
}
}
Wyniki
Wyniki od 6-24
Simple: 900
Zigzagoon: 3654
Wall-E: 3606
Tortoise: 2248
3 Shot: 2334
HatTrickBot: 4287
Sniper: 2973
SideShooter: 2491
Terminator: 4835
StraightShot: 3378
Defender: 4570
MoreDakka: 4324