all repos — WarBot2020 @ a4fa04af42abbf4313e7446a6f31e40efc4f54c0

Bootleg version of "WorldWarBot 2020" done in Java and without a map.

Add files via upload
Bi-Rabittoh andronacomarco@gmail.com
Wed, 03 Apr 2019 11:12:00 +0200
commit

a4fa04af42abbf4313e7446a6f31e40efc4f54c0

parent

076cea8a20f45a696785f62d770237e52b2bf691

A siciliaguerrabot2020/Centroide.java

@@ -0,0 +1,33 @@

+/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package siciliaguerrabot2020; + +/** + * + * @author Bi-Rabittoh + */ +public class Centroide { + public double x; + public double y; + + public Centroide(double x, double y) { + this.x = x; + this.y = y; + } + + @Override + public String toString() { + return "Centroide{" + "x=" + x + ", y=" + y + '}'; + } + + public Centroide puntoMedio(Centroide target){ + return new Centroide((this.x + target.x) / 2, (this.y + target.y) / 2); + } + + public double distanza(Centroide target){ + return Math.sqrt(Math.pow(this.x - target.x, 2) + Math.pow(this.y - target.y, 2)); + } +}
A siciliaguerrabot2020/Comune.java

@@ -0,0 +1,131 @@

+/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package siciliaguerrabot2020; + +import java.util.ArrayList; +import java.util.LinkedList; + +/** + * + * @author Bi-Rabittoh + */ +public class Comune implements Comparable<Comune> { + private boolean vivo; + private String nome; + private Centroide pos; + private LinkedList<Territorio> territori; + private final int pop; + + public Comune(String nome, int pop, Centroide pos) { + this.nome = nome; + this.pop = pop; + this.pos = pos; + this.vivo = true; + territori = new LinkedList<>(); + territori.add(new Territorio(nome, this, pos)); + } + + public boolean isVivo() { + return vivo; + } + + public void kill() { + this.vivo = false; + } + + public String getNome() { + return nome; + } + + public int getPop() { + return pop; + } + + public Centroide getPos() { + return pos; + } + + + public LinkedList<Territorio> getTerritori() { + return territori; + } + + + @Override + public String toString() { + return "Comune{" + "vivo=" + vivo + ", nome=" + nome + ", pop=" + pop + ", pos=" + pos + '}'; + } + + //FUNZIONI GEOMETRICHE + + public void aggiornaCentroide(){ + Territorio territorio; + Centroide temp = territori.get(0).getPos(); + for(int i = 0; i < territori.size(); i++){ + territorio = territori.get(i); + + } + + + for (Territorio t : territori){ + temp = temp.puntoMedio(t.getPos()); + } + pos = temp; + } + + //FUNZIONI BELLE + public boolean conquista(Territorio target){ + boolean ris = false; + target.getProprietario().territori.remove(target); + if(target.getProprietario().territori.isEmpty()){ + target.getProprietario().kill(); + ris = true; + }else + target.getProprietario().aggiornaCentroide(); + + target.setProprietario(this); + this.territori.add(target); + this.aggiornaCentroide(); + return ris; + } + + public Territorio trovaVicino(ArrayList<Comune> lista){ + + Territorio trovato = new Territorio("Errore", null, null); + double minD = 999999999, cur; + + for(int i = 0; i < lista.size(); i++){ + Comune comune = lista.get(i); + //scorro i comuni + if(comune.isVivo() && !comune.equals(this)){ + //mi trovo in un comune VIVO e diverso da se stesso + for(int j = 0; j < comune.territori.size(); j++){ + Territorio territorio = comune.territori.get(j); + //mi trovo in un territorio generico di questo comune + cur = this.pos.distanza(territorio.getPos()); + //oonfronto la distanza con minD + if(cur < minD){ + minD = cur; + trovato = territorio; + } + } + } + } + return trovato; + } + + @Override + public int compareTo(Comune target){ + if((!this.isVivo()) && target.isVivo()){ + return 1; + } else if (this.isVivo() && (!target.isVivo())){ + return -1; + } else return 0; + } + //FINE FILE + + +}
A siciliaguerrabot2020/Random.java

@@ -0,0 +1,18 @@

+/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package siciliaguerrabot2020; + +/** + * + * @author Marco + */ +public class Random { + + + + + +}
A siciliaguerrabot2020/SiciliaGuerraBot2020.java

@@ -0,0 +1,117 @@

+/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package siciliaguerrabot2020; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Scanner; +import java.util.StringTokenizer; + +/** + * + * @author Bi-Rabittoh + */ +public class SiciliaGuerraBot2020 { + + /** + * @param args the command line arguments + */ + public static void main(String[] args) { + final String nomefile = "data.txt"; + final int soglia_popolazione = 12000; + + //LEGGO I DATI DA FILE + ArrayList<Comune> comuni_unfiltered = new ArrayList<>(); + Centroide temp; + BufferedReader reader; + StringTokenizer st; + try { + reader = new BufferedReader(new FileReader(nomefile)); + String line = reader.readLine(); + while (line != null){ + st = new StringTokenizer(line); + comuni_unfiltered.add(new Comune(st.nextToken(), Integer.parseInt(st.nextToken()), new Centroide(Double.parseDouble(st.nextToken()), Double.parseDouble(st.nextToken())))); + line = reader.readLine(); + } + } catch (IOException e){ + System.out.println("File non trovato"); + } + + //FILTRO LE CITTA' PER POPOLAZIONE + ArrayList<Comune> comuni = new ArrayList<>(); + for(Comune c : comuni_unfiltered){ + if(c.getPop() >= soglia_popolazione) + comuni.add(c); + } + System.out.println("I comuni in guerra sono " + comuni.size() + ":"); + for(Comune c : comuni){ + System.out.println(c.getNome()); + } + suspance(); + Comune vincitore = combatteteSchiavi(comuni); + System.out.println("Il vincitore è " + vincitore.getNome() + " con " + vincitore.getTerritori().size() + " territori"); + + //TODO: analizzare la probabilità di vittoria di ciascun comune + + //FINE MAIN + } + + private static int randomRange(int min, int max) { + if (min >= max) { + throw new IllegalArgumentException("Il secondo parametro deve essere maggiore del primo"); + } + return (int)(Math.random() * ((max - min) + 1)) + min; + } + + private static Comune combatteteSchiavi(ArrayList<Comune> lista){ + + int turno = 1; + Comune attaccante; + Territorio vittima; + int vivi = lista.size(); + int random; + while(true){ + //scelgo un comune casuale come attaccante + random = randomRange(0, vivi - 1); + attaccante = lista.get(random); + vittima = attaccante.trovaVicino(lista); + if(attaccante.conquista(vittima)) + vivi--; + System.out.println("Turno " + turno + ": " + attaccante.getNome() + " conquista il territorio di " + vittima.getNome() + " e arriva a " + attaccante.getTerritori().size() + " territori"); + Collections.sort(lista); + //controllo se la partita è finita + if (vivi == 1){ + break; + } + + turno++; + } + return attaccante; + } + + public static void suspance(){ + System.out.println("Al mio \"INVIO\" scatenate l'inferno..."); + Scanner scanner = new Scanner(System.in); + scanner.nextLine(); + } + + public static void currentStatus(ArrayList<Comune> comuni){ + //fine turno. DEBUG TIME + for(Comune c : comuni){ + System.out.println(c.getNome() + ": Territori:"); + for(Territorio t : c.getTerritori()){ + System.out.println("\t" + t.getNome()); + } + System.out.println(); + } + System.out.println("\n"); + //pause(); + //FINE DEBUG*/ + } +}
A siciliaguerrabot2020/Territorio.java

@@ -0,0 +1,40 @@

+/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package siciliaguerrabot2020; + +/** + * + * @author Bi-Rabittoh + */ +public class Territorio { + private final String nome; + private Comune proprietario; + private final Centroide pos; + + public Territorio(String nome, Comune proprietario, Centroide pos) { + this.nome = nome; + this.proprietario = proprietario; + this.pos = pos; + } + + public Comune getProprietario() { + return proprietario; + } + + public void setProprietario(Comune proprietario) { + this.proprietario = proprietario; + } + + public Centroide getPos() { + return pos; + } + + public String getNome() { + return nome; + } + + +}