all repos — WarBot2020 @ 372dbc99ba17e562ba51ee0d25d029ec2eb4d37c

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 = 12000;
 40            verbose = true;
 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.\n");
116            } else
117                System.out.println();
118            Collections.sort(lista);
119            if (vivi == 1){
120                break;
121            }
122            turno++;
123        }
124        return attaccante;
125    }
126    
127    public static void pause(){
128        Scanner scanner = new Scanner(System.in);
129        scanner.nextLine();
130    }
131    
132    public static void currentStatus(ArrayList<Comune> comuni){
133            for(Comune c : comuni){
134                System.out.println(c.getNome() + ": Territori:");
135                for(Territorio t : c.getTerritori()){
136                    System.out.println("\t" + t.getNome());
137                }
138                System.out.println();
139            }
140            System.out.println("\n");
141    }
142    
143    public static ArrayList<Comune> riempiLista(ArrayList<Comune> comuni_unfiltered, int soglia_popolazione){
144        ArrayList<Comune> comuni = new ArrayList<>();
145        for(Comune c : comuni_unfiltered){
146            if(c.getPop() >= soglia_popolazione)
147                comuni.add(new Comune(c.getNome(), c.getPop(), new Centroide(c.getPos().x, c.getPos().y)));
148        }
149        return comuni;
150    }
151    
152    public static ArrayList<StatComune> getStats(ArrayList<Comune> comuni_unfiltered, int soglia_popolazione, boolean verbose, int n_guerre){
153        ArrayList<Comune> comuni_src = riempiLista(comuni_unfiltered, soglia_popolazione);
154        
155        ArrayList<Comune> comuni;
156        
157        ArrayList<StatComune> stat = new ArrayList<>();
158        for(Comune c : comuni_src){
159            stat.add(new StatComune(c.getNome()));
160        }
161        String vinc;
162        
163        //currentStatus(comuni);
164        
165        for(int i = 0; i < n_guerre; i++){
166            comuni = new ArrayList<>();
167            for(Comune c : comuni_src){
168                comuni.add(c);
169            }
170            vinc = combatteteSchiavi(comuni, verbose).getNome();
171            //System.out.println(vinc + " vince la guerra n. " + (i + 1) + " su " + n_guerre);
172            for(StatComune sc : stat){
173                if(sc.getNome().equals(vinc)){
174                    sc.winWar();
175                    break;
176                }
177            }
178        }
179        return stat;
180    }
181}