all repos — WarBot2020 @ 5a247152e0c52cd12ea4ba0508218698f5b0dcb9

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