# KoTH: Wizard Battle

## Golden

Uses the golden ratio, which, if my calculations are correct, is a Nash equilibrium solution to the two-player game. Attacks the most deadly if there is still more than one opponent.

"Golden": [
function(self, others, storage) {
var targ;
for (var i in others) {
if (targ == null || others[targ].wand < others[i].wand)
targ = i
}
return others[targ].uid;
},
function(storage) {
return 0.381966;
}
]


Try it online!

## Bully

"Bully": [
function attack(self, others, storage) {
minWand = Math.min(...others.map(bot => bot.wand));
targets = others.filter(bot => bot.wand === minWand);
return targets[Math.random() * targets.length | 0].uid;
},

function wandChance(storage) {
return 0.0025;
}
]


Only targets the "weakest" bots, aka bots with the lowest wand success chance.

Test all current bots!

## Climber

Always target the bot who, by our calculation, looks to have the highest score. Keeps a 1% wand for the 10 point payout if he wins.

"Climber": [
function(me, them, storage) {
storage.current = them.slice(0);
fromEntries = function(arr){
var obj = {};
for(var pair of arr) obj[pair] = pair;
return obj
}
if(!storage.scores)
storage.scores = fromEntries(them.map(x => [x.uid, 0]));

var targ;
for (var i in them) {
if (targ == null || storage.scores[targ] < storage.scores[them[i].uid])
targ = them[i].uid;
}
return targ;
},
function(storage) {
if(storage.scores){
for(var bot of storage.current)
// divide the score by the number of bots that could have won
storage.scores[bot.uid] +=
Math.max(Math.pow(bot.wand, -1/2), 20) /
(storage.current.length + 1);
}
return 0.01;
}
]