Este es un desafío de King of the Hill en un round robin. ¡Es una batalla encontrar al mejor pistolero del oeste!
Para poder competir en este concurso necesitas hacer dos funciones. El primero establece los atributos de su pistolero y el segundo es la función lógica principal para el pistolero.
Función de atributo
function () {
var bot = {
name: "testBot",
numbOfBullets: 7,
reloadSpeed: 1,
shotsPerTurn: 1,
moveSpeed: 2
}
return bot
}
La función de atributo incluye 5 variables que deberá establecer de acuerdo con algunas reglas (con la excepción de name
que puede ser cualquier cadena). Debe gastar un total de exactamente 15 puntos en su pistolero; los pistoleros que no gastan los 15 puntos no son elegibles. Así es como funcionan los atributos:
numbOfBullets
- define cuántas balas tiene tu arma.El valor inicial y mínimo de
numbOfBullets
es 1. Cada bala adicional cuesta 1 punto, siendo el máximo 16 balas con 15 puntos gastados.reloadSpeed
- define cuántos turnos necesita su pistolero para recargar su arma después de que se quede sin balas.El valor base y máximo es 4, siendo el mínimo 1. Disminuir este atributo en 1 cuesta 2 puntos.
shotsPerTurn
- define cuántas veces tu pistolero puede disparar en un turno.El valor base y mínimo es 1. Cada aumento de 1 cuesta 3 puntos, por lo que puede tener un máximo de 6 disparos por ronda con 15 puntos gastados. Elevar este atributo arriba
numbOfBullets
es contraproducente ya que no puedes disparar más balas de las que tu arma puede contener.moveSpeed
- define cuántos espacios puede ejecutar tu pistolero en un turno.El valor base y mínimo es 1. Cada aumento en 1 cuesta 3 puntos con un máximo de 6 velocidades con 15 puntos gastados. El pistolero puede correr hacia la izquierda o hacia la derecha cada vuelta hasta un máximo de su velocidad de movimiento. También puede quedarse quieto, lo que le da una bonificación (más sobre esto más adelante).
La función de ejemplo anterior tiene 6 puntos gastados en balas, 6 puntos gastados en velocidad de recarga y 3 puntos gastados en movimiento.
Función principal
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;
}
Parámetros:
bulletsLeft
, número de balas que quedan en tu armayourShots
, esta es una serie de matrices de todas las posiciones anteriores a las que ha disparado su pistolero.Ejemplo para un pistolero que puede disparar 1 bala por ronda:
[[12],[4],[22],...]
Ejemplo para un pistolero que puede disparar 3 balas por ronda:
[[12,13,14],[11,15,16],[9,14],...]
enemyShots
- igual que el anterior pero para tu enemigoyourMovement
- una variedad de todas tus posiciones de movimiento pasadasenemyMovement
, igual que el anterior pero para tu enemigo
Lo que necesitas devolver:
Debe devolver una variable que tiene 3 atributos:
shots
- una serie de números que determinan en qué espacio / s disparará su pistoleromove
- un número único que determina a qué espacio intentará moverse tu pistoleroreload
- un valor verdadero / falso con el que puedes hacer que tu pistolero vuelva a cargar
El duelo
El concurso sigue un sistema round robin 1 versus 1. Cada pistolero tiene 50 rondas contra cualquier otro pistolero. Una ronda dura hasta que alguien es alcanzado por una bala o hasta que hayan pasado 66 turnos (un turno es cuando ambos jugadores han disparado).
El pistolero puede ganar 2 puntos matando a su oponente, 1 punto si ambos mueren en el mismo turno o 0 puntos si alcanzan el límite de 66 turnos. El campo de tiro es de 24 espacios de ancho (1-24 inclusive). Para golpear a un jugador y ganar una ronda, debes disparar al mismo espacio en el que está parado actualmente.
Aquí hay una guía paso a paso sobre cómo funciona un duelo. Esto también cubre todos los comandos no válidos y reglas especiales:
- Al comienzo de cada duelo, ambos jugadores se colocan en el espacio 12 y sus revólveres están completamente cargados.
- Se llama a la función principal y el pistolero realiza su primer comando de movimiento y elige dónde quiere disparar
- Primero los pistoleros se mudan a su nueva ubicación. Si se realiza una entrada no válida en el comando de movimiento (las posiciones inferiores a 1 o superiores a 24 o movieron más espacios, entonces también se les permite) permanecen en la misma posición.
- La próxima recarga se verifica, si te quedaste sin balas el turno anterior o si llamaste a recargar tu arma, el pistolero entra en el ciclo de recarga. Él está recargando por tantos turnos como establezca su
reloadSpeed
valor. Si decidió quedarse quieto (devolviendo el mismo número entero de espacio que estaba parado antes o simplemente devolviendo un valor no válido), el contador de recarga se cae durante 2 turnos en lugar de uno. - Ahora viene verificando sus valores de disparo, cada turno en el que puede ingresar tantos lugares de disparo como desee siempre se cortará a la cantidad válida real que se determina por: El número de disparos por turno y el número de balas en su revólver ( el que sea más bajo). Su
shotsPerTurn
valor aumenta en 1 si decide quedarse quieto este turno, por lo que puede hacer un tiro extra si decide quedarse quieto. Si estás en el ciclo de recarga tienes 0 disparos. Ahora viene el tiroteo real, hay 2 formas en que esto puede disminuir. Si ambos pistoleros tienen la misma estadística de velocidad de movimiento, ambos disparan al mismo tiempo y ambos pueden matarse entre sí al mismo tiempo. En el caso de que tengan estadísticas de velocidad de movimiento diferentes, el bot con la estadística de velocidad de movimiento más alta comienza a disparar primero y si mata a su oponente, gana esta ronda. Si el pistolero puede disparar una o más balas en una ronda, entonces sigue las mismas reglas que anteriormente, excepto en más ciclos como ejemplo: Digamos que bot1 tiene 3 balas y es más rápido y bot 2 tiene 2 balas, entonces sería así :
Bot1 shoots, Bot2 shoots cycle 1 Bot1 shoots, Bot2 shoots cycle 2 Bot1 shoots cycle 3
Esto se vería igual si tuvieran la misma velocidad de movimiento solo que si ahora Bot1 golpeara a Bot2 en el mismo ciclo, Bot2 también podría golpear a Bot1 y sería un empate.
REGLAS
Primero estoy copiando algunas reglas de la entrada de Calvin's Hobbies que también se aplican aquí.
Al declarar una nueva variable de JavaScript, debe usar la palabra clave var. Esto se debe a que una variable declarada sin var se convierte en global en lugar de local, por lo que sería fácil meterse accidentalmente (o intencionalmente) con el controlador o comunicarse libremente con otros jugadores. Tiene que estar claro que no estás tratando de hacer trampa.
Al declarar funciones, es mejor usar también la palabra clave var, es decir, usar en var f = function(...) {...}
lugar de function f(...) {...}.
no estoy completamente seguro de por qué, pero a veces parece hacer la diferencia.
En su código no puede ...
- intenta acceder o modificar el controlador u otro código de jugador.
- Intente modificar cualquier cosa integrada en JavaScript.
- hacer consultas web
- hacer cosas maliciosas de otra manera.
Mis reglas adicionales:
- Los usuarios pueden crear tantos hombres armados como quieran y cambiar sus funciones por cualquier período de tiempo
- Eliminaré cualquier entrada del juego que tome una cantidad excesiva de tiempo o intente hacer trampa de la manera que me parezca adecuada.
- ¡Los nombres de los atributos que su función necesita devolver deben ser los mismos que en los ejemplos con la misma estructura!
Su respuesta debe estar en este formato, la primera función es la función de atributo y la segunda es la función lógica. Tenga en cuenta que usé un signo de exclamación porque si solo hace nuevas líneas entre los bloques de código, el analizador no verá dos bloques de código diferentes, por lo que debe usar cualquier símbolo (solo use un signo de exclamación) para separarlos:
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
Y aquí está el controlador: CONTROLADOR DE JUEGO . Simplemente abra el enlace y espere a que se carguen los bots, luego seleccione cuál desea en la pelea (probablemente todos) y presione el botón de inicio.
También puse un testbot como mi respuesta, que competirá, también sirve como un ejemplo de cómo debería ser la estructura de la respuesta. Como nota, si comete un pequeño error y edita su respuesta, es posible que el algoritmo de stackexchanges no lo recupere de inmediato y el sitio que usa el controlador que se genera mediante stackexchange no se actualiza (pero lo hará más tarde o si realiza cambios más grandes, lo que sugiero haciendo, solo agregue algo de texto al final). Aquí está el sitio: codelink
<!---->
para separar los bloques de código "invisiblemente" (sin el !
).