all repos — WarBot2020 @ 34d3139a35c84dab7ac25c6d3770e089ef992d39

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

added some structural integrity and a calendar
Bi-Rabittoh andronacomarco@gmail.com
Thu, 04 Apr 2019 12:55:26 +0200
commit

34d3139a35c84dab7ac25c6d3770e089ef992d39

parent

372dbc99ba17e562ba51ee0d25d029ec2eb4d37c

A siciliaguerrabot2020/Calendario/Calendario.java

@@ -0,0 +1,74 @@

+/* + * 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.Calendario; + +import java.util.ArrayList; + +/** + * + * @author Marco + */ +public class Calendario { + private ArrayList<Mese> mesi; + private int anno; + private int mese; + private int giorno; + + public Calendario(Data inizio) { + this.giorno = inizio.getGiorno(); + this.anno = inizio.getAnno(); + this.mese = inizio.getMese(); + + this.mesi = new ArrayList<>(12); + mesi.add(new Mese("Gennaio", 31)); + if(isBisestile(anno)) + mesi.add(new Mese("Febbraio", 29)); + else + mesi.add(new Mese("Febbraio", 28)); + mesi.add(new Mese("Marzo", 31)); + mesi.add(new Mese("Aprile", 30)); + mesi.add(new Mese("Maggio", 31)); + mesi.add(new Mese("Giugno", 30)); + mesi.add(new Mese("Luglio", 31)); + mesi.add(new Mese("Agosto", 31)); + mesi.add(new Mese("Settembre", 30)); + mesi.add(new Mese("Ottobre", 31)); + mesi.add(new Mese("Novembre", 30)); + mesi.add(new Mese("Dicembre", 31)); + } + + private boolean isBisestile(int year){ + return ((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0); + } + + public Data nextDay(){ + if(giorno <= mesi.get(mese - 1).getN_giorni() - 1){ + //incremento il giorno + giorno++; + } else { + if(mese < 12){ + //incremento il mese + mese++; + } else { + //incremento l'anno + mese = 1; + anno++; + if(isBisestile(anno)){ + mesi.set(1, new Mese("Febbraio", 29)); + } else { + mesi.set(1, new Mese("Febbraio", 28)); + } + } + giorno = 1; + } + return new Data(giorno, mese, anno); + } + + public String nextString(){ + Data d = nextDay(); + return d.getGiorno() + " " + mesi.get(d.getMese() - 1).getNome_mese() + " " + d.getAnno(); + } +}
A siciliaguerrabot2020/Calendario/Data.java

@@ -0,0 +1,43 @@

+/* + * 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.Calendario; + +/** + * + * @author Marco + */ +public class Data { + private final int giorno; + private final int mese; + private final int anno; + + public Data(int giorno, int mese, int anno) { + this.giorno = giorno; + this.mese = mese; + this.anno = anno; + } + + public int getGiorno() { + return giorno; + } + + public int getMese() { + return mese; + } + + public int getAnno() { + return anno; + } + + public String getCompact() { + return giorno + "/" + mese + "/" + anno; + } + + @Override + public String toString() { + return "Data{" + "giorno=" + giorno + ", mese=" + mese + ", anno=" + anno + '}'; + } +}
A siciliaguerrabot2020/Calendario/Mese.java

@@ -0,0 +1,30 @@

+/* + * 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.Calendario; + +/** + * + * @author Marco + */ +class Mese { + private final String nome_mese; + private final int n_giorni; + + public Mese(String nome, int n_giorni) { + this.nome_mese = nome; + this.n_giorni = n_giorni; + } + + public String getNome_mese() { + return nome_mese; + } + + public int getN_giorni() { + return n_giorni; + } + + +}
A siciliaguerrabot2020/Guerra/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.Guerra; + +/** + * + * @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/Guerra/Comune.java

@@ -0,0 +1,132 @@

+/* + * 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.Guerra; + +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; + private double winrate; + + 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/Guerra/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.Guerra; + +/** + * + * @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; + } + + +}
M siciliaguerrabot2020/SiciliaGuerraBot2020.javasiciliaguerrabot2020/SiciliaGuerraBot2020.java

@@ -5,6 +5,9 @@ * and open the template in the editor.

*/ package siciliaguerrabot2020; +import siciliaguerrabot2020.Guerra.Comune; +import siciliaguerrabot2020.Guerra.Territorio; +import siciliaguerrabot2020.Guerra.Centroide; import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException;

@@ -13,6 +16,8 @@ import java.util.Collections;

import java.util.Scanner; import java.util.StringTokenizer; import java.util.concurrent.ThreadLocalRandom; +import siciliaguerrabot2020.Calendario.Calendario; +import siciliaguerrabot2020.Calendario.Data; /** *

@@ -25,6 +30,8 @@ * @param args the command line arguments

*/ public static void main(String[] args) { + + final String nomefile = "data.txt"; final int soglia_popolazione; final boolean verbose;

@@ -57,7 +64,7 @@ }

} catch (IOException e){ System.out.println("File non trovato."); } - + if(verbose){ //FILTRO LE CITTA' PER POPOLAZIONE ArrayList<Comune> comuni = riempiLista(comuni_unfiltered, soglia_popolazione);

@@ -68,20 +75,17 @@ }

System.out.println("\nLa guerra si è conclusa. L'intera regione è adesso unificata sotto il regno di " + combatteteSchiavi(comuni, verbose).getNome() + "."); } else { //ANALIZZO LE PERCENTUALI DI VITTORIA - ArrayList<StatComune> statistiche = getStats(comuni_unfiltered, soglia_popolazione, verbose, n_guerre); Collections.sort(statistiche); - float somma = 0; for(StatComune sc : statistiche){ System.out.println(sc.getNome() + ": " + sc.getWinrate(n_guerre) + "%"); - somma += sc.getWinrate(n_guerre); } - //System.out.println("Somma dei winrate: " + somma); } //FINE MAIN } private static Comune combatteteSchiavi(ArrayList<Comune> lista_comuni, boolean verbose){ + Calendario calendario = new Calendario(new Data(0, 1, 2020)); ArrayList<Comune> lista = new ArrayList<>(); for(Comune c: lista_comuni){ lista.add(new Comune(c.getNome(), c.getPop(), new Centroide(c.getPos().x, c.getPos().y)));

@@ -103,7 +107,7 @@ propVittima = vittima.getProprietario();

esito = attaccante.conquista(vittima); if(verbose){ - System.out.print("Giorno " + turno + ", " + attaccante.getNome() + " ha conquistato il territorio di " + vittima.getNome()); + System.out.print(calendario.nextString() + ", " + attaccante.getNome() + " ha conquistato il territorio di " + vittima.getNome()); if(!propVittima.getNome().equals(vittima.getNome())){ System.out.print(" precedentemente occupato da " + propVittima.getNome()); }

@@ -112,9 +116,9 @@ }

if(esito){ vivi--; if(verbose) - System.out.println(propVittima.getNome() + " è stata completamente sconfitta.\n" + vivi + " comuni rimanenti.\n"); + System.out.print(propVittima.getNome() + " è stata completamente sconfitta. " + vivi + " comuni rimanenti.\n"); } else - System.out.println(); + System.out.println(""); Collections.sort(lista); if (vivi == 1){ break;

@@ -160,15 +164,12 @@ stat.add(new StatComune(c.getNome()));

} String vinc; - //currentStatus(comuni); - for(int i = 0; i < n_guerre; i++){ comuni = new ArrayList<>(); for(Comune c : comuni_src){ comuni.add(c); } vinc = combatteteSchiavi(comuni, verbose).getNome(); - //System.out.println(vinc + " vince la guerra n. " + (i + 1) + " su " + n_guerre); for(StatComune sc : stat){ if(sc.getNome().equals(vinc)){ sc.winWar();