all repos — WarBot2020 @ 4b97e9f38827752493449c5309baf779f507f84b

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

siciliaguerrabot2020/SiciliaGuerraBot2020.java (view raw)

  1/*
  2 * To change this license header, choose License Headers in Project Properties.
  3 * To change this template file, choose Tools | Templates
  4 * and open the template in the editor.
  5 */
  6package siciliaguerrabot2020;
  7
  8import siciliaguerrabot2020.Guerra.Comune;
  9import siciliaguerrabot2020.Guerra.Territorio;
 10import siciliaguerrabot2020.Guerra.Centroide;
 11import java.io.BufferedReader;
 12import java.io.FileReader;
 13import java.io.IOException;
 14import java.util.ArrayList;
 15import java.util.Collections;
 16import java.util.Scanner;
 17import java.util.StringTokenizer;
 18import java.util.concurrent.ThreadLocalRandom;
 19import siciliaguerrabot2020.Calendario.Calendario;
 20import siciliaguerrabot2020.Calendario.Data;
 21
 22/**
 23 *
 24 * @author Bi-Rabittoh
 25 */
 26public class SiciliaGuerraBot2020 {
 27
 28    /**
 29     * @param args the command line arguments
 30     */
 31    
 32    public static void main(String[] args) {
 33        
 34        
 35        final String nomefile = "data.txt";
 36        final int soglia_popolazione;
 37        final boolean verbose;
 38        final int n_guerre;
 39        
 40        //controllo se ci sono 3 argomenti
 41        if(args.length == 3){
 42            soglia_popolazione = Integer.parseInt(args[0]);
 43            verbose = Boolean.parseBoolean(args[1]);
 44            n_guerre = Integer.parseInt(args[2]);;
 45        } else {
 46            soglia_popolazione = 12000;
 47            verbose = true;
 48            n_guerre = 500;
 49            System.out.println("Parametri errati o assenti. Carico i valori di default.");
 50        }
 51        
 52        //LEGGO I DATI DA FILE
 53        ArrayList<Comune> comuni_unfiltered = new ArrayList<>();
 54        BufferedReader reader;
 55        StringTokenizer st;
 56        try {
 57            reader = new BufferedReader(new FileReader(nomefile));
 58            String line = reader.readLine();
 59            while (line != null){
 60                st = new StringTokenizer(line);
 61                comuni_unfiltered.add(new Comune(st.nextToken(), Integer.parseInt(st.nextToken()), new Centroide(Double.parseDouble(st.nextToken()), Double.parseDouble(st.nextToken()))));
 62                line = reader.readLine();
 63            }
 64        } catch (IOException e){
 65            System.out.println("File non trovato.");
 66        }
 67        
 68        if(verbose){
 69            //FILTRO LE CITTA' PER POPOLAZIONE
 70            ArrayList<Comune> comuni = riempiLista(comuni_unfiltered, soglia_popolazione);
 71            System.out.println("I comuni in guerra sono " + comuni.size() + ":");
 72            for(Comune c : comuni){
 73                System.out.println(c.getNome());
 74            }
 75            System.out.println("\nLa guerra si è conclusa. L'intera regione è adesso unificata sotto il regno di " + combatteteSchiavi(comuni, verbose).getNome() + ".");
 76        } else {
 77            //ANALIZZO LE PERCENTUALI DI VITTORIA
 78            ArrayList<StatComune> statistiche = getStats(comuni_unfiltered, soglia_popolazione, verbose, n_guerre);
 79            Collections.sort(statistiche);
 80            for(StatComune sc : statistiche){
 81                System.out.println(sc.getNome() + ": " + sc.getWinrate(n_guerre) + "%");
 82            }
 83        }
 84        //FINE MAIN
 85    }
 86    
 87    private static Comune combatteteSchiavi(ArrayList<Comune> lista_comuni, boolean verbose){
 88        Calendario calendario = new Calendario(new Data(0, 1, 2020));
 89        ArrayList<Comune> lista = new ArrayList<>();
 90        for(Comune c: lista_comuni){
 91            lista.add(new Comune(c.getNome(), c.getPop(), new Centroide(c.getPos().x, c.getPos().y)));
 92        }
 93        int turno = 1;
 94        Comune attaccante;
 95        Territorio vittima;
 96        int vivi = lista.size();
 97        int random;
 98        boolean esito;
 99        Comune propVittima;
100        while(true){
101            //scelgo un comune casuale come attaccante
102            random = ThreadLocalRandom.current().nextInt(0, vivi); //dovrei avere "vivi - 1" ma non serve perchè questa funzione non include l'ultimo valore del range
103            //System.out.println("rand tra 0 e " + (vivi - 1) + ": "+ random);
104            attaccante = lista.get(random);
105            vittima = attaccante.trovaVicino(lista);
106            propVittima = vittima.getProprietario();
107            esito = attaccante.conquista(vittima);
108            
109            if(verbose){
110                System.out.print(calendario.nextString() + ", " + attaccante.getNome() + " ha conquistato il territorio di " + vittima.getNome());
111                if(!propVittima.getNome().equals(vittima.getNome())){
112                    System.out.print(" precedentemente occupato da " + propVittima.getNome());
113                }
114                System.out.print(".\n");
115            }
116            if(esito){
117                vivi--;
118                if(verbose)
119                    System.out.print(propVittima.getNome() + " è stata completamente sconfitta. " + vivi + " comuni rimanenti.\n");
120            } else
121                System.out.println("");
122            Collections.sort(lista);
123            if (vivi == 1){
124                break;
125            }
126            turno++;
127        }
128        return attaccante;
129    }
130    
131    public static void pause(){
132        Scanner scanner = new Scanner(System.in);
133        scanner.nextLine();
134    }
135    
136    public static void currentStatus(ArrayList<Comune> comuni){
137            for(Comune c : comuni){
138                System.out.println(c.getNome() + ": Territori:");
139                for(Territorio t : c.getTerritori()){
140                    System.out.println("\t" + t.getNome());
141                }
142                System.out.println();
143            }
144            System.out.println("\n");
145    }
146    
147    public static ArrayList<Comune> riempiLista(ArrayList<Comune> comuni_unfiltered, int soglia_popolazione){
148        ArrayList<Comune> comuni = new ArrayList<>();
149        for(Comune c : comuni_unfiltered){
150            if(c.getPop() >= soglia_popolazione)
151                comuni.add(new Comune(c.getNome(), c.getPop(), new Centroide(c.getPos().x, c.getPos().y)));
152        }
153        return comuni;
154    }
155    
156    public static ArrayList<StatComune> getStats(ArrayList<Comune> comuni_unfiltered, int soglia_popolazione, boolean verbose, int n_guerre){
157        ArrayList<Comune> comuni_src = riempiLista(comuni_unfiltered, soglia_popolazione);
158        
159        ArrayList<Comune> comuni;
160        
161        ArrayList<StatComune> stat = new ArrayList<>();
162        for(Comune c : comuni_src){
163            stat.add(new StatComune(c.getNome()));
164        }
165        String vinc;
166        
167        for(int i = 0; i < n_guerre; i++){
168            comuni = new ArrayList<>();
169            for(Comune c : comuni_src){
170                comuni.add(c);
171            }
172            vinc = combatteteSchiavi(comuni, verbose).getNome();
173            for(StatComune sc : stat){
174                if(sc.getNome().equals(vinc)){
175                    sc.winWar();
176                    break;
177                }
178            }
179        }
180        return stat;
181    }
182}