To wyzwanie króla wzgórza w okrągłym rudzie. To bitwa o znalezienie najlepszego rewolwerowca z zachodu!
Aby móc wziąć udział w tym konkursie, musisz wykonać dwie funkcje. Pierwszy ustawia atrybuty twojego strzelca, a drugi jest główną funkcją logiczną strzelca.
Funkcja atrybutu
function () {
var bot = {
name: "testBot",
numbOfBullets: 7,
reloadSpeed: 1,
shotsPerTurn: 1,
moveSpeed: 2
}
return bot
}
Funkcja atrybutu zawiera 5 zmiennych, które należy ustawić zgodnie z niektórymi regułami (z wyjątkiem tego, name
że może to być dowolny ciąg). Musisz wydać w sumie dokładnie 15 punktów na swojego bandytę - bandyci, którzy nie wydają wszystkich 15 punktów, nie kwalifikują się. Oto jak działają atrybuty:
numbOfBullets
- określa, ile kul trzyma broń.Początkowa i minimalna wartość
numbOfBullets
to 1. Każdy dodatkowy pocisk kosztuje 1 punkt, przy czym maksymalna to 16 pocisków z 15 wydanymi punktami.reloadSpeed
- określa, ile obrotów potrzebuje twój rewolwerowiec, aby przeładować broń, gdy zabraknie mu kul.Podstawowa i maksymalna wartość wynosi 4, przy czym minimum wynosi 1. Zmniejszenie tego atrybutu o 1 kosztuje 2 punkty.
shotsPerTurn
- określa, ile razy twój strzelec może strzelać w jednej turze.Podstawowa i minimalna wartość to 1. Każdy wzrost o 1 kosztuje 3 punkty, dzięki czemu możesz mieć maksymalnie 6 strzałów na rundę, wydając 15 punktów. Podniesienie powyższego atrybutu przynosi efekt
numbOfBullets
przeciwny do zamierzonego, ponieważ nie można strzelać więcej pocisków niż broń.moveSpeed
- określa, ile pól twój strzelec może uruchomić w jednej turze.Podstawowa i minimalna wartość to 1. Każdy wzrost o 1 kosztuje 3 punkty, maksymalnie 6 prędkości i 15 wydanych punktów. Rewolwerowiec może biec w lewo lub w prawo przy każdym zakręcie do maksymalnej prędkości ruchu. Może także stać w miejscu, co daje mu premię (więcej na ten temat później).
Powyższa przykładowa funkcja ma 6 punktów na pociski, 6 punktów na prędkość przeładowania i 3 punkty na ruch.
Główna funkcja
function main(bulletsLeft, yourShots, enemyShots, yourMovement, enemyMovement) {
var shots = [];
shots.push(Math.floor((Math.random() * 24) + 1));
var move = yourMovement[yourMovement.length - 1] + 2
var play = [];
play.shots = shots;
play.move = move;
play.reload = false;
return play;
}
Parametry:
bulletsLeft
, liczba pocisków pozostałych w twoim pistolecieyourShots
, jest to tablica tablic wszystkich poprzednich pozycji, na których strzelał strzelec.Przykład dla rewolwerowca, który może wystrzelić 1 kulę na rundę:
[[12],[4],[22],...]
Przykład dla rewolwerowca, który może wystrzelić 3 pociski w rundzie:
[[12,13,14],[11,15,16],[9,14],...]
enemyShots
- tak samo jak powyżej, ale dla twojego wrogayourMovement
- tablica wszystkich poprzednich pozycji ruchuenemyMovement
, jak wyżej, ale dla twojego wroga
Co musisz zwrócić:
Musisz zwrócić zmienną, która ma 3 atrybuty:
shots
- tablica liczb określająca, w którą przestrzeń / s strzelać będzie twój strzelecmove
- pojedyncza liczba określająca, na którą przestrzeń twój strzelec będzie próbował się przenieśćreload
- wartość prawda / fałsz, za pomocą której możesz ponownie załadować swojego rewolwerowca
Pojedynek
Zawody odbywają się według systemu robin round 1 versus 1. Każdy rewolwerowiec ma 50 rund przeciwko każdemu rewidentowi. Runda trwa, dopóki ktoś nie zostanie trafiony kulą lub nie upłynie 66 tur (tura następuje, gdy obaj gracze wystrzelili).
Rewolwerowiec może zdobyć 2 punkty, zabijając przeciwnika, 1 punkt, jeśli oboje zginą w tej samej turze lub 0 punktów, jeśli osiągną limit 66 tur. Pole do strzelania ma szerokość 24 pól (1-24 włącznie). Aby trafić gracza i wygrać rundę, musisz strzelać w to samo miejsce, w którym aktualnie stoi.
Oto przewodnik krok po kroku, jak działa pojedynek. Dotyczy to również wszystkich nieprawidłowych poleceń i zasad specjalnych:
- Na początku każdego pojedynku obaj gracze są umieszczani na polu 12, a ich rewolwery są w pełni załadowane
- Wywoływana jest główna funkcja, a napastnik wykonuje polecenie pierwszego ruchu i wybiera miejsce, w którym chce strzelać
- Najpierw bandyci przeprowadzają się do nowej lokalizacji. Jeśli w komendzie ruchu wprowadzono nieprawidłowe dane (pozycje niższe niż 1 lub wyższe niż 24 lub przesunęły się o więcej spacji, wówczas są również dozwolone), pozostają na tej samej pozycji.
- Następne przeładowanie jest sprawdzane, jeśli zabrakło ci pocisków w poprzedniej turze lub sam wezwałeś przeładowanie, twój strzelec przechodzi do cyklu przeładowania. Przeładowuje tyle tur, ile wyznaczysz swoją
reloadSpeed
wartość. Jeśli zdecydowałeś się stać w miejscu (zwracając tę samą liczbę całkowitą, co na której stoiłeś przed lub po prostu zwracałeś niepoprawną wartość), licznik przeładowania spada na 2 tury zamiast jednej. - Teraz nadchodzi sprawdzanie twoich wartości strzelania, za każdym razem, kiedy możesz wprowadzić tyle miejsc strzelania, ile chcesz, zawsze zostaną one odcięte do rzeczywistej prawidłowej ilości, która jest określona przez: liczbę strzałów na turę i liczbę pocisków w rewolwerze ( którykolwiek jest niżej). Twoja
shotsPerTurn
wartość wzrasta o 1, jeśli zdecydujesz się nie ruszać w tej turze, więc możesz wykonać dodatkowy strzał, jeśli zdecydujesz się nie ruszać. Jeśli jesteś w cyklu przeładowania, masz 0 strzałów. Teraz nadchodzi faktyczne strzelanie, istnieją 2 sposoby, aby to zejść. Jeśli obaj strzelcy mają tę samą statystykę prędkości ruchu, wówczas strzelają w tym samym czasie i mogą zabić się nawzajem w tym samym czasie. W przypadku, gdy mają różne statystyki prędkości, bot o wyższej prędkości ruchu zaczyna strzelać jako pierwszy, a jeśli zabije przeciwnika, wygrywa w tej rundzie. Jeśli rewolwerowiec może wystrzelić jeden lub więcej pocisków w jednej rundzie, wówczas stosuje się te same zasady, co powyżej, z wyjątkiem większej liczby cykli jako przykładu: Załóżmy, że bot1 ma 3 pociski i jest szybszy, a bot 2 ma 2 pociski, to wyglądałoby to tak: :
Bot1 shoots, Bot2 shoots cycle 1 Bot1 shoots, Bot2 shoots cycle 2 Bot1 shoots cycle 3
To wyglądałoby tak samo, gdyby mieli taką samą prędkość ruchu tylko tyle, że jeśli teraz Bot1 uderzył Bot2 w tym samym cyklu Bot2 mógłby również trafić Bot1 i byłby remis.
ZASADY
Najpierw kopiuję niektóre zasady z wpisu Calvina Hobby'ego, które również obowiązują tutaj.
Deklarując nową zmienną JavaScript, musisz użyć słowa kluczowego var. Wynika to z faktu, że zmienna zadeklarowana bez var staje się globalna, a nie lokalna, więc łatwo byłoby przypadkowo (lub celowo) zepsuć kontroler lub swobodnie komunikować się z innymi graczami. Musi być jasne, że nie próbujesz oszukiwać.
Podczas deklarowania funkcji najlepiej jest również użyć słowa kluczowego var, tzn. Użyj var f = function(...) {...}
zamiast tego function f(...) {...}.
nie jestem do końca pewien, dlaczego, ale czasem wydaje się, że to robi różnicę.
W swoim kodzie nie możesz ...
- próba dostępu lub modyfikacji kontrolera lub kodu innego gracza.
- próba modyfikacji czegokolwiek wbudowanego w JavaScript.
- tworzyć zapytania internetowe.
- rób inne złośliwe rzeczy.
Moje dodatkowe zasady:
- Użytkownicy mogą utworzyć dowolną liczbę bandytów i zmieniać ich funkcje na dowolny okres czasu
- Usunę każdy wpis z gry, który zajmuje zbyt dużo czasu lub próbuje oszukiwać w dowolny sposób, który uważam za odpowiedni
- Nazwy atrybutów, które funkcja musi zwrócić, muszą być takie same jak w przykładach o tej samej strukturze!
Twoja odpowiedź powinna być w tym formacie, pierwsza funkcja jest funkcją atrybutu, a druga funkcją logiczną. Zauważ, że użyłem wykrzyknika, ponieważ jeśli utworzysz nowe linie między blokami kodu, parser nie zobaczy dwóch różnych bloków kodu, więc musisz użyć dowolnego symbolu (po prostu wykrzyknika), aby je rozdzielić:
var bot = {
name: "testBot",
numbOfBullets: 7,
reloadSpeed: 1,
shotsPerTurn: 1,
moveSpeed: 2
}
return bot
var shots = []
var testBot_moveUp = true
if(Math.random() * 2 > 1)
testBot_moveUp = false
shots.push(Math.floor((Math.random() * 24) + 1))
var move = 0
if (testBot_moveUp)
move = yourMovement[yourMovement.length - 1] + 2
else
move = yourMovement[yourMovement.length - 1] - 2
move = 12
var play = []
play.shots = shots
play.move = move
play.reload = false
return play
A oto kontroler: GAME CONTROLLER . Po prostu otwórz link i poczekaj na załadowanie botów, a następnie wybierz, który chcesz w walce (prawdopodobnie wszystkie) i naciśnij przycisk Start.
Podaję również testbota jako moją odpowiedź, która będzie konkurować, służy również jako przykład tego, jak powinna wyglądać struktura odpowiedzi. Uwaga: jeśli popełnisz niewielki błąd i zredagujesz swój algorytm zmiany stosu, może go nie wykryć od razu, a witryna, z której korzysta kontroler wygenerowana przez stackexchange, nie zostanie zaktualizowana (ale zrobi to później lub wprowadzisz większe zmiany, które sugeruję robiąc, po prostu dodaj tekst na końcu). Oto strona: codelink
<!---->
do oddzielenia bloków kodu „niewidocznie” (bez !
).