Questa è una sfida di King of the Hill in un round robin. È una battaglia per trovare il miglior uomo armato dell'ovest!
Per poter competere in questo concorso è necessario svolgere due funzioni. Il primo imposta gli attributi del tuo uomo armato e il secondo è la principale funzione logica per l'uomo armato.
Funzione di attributo
function () {
var bot = {
name: "testBot",
numbOfBullets: 7,
reloadSpeed: 1,
shotsPerTurn: 1,
moveSpeed: 2
}
return bot
}
La funzione di attributo include 5 variabili che dovrai impostare in base ad alcune regole (ad eccezione di name
ciò che può essere qualsiasi stringa). Devi spendere un totale di esattamente 15 punti sul tuo pistolero - i pistoleri che non spendono tutti i 15 punti non sono ammissibili. Ecco come funzionano gli attributi:
numbOfBullets
- definisce quanti proiettili contiene la tua pistola.Il valore iniziale e minimo di
numbOfBullets
è 1. Ogni proiettile aggiuntivo costa 1 punto con un massimo di 16 proiettili con 15 punti spesi.reloadSpeed
- definisce il numero di giri necessari al tuo uomo armato per ricaricare la pistola dopo aver finito i proiettili.Il valore base e massimo è 4 con il minimo pari a 1. Diminuire questo attributo di 1 costa 2 punti.
shotsPerTurn
- definisce quante volte il tuo sicario può sparare in un turno.Il valore base e minimo è 1. Ogni aumento di 1 costa 3 punti in modo da poter avere un massimo di 6 colpi per round con 15 punti spesi. Aumentare questo attributo sopra
numbOfBullets
è controproducente poiché non puoi sparare più proiettili di quanto la tua pistola possa contenere.moveSpeed
- definisce quanti spazi il tuo pistolero può percorrere in un turno.Il valore base e minimo è 1. Ogni aumento di 1 costa 3 punti con un massimo di 6 velocità con 15 punti spesi. Il pistolero può correre a sinistra oa destra ogni turno fino a un massimo della sua velocità di movimento. Può anche stare fermo, il che gli dà un bonus (ne parleremo più avanti).
La funzione di esempio sopra ha 6 punti spesi per i proiettili, 6 punti per la velocità di ricarica e 3 punti per i movimenti.
Funzione principale
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;
}
parametri:
bulletsLeft
, numero di proiettili rimasti nella pistolayourShots
, questa è una serie di array di tutte le posizioni passate a cui il tuo sicario ha sparato.Esempio per un uomo armato che può sparare 1 proiettile per round:
[[12],[4],[22],...]
Esempio per un uomo armato che può sparare 3 proiettili per round:
[[12,13,14],[11,15,16],[9,14],...]
enemyShots
- come sopra ma per il tuo nemicoyourMovement
- una serie di tutte le posizioni di movimento passateenemyMovement
, come sopra ma per il tuo nemico
Cosa devi restituire:
È necessario restituire una variabile con 3 attributi:
shots
- una serie di numeri che determinano a quale spazio / i il tuo uomo armato spareràmove
- un singolo numero che determina in quale spazio il tuo uomo armato cercherà di spostarsireload
- un valore vero / falso con cui è possibile ricaricare il pistolero
Il duello
Il concorso segue un round robin 1 contro 1 sistema. Ogni uomo armato ha 50 colpi contro ogni altro uomo armato. Un round dura fino a quando qualcuno viene colpito da un proiettile o fino a quando sono passati 66 turni (un turno è quando entrambi i giocatori hanno sparato).
Il pistolero può guadagnare 2 punti uccidendo il suo avversario, 1 punto se entrambi muoiono nello stesso turno o 0 punti se raggiungono il limite di 66 turni. Il campo di tiro ha una larghezza di 24 spazi (1-24 inclusi). Per colpire un giocatore e vincere un round devi sparare nello stesso spazio in cui si trova attualmente.
Ecco una guida passo passo su come funziona un duello. Questo copre anche tutti i comandi non validi e le regole speciali:
- All'inizio di ogni duello entrambi i giocatori vengono messi nello spazio 12 e i loro revolver sono completamente carichi
- Viene chiamata la funzione principale e l'uomo armato fa il primo comando di mossa e sceglie dove vuole sparare
- Prima gli uomini armati si spostano nella loro nuova posizione. Se viene immesso un input non valido al comando di spostamento (posizioni inferiori a 1 o superiori a 24 o spostate di più spazi, allora anche loro sono autorizzati) rimangono nella stessa posizione.
- La ricarica successiva viene verificata, se hai finito i proiettili nel turno precedente o hai chiamato ricaricare te stesso, il tuo uomo armato entra nel ciclo di ricarica. Sta ricaricando per tutti i turni quanti hai impostato il tuo
reloadSpeed
valore. Se hai deciso di rimanere fermo (restituendo lo stesso numero intero di spazio in cui ti trovavi prima o semplicemente restituendo un valore non valido) ricarichi il contatore scende per 2 turni invece di uno. - Ora viene il controllo dei tuoi valori di tiro, ogni turno in cui puoi inserire tutte le posizioni di tiro che desideri verranno sempre tagliati all'importo effettivo effettivo determinato da: Il numero di colpi per turno e il numero di proiettili nel tuo revolver ( qualunque sia inferiore). Il tuo
shotsPerTurn
valore aumenta di 1 se decidi di rimanere fermo in questo turno, quindi puoi fare un tiro in più se decidi di rimanere fermo. Se sei nel ciclo di ricarica hai 0 colpi. Ora arriva il vero tiro, ci sono 2 modi in cui questo può andare giù. Se entrambi i pistoleri hanno la stessa velocità di mossa, entrambi sparano contemporaneamente e possono entrambi uccidersi contemporaneamente. Nel caso in cui abbiano diverse statistiche di velocità di movimento, il bot con la statistica di velocità di movimento più alta inizia a sparare per primo e se uccide il suo avversario vince questo round. Se il pistolero può sparare uno o più proiettili in un round, segue le stesse regole di cui sopra, tranne in più cicli come un esempio: supponiamo che bot1 abbia 3 proiettili ed sia più veloce e bot 2 abbia 2 proiettili, andrebbe così :
Bot1 shoots, Bot2 shoots cycle 1 Bot1 shoots, Bot2 shoots cycle 2 Bot1 shoots cycle 3
Sarebbe lo stesso se avessero la stessa velocità di mossa solo che se adesso Bot1 colpisse Bot2 nello stesso ciclo Bot2 potrebbe anche colpire Bot1 e sarebbe un pareggio.
REGOLE
Innanzitutto sto copiando alcune regole dalla voce di Calvin's Hobbies che si applicano anche qui.
Quando si dichiara una nuova variabile JavaScript, è necessario utilizzare la parola chiave var. Questo perché una variabile dichiarata senza var diventa globale piuttosto che locale, quindi sarebbe facile confondere accidentalmente (o intenzionalmente) con il controller o comunicare liberamente con altri giocatori. Deve essere chiaro che non stai cercando di imbrogliare.
Quando si dichiarano le funzioni è meglio usare anche la parola chiave var, ovvero usare var f = function(...) {...}
invece di function f(...) {...}.
non sono del tutto sicuro del perché, ma a volte sembra fare la differenza.
Nel tuo codice potresti non ...
- tentare di accedere o modificare il controller o il codice di un altro giocatore.
- tenta di modificare tutto ciò che è incorporato in JavaScript.
- fare query web.
- fare cose altrimenti dannose.
Le mie regole aggiuntive:
- Gli utenti possono creare tutti i pistoleri che desiderano e modificare le loro funzioni per qualsiasi periodo di tempo
- Rimuoverò qualsiasi voce dal gioco che impieghi troppo tempo o cerchi di imbrogliare nel modo che ritengo opportuno
- I nomi degli attributi che la tua funzione deve restituire deve essere la stessa degli esempi con la stessa struttura!
La tua risposta dovrebbe essere in questo formato, la prima funzione è la funzione di attributo e la seconda è la funzione logica. Si noti che ho usato un punto esclamativo perché se si creano solo nuove righe tra blocchi di codice, il parser non vedrà due diversi blocchi di codice, quindi è necessario utilizzare qualsiasi simbolo (basta usare un punto esclamativo) per separarli:
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
Ed ecco il controller: GAME CONTROLLER . Basta aprire il collegamento e attendere il caricamento dei robot, quindi selezionare quello che si desidera nel combattimento (probabilmente tutti) e premere il pulsante di avvio.
Ho anche inserito un testbot come risposta che competerà, serve anche da esempio su come dovrebbe apparire la struttura della risposta. Come nota, se commetti un piccolo errore e modifichi la tua risposta l'algoritmo stackexchanges potrebbe non rilevarlo immediatamente e il sito che il controller utilizza generato da stackexchange non viene aggiornato (ma lo farà più tardi o se apporti modifiche più grandi che suggerisco facendo, basta aggiungere un po 'di testo alla fine). Ecco il sito: codelink
<!---->
per separare i blocchi di codice "invisibilmente" (senza il !
).