Skip to content

Commit

Permalink
Invert the troop production logic (troop / round)
Browse files Browse the repository at this point in the history
  • Loading branch information
leanil committed May 19, 2023
1 parent 432f287 commit fdd6bf5
Show file tree
Hide file tree
Showing 15 changed files with 54 additions and 58 deletions.
Binary file modified bots/crash-bot.zip
Binary file not shown.
2 changes: 1 addition & 1 deletion bots/data.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ int P;
struct Planet
{
int x, y;
int efficiency;
int production;
int playerID;
int population;
};
Expand Down
Binary file modified bots/idle-bot.zip
Binary file not shown.
4 changes: 2 additions & 2 deletions bots/test-bot-easy.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ int P;
struct Planet {
int id;
int x, y;
int efficiency;
int production;
int player_id;
int population;
};
Expand All @@ -35,7 +35,7 @@ void initialize() {
planets.resize(P);
for (int i = 0; i < P; ++i) {
planets[i].id = i;
cin >> planets[i].x >> planets[i].y >> planets[i].efficiency;
cin >> planets[i].x >> planets[i].y >> planets[i].production;
}

dist.resize(P, vector<int>(P));
Expand Down
Binary file modified bots/test-bot-hard.zip
Binary file not shown.
2 changes: 1 addition & 1 deletion bots/utility.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ void initialize()
planets.resize(P);
for (int i = 0; i < P; ++i)
{
std::cin >> planets[i].x >> planets[i].y >> planets[i].efficiency;
std::cin >> planets[i].x >> planets[i].y >> planets[i].production;
}

dist.resize(P, std::vector<int>(P));
Expand Down
37 changes: 19 additions & 18 deletions game-description.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,24 +21,33 @@ Ha ellenséges bolygóra érnek, akkor a bolygó annak az irányítása alá ker
2. Ha piros 5 egységgel van jelen, kék 4, zöld pedig 8 egységgel egyszerre érkeznek meg, akkor 3-an harcolnak és zöld lesz a bolygó tulajdonosa 8-5=3 egységgel.

Döntetlen esetén a bolygó lakatlan lesz és semlegessé válik.
A játékosok által birtokolt bolygók bizonyos gyakorisággal új egységet hoznak létre.
A termelés sebességét a bolygó hatékonysága határozza meg, mely a játék során nem változik.
A játékosok által birtokolt bolygók minden körben új egységeket hoznak létre.
A bolygók termelését (a körönként létrehozott egységek számát) a játék elején mindenki megtudja,
és ez a játék során nem változik.
Semleges bolygók nem hoznak létre új egységet.
Figyelem, ha az összes egységet elküldöd egy bolygóról, akkor elveszted felette az irányítást, és az nem termel tovább.

A bolygó hatékonyságát úgy fejezzük ki, hogy milyen gyakran jön létre rajta új egység.
Ha például a hatékonyság 4, akkor a birtokos minden negyedik körben (tick-ben) kap új egységet.
A termelés számlálója újraindul, ha a bolygó tulajdonosa megváltozik.

Egy játékos kiesik, ha már nincs több egysége a pályán.
A játék akkor ér véget, ha csak egy játékos marad, vagy letelik a játék elején megadott maximális kör szám.

Az egységeket programmal fogjátok tudni irányítani, amit alább részletezünk.
A programok egymás ellen fognak játszani.
Az egyszerűség kedvéért körökre osztjuk a játékot, melyek között fix mennyiségű idő telik el.
A program minden kör elején megkapja az aktuális játékállapotot, majd vissza kell küldenie, mit szeretne lépni.
A játék körökre osztva zajlik (a köröket tick-nek is hívjuk).
A program minden kör elején beolvassa az aktuális játékállapotot, majd ki kell írnia, mit szeretne lépni.
A körönkénti időlimit 30ms. Ha ezen belül nem válaszol a program, abból a körből kimarad.
Ezután a szerver kiszámolja, mi fog történni az akciók hatására.

A játéknak akkor van vége, ha már csak egy játékosnak van egysége (bolygón vagy úton).
Illetve 300 kör után akkor is véget ér a játék, ha még több játékos is életben van.
Ilyenkor az nyer, akinek összesen a legtöbb egysége van.

## Egy kör lejátszásának lépései

1. A botok megkapják az aktuális játékállást és új parancsokat adnak ki
2. Az elküldött csapatok elindulnak
3. A célbaérő csapatok megérkeznek és harcolnak, ha kell (Itt vége lehet a játéknak egy játékos számára)
4. A bolygók új egységeket hozhatnak létre

## Kommunikációs protokoll

A standard inputról kell olvasni, és standard outputra írni (azaz pl. cin és cout).
Expand All @@ -59,7 +68,7 @@ Pálya adatok (csak Bemenet):
`P`: (2 ≤ _P_ ≤ 50) egész szám, ennyi bolygó van

Minden bolygóra (_P_ sor):\
`efficiency`: (1 ≤ _efficiency_ ≤ 10) egész szám, a bolygó hatékonysága\
`production`: (1 ≤ _production_ ≤ 10) egész szám, a bolygó termelése\
A bolygókat _0_-tól _P-1_-ig számozzuk (később planetID), az _i_. sor az _i_ sorszámú bolygó adatait tartalmazza.

Minden bolygó-párra (_P\*P_-s szimmetrikus mátrix):\
Expand Down Expand Up @@ -102,7 +111,6 @@ Ha ezt megszegitek, hibát kaptok és abban a körben nem léphettek.
Bemenet

Ha a játéknak vége, a tick száma helyett -1-et küldünk.
Az eredmény a webes felületen lesz látható.

### Példa üzenetek

Expand Down Expand Up @@ -136,13 +144,6 @@ Szerver (1. tick)
0
```

## A szimuláció lépései

1. A botok megkapják az aktuális játékállást és új parancsokat adnak ki
2. Az elküldött csapatok elindulnak
3. A célbaérő csapatok megérkeznek és harcolnak, ha kell (Itt vége lehet a játéknak egy játékos számára)
4. A bolygók új egységeket hozhatnak létre

## A megjelenítő

A meccsek animált visszajátszása mellett első sorban a hibakeresést támogatja.
Expand All @@ -154,4 +155,4 @@ Ha a botod stratégiai döntéseit is szeretnéd látni, írj ki erre vonatkozó
A megjelenítőben látni fogod az adott tickhez kiírt saját logodat is, de tickenként max 2000 karaktert.

Ha egy ticknél piros hátterű szöveget látsz, az azt jelenti, hogy a botod abban a tickben hibás parancso(ka)t küldött, vagy crashelt.
Az utóbbi esetben a játék hátralévő részében nyilván nem csinál semmit, a játékos listában is ki lesz húzva.
Az utóbbi esetben a játék hátralévő részében nyilván nem csinál semmit, a játékos listában is ki lesz húzva.
8 changes: 4 additions & 4 deletions maps/map2-1.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,28 +9,28 @@
"id": 0,
"x": 50,
"y": 50,
"efficiency": 1,
"production": 1,
"size": 10
},
{
"id": 1,
"x": 150,
"y": 150,
"efficiency": 1,
"production": 1,
"size": 10
},
{
"id": 2,
"x": 50,
"y": 150,
"efficiency": 3,
"production": 3,
"size": 10
},
{
"id": 3,
"x": 150,
"y": 50,
"efficiency": 1,
"production": 1,
"size": 10
}
],
Expand Down
10 changes: 5 additions & 5 deletions maps/map2-2.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,35 +9,35 @@
"id": 0,
"x": 50,
"y": 50,
"efficiency": 5,
"production": 5,
"size": 5
},
{
"id": 1,
"x": 150,
"y": 150,
"efficiency": 5,
"production": 5,
"size": 5
},
{
"id": 2,
"x": 50,
"y": 150,
"efficiency": 5,
"production": 5,
"size": 5
},
{
"id": 3,
"x": 150,
"y": 50,
"efficiency": 5,
"production": 5,
"size": 5
},
{
"id": 4,
"x": 100,
"y": 100,
"efficiency": 1,
"production": 1,
"size": 15
}
],
Expand Down
10 changes: 5 additions & 5 deletions maps/map2.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,11 @@
"height": 200
},
"planets": [
{ "id": 0, "x": 10, "y": 100, "efficiency": 3, "size": 10 },
{ "id": 1, "x": 100, "y": 100, "efficiency": 4, "size": 10 },
{ "id": 2, "x": 100, "y": 190, "efficiency": 2, "size": 10 },
{ "id": 3, "x": 190, "y": 145, "efficiency": 1, "size": 10 },
{ "id": 4, "x": 145, "y": 10, "efficiency": 2, "size": 10 }
{ "id": 0, "x": 10, "y": 100, "production": 3, "size": 10 },
{ "id": 1, "x": 100, "y": 100, "production": 4, "size": 10 },
{ "id": 2, "x": 100, "y": 190, "production": 2, "size": 10 },
{ "id": 3, "x": 190, "y": 145, "production": 1, "size": 10 },
{ "id": 4, "x": 145, "y": 10, "production": 2, "size": 10 }
],
"planetsDistances": [
[0, 4, 6, 8, 7],
Expand Down
12 changes: 6 additions & 6 deletions maps/map3.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,12 @@
"height": 200
},
"planets": [
{ "id": 0, "x": 10, "y": 100, "efficiency": 3, "size": 10 },
{ "id": 1, "x": 65, "y": 170, "efficiency": 1, "size": 10 },
{ "id": 2, "x": 135, "y": 170, "efficiency": 1, "size": 10 },
{ "id": 3, "x": 190, "y": 100, "efficiency": 2, "size": 10 },
{ "id": 4, "x": 135, "y": 30, "efficiency": 2, "size": 10 },
{ "id": 5, "x": 65, "y": 30, "efficiency": 3, "size": 10 }
{ "id": 0, "x": 10, "y": 100, "production": 3, "size": 10 },
{ "id": 1, "x": 65, "y": 170, "production": 1, "size": 10 },
{ "id": 2, "x": 135, "y": 170, "production": 1, "size": 10 },
{ "id": 3, "x": 190, "y": 100, "production": 2, "size": 10 },
{ "id": 4, "x": 135, "y": 30, "production": 2, "size": 10 },
{ "id": 5, "x": 65, "y": 30, "production": 3, "size": 10 }
],
"planetsDistances": [
[0, 4, 6, 8, 6, 4],
Expand Down
4 changes: 2 additions & 2 deletions public/planet_war_bot.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ int P;
struct Planet {
int id;
int x, y;
int efficiency;
int production;
int player_id;
int population;
};
Expand All @@ -35,7 +35,7 @@ void initialize() {
planets.resize(P);
for (int i = 0; i < P; ++i) {
planets[i].id = i;
cin >> planets[i].x >> planets[i].y >> planets[i].efficiency;
cin >> planets[i].x >> planets[i].y >> planets[i].production;
}

dist.resize(P, vector<int>(P));
Expand Down
2 changes: 1 addition & 1 deletion src/BotWrapper.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ export class Bot {
stdin: Writable;

private static readonly starting_available_time: number = 1000; // in ms
private static readonly plus_time_per_round: number = 50; // in ms
private static readonly plus_time_per_round: number = 30; // in ms

public constructor(readonly id: string, readonly index: number, command: string) {
this.available_time = Bot.starting_available_time;
Expand Down
17 changes: 6 additions & 11 deletions src/nanowar.ts
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ async function makeMatch(state: GameState, botPool: BotPool) {
}
let isThereAliveBot = true;
tickToVisualizer(botPool, state); // Save for visualizer
while ((isThereAliveBot || state.tick.troops.length !== 0) && state.tick.id < 500) {
while ((isThereAliveBot || state.tick.troops.length !== 0) && state.tick.id < 300) {
state.tick.id++;
console.log(`${formatTime()}: tick #${state.tick.id}`);
console.log(state.tick.planets);
Expand Down Expand Up @@ -138,7 +138,7 @@ function startingPosToString(state: GameState, player: PlayerID): string {
const numberOfPlanets = state.planets.length;
let planets = numberOfPlanets.toString() + "\n";
for (let i = 0; i < numberOfPlanets; i++) {
planets += `${state.planets[i].x} ${state.planets[i].y} ${state.planets[i].efficiency}\n`;
planets += `${state.planets[i].x} ${state.planets[i].y} ${state.planets[i].production}\n`;
}

// Planet distances
Expand Down Expand Up @@ -331,7 +331,7 @@ function updateState(state: GameState, steps: UserStep[]): GameState {
} else if (max.who !== null) {
if (state.tick.planets[i].player === null || max.who !== state.tick.planets[i].player?.id) {
// Update player of the planet if it is changes
state.tick.planets[i].player = { id: max.who, startingTick: state.tick.id };
state.tick.planets[i].player = { id: max.who };
}
state.tick.planets[i].population = max.size - max2.size;
} else {
Expand All @@ -344,16 +344,11 @@ function updateState(state: GameState, steps: UserStep[]): GameState {
}
//console.log("Population:", state.tick.planets[1].population)

// Add new troops depends on the efficiency and startingTick of the planets
// Add new troops based on the production of the planets
for (let i = 0; i < state.tick.planets.length; i++) {
const planet = state.tick.planets[i];
if (planet.player !== null) {
const startingTick = planet.player.startingTick;
const currentTick = state.tick.id;
const efficiency = state.planets[i].efficiency;
if (currentTick - startingTick > 0 && (currentTick - startingTick) % efficiency === 0) {
state.tick.planets[i].population++;
}
state.tick.planets[i].population += state.planets[i].production;
}
}

Expand Down Expand Up @@ -402,7 +397,7 @@ function stateToVisualizer(botPool: BotPool, state: GameState): void {
x: planet.x,
y: planet.y,
size: planet.size,
production: planet.efficiency,
production: planet.production,
player: matchLog[0].planets[planet.id].player,
};
}),
Expand Down
4 changes: 2 additions & 2 deletions src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ export const planetCodec = t.type({
id: t.number,
x: t.number,
y: t.number,
efficiency: t.number,
production: t.number,
// just for visualizer
size: t.number,
});
Expand All @@ -23,7 +23,7 @@ export const tickCodec = t.type({
planets: t.array(
t.type({
id: t.number,
player: t.union([t.type({ id: t.number, startingTick: t.number }), t.null]),
player: t.union([t.type({ id: t.number }), t.null]),
population: t.number, // It can also have population without player
}),
),
Expand Down

0 comments on commit fdd6bf5

Please sign in to comment.