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
źródło
Odpowiedzi:
Obrońca
Defender używa nowego rodzaju obrony: rakiety patrolują przed gniazdami. Daje to ogromną przewagę, ponieważ rakiety żyją przez 100 tur zamiast 5 tur (jak eksplozje).
źródło
Zygzak
Zewnętrzne miejsca mają szerokość (nieco) szeroką, następnie skieruj się do przodu i wróć w kierunku miejsc wroga. Środkowy otwór wystrzeliwuje zygzakowaty wzór w górę środka.
Co drugą rundę (3 tury) przechodzi w tryb obrony i po prostu eksploduje kilka rakiet w pobliżu moich miejsc. Rakiety w trybie ataku następnie ominą je. Nic nadzwyczajnego, po prostu coś, co umożliwi uruchomienie konkursu.
źródło
Terminator
Z dumą prezentuję Terminator !!!
Każda rakieta porusza się daleko w lewo / prawo od środka i wraca na miejsce wroga. Co dwie tury rakieta obronna wystrzeliwuje prosto i eksploduje w pobliżu szczeliny, aby ją chronić.
źródło
HatTrickBot
Miałem DoubleTapBota dla CodeBot 3, który uderzał dwa razy na turę, oto HatTrickBot: trafienie wszystkich 3 miejsc jednocześnie!
Zawsze można zapobiec trafieniu rakiety, jeśli wiesz, gdzie spadnie. Ale nie sądzę, aby wielu botów mogło zabezpieczyć swoje automaty przed atakiem 3 rakiet.
Nawiasem mówiąc, tak, okropnie jest widzieć takie coś przy powtarzającym się przełączaniu. Mógłbym stworzyć var do włączania z unikalnymi wartościami dla każdej kombinacji statusu slotów i turnConter. Ale trudniej byłoby go odczytać (musiałbym zachować znaczenie wartości w komentarzu ... nudne!) :)
źródło
Żółw
Jeśli ochronię wszystkie moje bazy, mam 3 punkty. Bazy mogą być atakowane tylko z 5 lokalizacji, jeśli dobrze dostanę siatkę. Rakieta trwa 5 tur na boisku ...
Ten bot wykorzystuje to wszystko, aby osiągnąć swój cel: przetrwać z co najmniej 50% punktów w kieszeni. Wystrzeliwuje 3 rakiety, a następnie się osłania
źródło
SideShooter
Najpierw strzelaj przez pierwszą (skrajnie prawą) wieżę na jeden z dwóch różnych sposobów. Następnie strzela przez ostatnią (skrajnie lewą) wieżę na jeden z dwóch różnych sposobów. Następnie tworzy „ścianę” z drugą (środkową) wieżą, eksplodując rakiety przed każdą wieżą. Ten proces się powtarza.
Jeśli gra trwa dłużej niż 30 tur, SideShooter znudzi się i zmienia w niewielkim stopniu. Zamiast robić „ścianę” za pomocą drugiej (środkowej) wieży, strzela prosto. Reszta wieżyczek zachowuje się w ten sam sposób.
źródło
do...while
oświadczenie zrobić nieskończoną pętlę ...Snajper
Snajper najpierw blokuje dwie strony, a następnie zaczyna strzelać prosto.
źródło
Three Shot
Mamy dziwne ujęcia. Nie ma prawdziwej obrony, ale wzór jest taki, że ciężko będzie strzelić obok tego dziwnego gradu pocisków. (lub taki jest pomysł. najprawdopodobniej nie zadziała).
Uwaga
źródło
WięcejDakka
Dalka strzela w pięciu kierunkach bez zatrzymania (dopóki wieżyczki nie zostaną zniszczone przez inne pociski).
źródło
StraightShot
Po prostu strzelaj do nich.
źródło
Oto mój własny wpis
WallE
Wystrzeliwuje niektóre rakiety offsetowe i buduje ściany na jego krawędziach i środku. Po 100 turach zaczyna celować w środkowe miejsce.
źródło