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}