JAVALAB#006 – Giochiamo a pallone

In laboratorio avevamo iniziato la scrittura del codice per la simulazione di una partita di calcio.
Questo è il codice completo con i vari controlli sulla probabilità che possa segnare o meno un giocatore in un certo ruolo, è stata eliminata la probabilità che possa segnare il portiere, ho aggiunto varie stampe per una formattazione migliore dei risultati della partita e ho cambiato l’avanzamento del gioco: invece che con lo scorrimento del numero di giocatori sono passato a scorrere i minuti di gioco.

Per scaricare il file java: Lab_09012008

import java.util.*;
 
public class Lab_20090109
{
	public static void main(String[] argv)
	{
		System.out.println("\n\t  SIMULAZIONE DI UNA PARTITA DI PALLONE\n\n");
 
		//creazione delle due squadre di gioco
		Squadra s1 = new Squadra("Roma");
		Squadra s2 = new Squadra("Lazio");
 
		//dopo la creazione delle due squadre di gioco si inserisce in entrambe le squadre
		//una lista di giocatori con ruolo e numero di maglia
 
 
		// --	 LISTA GIOCATORI DELLA PRIMA SQUADRA
		s1.addGiocatore( new Giocatore("giocatore", "portiere", 		1) );
		s1.addGiocatore( new Giocatore("giocatore", "difensore", 		2) );
		s1.addGiocatore( new Giocatore("giocatore", "difensore", 		3) );
		s1.addGiocatore( new Giocatore("giocatore", "difensore", 		4) );
		s1.addGiocatore( new Giocatore("giocatore", "centrocampista", 	5) );
		s1.addGiocatore( new Giocatore("giocatore", "centrocampista", 	6) );
		s1.addGiocatore( new Giocatore("giocatore", "centrocampista", 	7) );
		s1.addGiocatore( new Giocatore("giocatore", "centrocampista", 	8) );
		s1.addGiocatore( new Giocatore("giocatore", "attaccante", 		9) );
		s1.addGiocatore( new Giocatore("giocatore", "attaccante", 		10) );
		s1.addGiocatore( new Giocatore("giocatore", "attaccante", 		11) );
 
		// --	 LISTA GIOCATORI DELLA SECONDA SQUADRA
		s2.addGiocatore( new Giocatore("giocatore", "portiere", 		1) );
		s2.addGiocatore( new Giocatore("giocatore", "difensore", 		2) );
		s2.addGiocatore( new Giocatore("giocatore", "difensore", 		3) );
		s2.addGiocatore( new Giocatore("giocatore", "difensore", 		4) );
		s2.addGiocatore( new Giocatore("giocatore", "centrocampista", 	5) );
		s2.addGiocatore( new Giocatore("giocatore", "centrocampista", 	6) );
		s2.addGiocatore( new Giocatore("giocatore", "centrocampista", 	7) );
		s2.addGiocatore( new Giocatore("giocatore", "centrocampista", 	8) );
		s2.addGiocatore( new Giocatore("giocatore", "attaccante", 		9) );
		s2.addGiocatore( new Giocatore("giocatore", "attaccante", 		10) );
		s2.addGiocatore( new Giocatore("giocatore", "attaccante", 		11) );
 
		//Avvio della partita tra le due squadre
 
		new Partita(s1, s2); //andata
 
		new Partita(s2, s1); //ritorno
	}
}
 
 
 
/**
 * classe per la rappresentazione di un giocatore di calcio
 * con nome, numero di maglia e ruolo in campo
 */
class Giocatore
{
	String ruolo;
	String nome;
	int maglia;
 
	Giocatore(String nome)
	{
		this.nome = nome;
	}
 
	Giocatore(String nome, int maglia)
	{
		this.nome = nome;
		this.maglia = maglia;
	}
 
	Giocatore(String nome, String ruolo)
	{
		this.nome = nome;
		this.ruolo = ruolo;
	}
 
	Giocatore(String nome, String ruolo, int maglia)
	{
		this.nome = nome;
		this.ruolo = ruolo;
		this.maglia = maglia;
	}
}
 
 
 
/**
 * classe per la gestione di una generica squadra di calcio
 */
class Squadra
{
	ArrayList giocatori = null;
	String nome;
 
	/**
	 * cotruttore della classe Squadra cui si deve passare una stringa
	 * che rappresenti il nome della squadra
	 */
	Squadra(String nome)
	{
		this.nome = nome;
		giocatori = new ArrayList();
	}
 
	/**
	 * funzione per l'aggiunta di giocatori alla squadra
	 */
	public void addGiocatore(Giocatore g)
	{
		//aggiunta di giocatori all'arraylist di giocatori
		giocatori.add(g);
	}
 
	/**
	 * funzione che ritorna il giocatore i-esimo contenuto nell'arraylist di giocatori
	 */
	public Giocatore getGiocatore(int i)
	{
		//si ritorna il giocatore cercato in base all'indice assunto nell'arraylist
		//solo se l'indice inserito è compreso tra 0 e la dimenzione dell'arraylist
		//in tutti gli altri casi si restituisce NULL
 
 
		return ( (i >= 0) && (i < giocatori.size()) ) ? (Giocatore)giocatori.get(i) : null;
	}
 
	/**
	 * funzione in grado di restituire un array di giocatori in base al ruolo passato
	 */
	public Giocatore[] getGiocatoriPerRuolo(String ruolo)
	{
		//contatore per il numero di giocatori trovati in base al ruolo
		int count = 0;
 
		//scorrimento di tutti i giocatori
		for (int i=0; i<giocatori.size(); i++)
			//incremento del contatore quando viene trovato un giocatore del ruolo cercato
			if (getGiocatore(i).ruolo.equals(ruolo)) count++;
 
		//se non viene trovato nessun giocatore la funzione termina restituendo NULL
		if (count == 0) return null;
 
		//creazione di un array di giocatori con dimensione presa dal numero di giocatori trovati
		Giocatore[] g = new Giocatore[count];
		//contatore temporaneo
		int c = 0;
 
		//scorrimento di tutti i giocatori
		for (int i=0; i<giocatori.size(); i++)
		{
			//controllo che il giocatore attuale abbia il ruolo cercato
			if (getGiocatore(i).ruolo.equals(ruolo))
			{
				//se la condizione si verifica si assegna all'array di giocatori il giocatore trovato
				g[c] = getGiocatore(i);
				//incremento del contatore per l'array di giocatori
				c++;
			}
		}
 
		//ritorno dell'array di giocatori
		return g;
	}
 
	/**
	 * funzione toString che ritorna la rappresentazione sottoforma di stringa
	 * formattata della lista di giocatori e del nome della squadra
	 */
	public String toString()
	{
		String squadra = nome;
		for (int i=0; i<giocatori.size(); i++)
			squadra = squadra+"\n    "+getGiocatore(i).maglia+"\t"+getGiocatore(i).nome+"\t"+getGiocatore(i).ruolo;
		return squadra+"\n";
	}
}
 
 
 
/**
 * classe per la simulazione di una partita di pallone tra due squadre
 */
class Partita
{
	Squadra s1 = null, s2 = null;
	int goals1, goals2;
 
	/**
	 * unico costruttore valido per eseguire la partita
	 * preleva due squadre ed avvia il gioco
	 */
	Partita(Squadra s1, Squadra s2)
	{
		this.s1 = s1;
		this.s2 = s2;
 
		//avvio della partita
		gioca();
	}
 
	/**
	 * funzione per la selezione del giocatore che segna in base alla probabilità di segnare
	 * per ruolo, con scelta della squadra di appartenenza
	 */
	public Giocatore getGiocatorePerProbabilitaDiSegnare(Squadra s)
	{
		//selezionatore di probabilità per la scelta di un giocatore per ruolo
		double probatt = Math.abs(Math.random() - .5);
 
		//se la probabilità è compresa tra 0 e 0,25
		//il giocatore che ha probabilità di segnare si troverà in attacco
		if (probatt >= 0 && probatt < .25)
		{
			return s.getGiocatoriPerRuolo("attaccante")[(int)(Math.random() * s.getGiocatoriPerRuolo("attaccante").length)];
		}
 
		//altrimenti, se la probabilità è compresa tra 0,25 e 0,4
		//il giocatore che ha probabilità di segnare si troverà in centrocampo
		else if (probatt >=.25 && probatt < .4 )
		{
			return s.getGiocatoriPerRuolo("centrocampista")[(int)(Math.random() * s.getGiocatoriPerRuolo("centrocampista").length)];
		}
 
		//altrimenti, il giocatore che ha probabilità di segnare si troverà in difesa
		else
		{
			return s.getGiocatoriPerRuolo("difensore")[(int)(Math.random() * s.getGiocatoriPerRuolo("difensore").length)];
 
		}
	}
 
	/**
	 * funzione per l'avvio della simulazione di gioco
	 * un ciclo "for" scorre i minuti della partita avanzando da 0 a 90
	 * un casualizzatore booleano nella condizione della IF permette di selezionare
	 * in base al minuto di gioco quando viene effettuato un goal
	 * se la condizione risulta verificata si provvedere, con un ulteriore casualizzatore
	 * alla selezione della squadra che ha segnato il goal.
	 * una volta scelta la squadra si incrementa un contatore di punti per ciascuna squadra e si
	 * stampa il giocatore che ha segnato il goal
	 * al termine dello scorrimento dei minuti si stampa il risultato della partita
	 */
	public void gioca()
	{		
		//sviluppo della partita minuto per minuto
		for (int minuto=0; minuto<90; minuto++)
		{
 
			if (minuto == 0) System.out.println("\n\t\t   Inizio Primo Tempo\n");
			if (minuto == 45) System.out.println("\n\t\t    Fine Primo Tempo\n\t\t   --------------------\n\t\t   Inizio Secondo Tempo\n");
			//casualizzatore per i goal
			if ((Math.random() + Math.random()) < (Math.random() - Math.random()))
			{
				//Selezionatore per la scelta di una delle due squadre
				int c = Math.round((float)Math.random());
 
				//se il selezionatore preleva la prima squadra
				if (c == 1)
				{
					//incremento del numero di goal della prima squadra
					goals1++;
					Giocatore g = getGiocatorePerProbabilitaDiSegnare(s1);
					System.out.println("Ha segnato: " + g.nome + " (" + g.maglia + ") - " + g.ruolo + " ["+s1.nome+"]" + " al: " + minuto + "'");
				}
				//altrimenti viene prelevata la seconda
				else
				{
					//incremento del numero di goal della seconda squadra
					goals2++;
					Giocatore g = getGiocatorePerProbabilitaDiSegnare(s2);
					System.out.println("Ha segnato: " + g.nome + " (" + g.maglia + ") - " + g.ruolo + " ["+s2.nome+"]" + " al: " + minuto + "'");
				}
			}
		}
		System.out.println("\n\t\t    Fine Secondo Tempo\n");
 
		//stampa del risultato finale della partita
		System.out.println("\n\t\t"+s1.nome+" - "+goals1+"  ||  "+goals2+" - "+s2.nome);
		System.out.println("\t---------------------------------------\n\t\t      Fine Partita\n\n");
	}
}

About the Author

Hello everyone! I'm Andrea Rastelli, a 23 year old programmer, designer, 3D animator and compositor. You may follow me on Twitter and Facebook