planet-wars/client/simple.js
2020-12-05 19:35:21 +01:00

81 lines
2.3 KiB
JavaScript

const fs = require('fs')
const readline = require('readline');
const rl = readline.createInterface({input: process.stdin, output: process.stdout});
const MY_PLAYER_NUMBER = 1
function move(moves) {
let record = {'moves': moves}
console.error(JSON.stringify(record))
console.log(JSON.stringify(record))
}
function find_max_with_key(array, key) {
return array.reduce((item1, item2) => {
let val1 = item1[key];
let val2 = item2[key];
return (val1 > val2 ? item1 : item2);
});
}
function find_min_with_key(array, key) {
return array.reduce((item1, item2) => {
let val1 = item1[key];
let val2 = item2[key];
return (val1 < val2 ? item1 : item2);
});
}
/**
* De main code van de bot
*/
function run_bot(state) {
// Maak een lijst van mijn eigen planeten
let my_planets = state["planets"].filter((planet) => {
return planet['owner'] === MY_PLAYER_NUMBER
})
// Maak een lijst van de planeten van de tegenstander
let other_planets = state["planets"].filter((planet) => {
return planet['owner'] !== MY_PLAYER_NUMBER
})
if (my_planets.length === 0 || other_planets.length === 0) {
// Als er al een speler dood is moet ik niets meer doen
move([])
} else {
// Stuur alle schepen behalve 1 van mijn planeet met meeste schepen
// naar die van de andere speler met zijn minste schepen
let planet = find_max_with_key(my_planets, 'ship_count');
let dest = find_min_with_key(other_planets, 'ship_count');
if (planet !== undefined && dest !== undefined) {
move([{
'origin': planet['name'],
'destination': dest['name'],
'ship_count': planet['ship_count'] - 1
}])
}
}
}
function main() {
// Je kunt als 2de argument een file meegeven. De bot gaat deze dan gebruiken als input voor de ronde
if (process.argv.length > 2) {
try {
const data = fs.readFileSync(process.argv[2], 'utf8')
run_bot(JSON.parse(data))
} catch (err) {
console.error(err)
}
} else {
// Anders gaan we stdin lezen
rl.on('line', (data) => {
run_bot(JSON.parse(data))
});
}
}
let _ = main();