Il s'agit d'un défi King of the Hill dans un tournoi à la ronde. C'est une bataille pour trouver le meilleur tireur de l'ouest!
Pour pouvoir participer à ce concours, vous devez créer deux fonctions. Le premier définit les attributs de votre tireur et le second est la fonction logique principale du tireur.
Fonction d'attribut
function () {
var bot = {
name: "testBot",
numbOfBullets: 7,
reloadSpeed: 1,
shotsPerTurn: 1,
moveSpeed: 2
}
return bot
}
La fonction d'attribut comprend 5 variables que vous devrez définir selon certaines règles (à l'exception de name
n'importe quelle chaîne). Vous devez dépenser au total exactement 15 points pour votre tireur - les tireurs qui ne dépensent pas les 15 points ne sont pas éligibles. Voici comment fonctionnent les attributs:
numbOfBullets
- définit le nombre de balles que contient votre arme.La valeur initiale et minimale
numbOfBullets
est de 1. Chaque balle supplémentaire coûte 1 point avec un maximum de 16 balles avec 15 points dépensés.reloadSpeed
- définit le nombre de tours dont votre tireur a besoin pour recharger son arme après avoir manqué de balles.La valeur de base et maximale est 4, le minimum étant 1. La diminution de 1 de cet attribut coûte 2 points.
shotsPerTurn
- définit combien de fois votre tireur peut tirer en un tour.La valeur de base et minimale est de 1. Chaque augmentation de 1 coûte 3 points, vous pouvez donc avoir un maximum de 6 tirs par tour avec 15 points dépensés. Augmenter cet attribut ci
numbOfBullets
- dessus est contre-productif car vous ne pouvez pas tirer plus de balles que votre arme peut tenir.moveSpeed
- définit le nombre d'espaces que votre tireur peut parcourir en un tour.La valeur de base et minimale est 1. Chaque augmentation de 1 coûte 3 points avec un maximum de 6 vitesses avec 15 points dépensés. Le tireur peut courir à gauche ou à droite à chaque tour jusqu'à un maximum de sa vitesse de déplacement. Il peut également rester immobile, ce qui lui donne un bonus (plus à ce sujet plus tard).
L'exemple de fonction ci-dessus a 6 points dépensés en balles, 6 points dépensés en vitesse de rechargement et 3 points dépensés en mouvement.
Fonction 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;
}
Paramètres:
bulletsLeft
, nombre de balles laissées dans votre armeyourShots
, il s'agit d'un tableau de tableaux de toutes les positions passées sur lesquelles votre tireur a tiré.Exemple pour un tireur qui peut tirer 1 balle par round:
[[12],[4],[22],...]
Exemple pour un tireur qui peut tirer 3 balles par round:
[[12,13,14],[11,15,16],[9,14],...]
enemyShots
- comme ci-dessus mais pour votre ennemiyourMovement
- un tableau de toutes vos positions de mouvement passéesenemyMovement
, comme ci-dessus mais pour votre ennemi
Ce que vous devez retourner:
Vous devez renvoyer une variable qui a 3 attributs:
shots
- une série de nombres qui déterminent à quel (s) espace (s) votre tireur tireramove
- un numéro unique qui détermine dans quel espace votre tireur tentera de se déplacerreload
- une valeur vraie / fausse avec laquelle vous pouvez faire recharger votre tireur
Le duel
Le concours suit un tournoi à la ronde 1 contre 1. Chaque tireur a 50 rounds contre tous les autres tireurs. Un tour dure jusqu'à ce que quelqu'un soit touché par une balle ou jusqu'à ce que 66 tours se soient écoulés (un tour est lorsque les deux joueurs ont tiré).
Le tireur peut gagner 2 points en tuant son adversaire, 1 point s'ils meurent tous les deux au même tour ou 0 point s'ils atteignent la limite de 66 tours. Le champ de tir est de 24 espaces de largeur (1-24 inclus). Pour frapper un joueur et gagner une manche, vous devez tirer sur le même espace que celui où il se trouve actuellement.
Voici un guide étape par étape sur le fonctionnement d'un duel. Cela couvre également toutes les commandes non valides et les règles spéciales:
- Au début de chaque duel, les deux joueurs sont placés sur l'espace 12 et leurs revolvers sont complètement chargés
- La fonction principale est appelée et le tireur fait sa première commande de mouvement et choisit où il veut tirer
- Les hommes armés se déplacent d'abord vers leur nouvel emplacement. Si une entrée non valide est effectuée à la commande de déplacement (positions inférieures à 1 ou supérieures à 24 ou si elles ont déplacé plus d'espaces, elles sont également autorisées), elles restent à la même position.
- Le prochain rechargement est vérifié, si vous avez manqué de balles le tour précédent ou que vous avez appelé vous recharger, votre tireur entre dans le cycle de rechargement. Il recharge pendant autant de tours que vous définissez votre
reloadSpeed
valeur. Si vous avez décidé de rester immobile (en retournant le même entier d'espace que celui où vous étiez avant ou en renvoyant simplement une valeur non valide), le compteur de rechargement descend pendant 2 tours au lieu d'un. - Maintenant, vérifiez vos valeurs de tir, chaque tour, vous pouvez entrer autant de lieux de tir que vous le souhaitez, ils seront toujours coupés à la quantité réelle valide qui est déterminée par: Le nombre de coups par tour et le nombre de balles dans votre revolver ( celui qui est le plus bas). Votre
shotsPerTurn
valeur est augmentée de 1 si vous décidez de rester immobile ce tour-ci, vous pouvez donc effectuer un tir supplémentaire si vous décidez de rester immobile. Si vous êtes dans le cycle de rechargement, vous avez 0 coups. Vient maintenant la prise de vue réelle, il y a 2 façons dont cela peut descendre. Si les deux tireurs ont la même statistique de vitesse, ils tirent tous les deux en même temps et peuvent tous les deux s'entretuer en même temps. Dans le cas où ils ont des statistiques de vitesse de déplacement différentes, le bot avec la stat de vitesse de déplacement la plus élevée commence à tirer en premier et s'il tue son adversaire, il gagne ce tour. Si le tireur peut tirer une ou plusieurs balles en un tour, il suit les mêmes règles que ci-dessus, sauf dans plusieurs cycles à titre d'exemple: disons que le bot1 a 3 balles et est plus rapide et que le bot 2 a 2 balles, alors cela se passerait comme ceci :
Bot1 shoots, Bot2 shoots cycle 1 Bot1 shoots, Bot2 shoots cycle 2 Bot1 shoots cycle 3
Cela aurait la même apparence s'ils avaient la même vitesse de déplacement que si maintenant Bot1 frappait Bot2 dans le même cycle, Bot2 pouvait également toucher Bot1 et ce serait une égalité.
RÈGLES
Je copie d'abord certaines règles de l'entrée de Calvin's Hobbies qui s'appliquent également ici.
Lors de la déclaration d'une nouvelle variable JavaScript, vous devez utiliser le mot clé var. En effet, une variable déclarée sans var devient globale plutôt que locale, il serait donc facile de jouer accidentellement (ou intentionnellement) avec le contrôleur ou de communiquer librement avec d'autres joueurs. Il doit être clair que vous n'essayez pas de tricher.
Lors de la déclaration de fonctions, il est préférable d'utiliser également le mot-clé var, c'est-à-dire d'utiliser var f = function(...) {...}
au lieu de function f(...) {...}.
je ne sais pas vraiment pourquoi, mais parfois cela semble faire une différence.
Dans votre code, vous ne pouvez pas ...
- tenter d'accéder ou de modifier le contrôleur ou le code d'un autre joueur.
- tenter de modifier quoi que ce soit intégré à JavaScript.
- faire des requêtes Web.
- faire des choses autrement malveillantes.
Mes règles supplémentaires:
- Les utilisateurs peuvent créer autant de tireurs qu'ils le souhaitent et modifier leurs fonctions à tout moment
- Je supprimerai toute entrée du jeu qui prend trop de temps ou essaie de tricher de la manière que je juge appropriée
- Les noms des attributs que votre fonction doit retourner doivent être les mêmes que dans les exemples avec la même structure!
Votre réponse doit être dans ce format, la première fonction étant la fonction attribut et la seconde étant la fonction logique. Notez que j'ai utilisé un point d'exclamation parce que si vous créez simplement de nouvelles lignes entre les blocs de code, l'analyseur ne verra pas deux blocs de code différents, vous devez donc utiliser n'importe quel symbole (utilisez simplement un point d'exclamation) pour les séparer:
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
Et voici le contrôleur: GAME CONTROLLER . Ouvrez simplement le lien et attendez que les robots se chargent, puis sélectionnez celui que vous voulez dans le combat (probablement tous) et appuyez sur le bouton de démarrage.
J'ai également mis un testbot comme réponse qui concourra, il sert également d'exemple sur la façon dont la structure de la réponse devrait ressembler. Remarque: si vous faites une petite erreur et modifiez votre réponse, l'algorithme stackexchanges peut ne pas le récupérer tout de suite et le site que le contrôleur utilise qui est généré par stackexchange n'est pas mis à jour (mais le fera plus tard ou si vous apportez des modifications plus importantes que je suggère) faire, ajoutez simplement du texte à la fin). Voici le site: codelink
la source
<!---->
pour séparer les blocs de code "de manière invisible" (sans le!
).Réponses:
Pandarus
Pandarus se fie à sa vitesse pour sortir du chemin des balles et utilise les mouvements précédents de l'ennemi pour deviner où ils vont aller.
la source
Un homme simple
Pas parfait à quoi que ce soit, mais assez bon à tout grâce à la puissance de moins, c'est plus.
la source
Test bot, ceci ajouté comme test de contrôle. Si quelqu'un y perd, vous devriez avoir honte :). Correction du comportement du bot, copie collée du mauvais bot de test (il est toujours resté sur le champ 12)
la source
la source
The Weaver
Plus soucieux de rester en vie que de tuer, il tisse d'avant en arrière, augmentant chaque fois sa distance. Choisit un endroit aléatoire dans la portée éprouvée des ennemis pour tirer.
la source
move = 12 + moveSpeed - 1;
est équivalent àmove = 11 + moveSpeed;
, non? Sinon, cela ressemble à un bon bot;)Alexander Hamilton
S'il ne gagne pas au premier tour, mourra probablement
!
la source
Aaron Burr
!
la source
L'ailier tire une propagation qui limite la portée des ennemis. Il court également vers les tirs ennemis.
Je vais juste laisser ça ici pour pousser la réinitialisation.
la source
SMG
Son arme est sa couverture. Malheureusement, cela semble bloquer sa vue. Il est également bon à profiter de l'immobilité pour recharger plus rapidement et obtenir des coups supplémentaires.
la source
la source
la source
Diephobus
Diephobus croit en tirant sans pitié des balles partout où il pense que son ennemi pourrait être, mais il est un peu lent.
la source
ASCIIGunInTheWest
Tire 2 coups par tour et devine où l'ennemi peut aller en fonction de la vitesse à laquelle il se déplace. Pardonnez-moi s'il y a des erreurs, je n'ai pas beaucoup codé en JavaScript.
!
EDIT: Apparemment, mon bot (juste le mien) ne peut pas être utilisé dans JSFiddle. Quelqu'un sait pourquoi c'est comme cela? J'utilise tous mes points pour mon tireur, donc je ne pense pas avoir été disqualifié.
la source