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}