public AzioneSelezioneDestra(Quantum quantum, Casella casellaPartenza) { this.casellaPartenza = casellaPartenza; this.quantum = quantum; naveUsata = casellaPartenza.Occupante; GuiManager gui = quantum.getGUI(); gui.Tabellone.ResetSelezioneMouse(); gui.Tabellone.MostraSelezione = false; // HACK: gestire in maniera sensata e più agile il posizionamento dei Widget // (magari con un costruttore nuovo a cui si passa invece di solo un punto qualche informazione in più per posizionarsi?) // P.S: se ne è occupato Mirco! Ci metterà mano lui Vector2 pos1 = gui.Tabellone.Tile2Pixel(this.casellaPartenza); Vector2 pos2 = pos1; var lato = gui.Tabellone.LatoCasella; pos1 -= new Vector2(20 - lato / 2, 15); pos2 += new Vector2(20 + lato / 2, -15); bool puòRiconfig = !naveUsata.Riconfigurata; bool puòUsareSpecial = !naveUsata.SpecialUsata && checkSpecial(naveUsata); Riconfig = new Widget(pos1, doveDisegnoWidget.sinistra, widget.Riconfigura, puòRiconfig); Special = new Widget(pos2, doveDisegnoWidget.destra, widget.UsaSpecial, puòUsareSpecial); Riconfig.Click += riconfigura; Special.Click += usaSpecial; gui.Iscrivi(Riconfig); gui.Iscrivi(Special); }
public AzioneMovimento(Quantum quantum, Casella casellaPartenza, bool puòAttaccare = true) { this.casellaPartenza = casellaPartenza; naveMossa = casellaPartenza.Occupante; this.quantum = quantum; this.puòAttaccare = puòAttaccare; // Faccio partire il pathfinder pathFinder = new PathFinder(); pathFinder.Start(this.casellaPartenza, naveMossa.MuoveInDiagonale); // Illumino le caselle raggiungibili int[] caselleRaggiungibili = Tile.Tiles(t => { Casella casella = t as Casella; int d = pathFinder.DistanzaCasella(t); return (d <= naveMossa.Pwr && d > 0 && (puòAttaccare || (casella != null && casella.Occupante == null) )); } ).Select(t => t.ID).ToArray(); quantum.getGUI().Tabellone.ResetSelezioneMouse(); quantum.getGUI().Tabellone.IlluminaCaselle(caselleRaggiungibili); }
private int numero; //<Número de la casella. public Casella(Posicio posicio, Element element, Casella parella, int numero) { this.posicio = posicio; this.element = element; this.parella = parella; this.numero = numero; }
public Casella Muovi(int dado) { if (this.contatorePrigione != -1) { controller.Doppio = 0; } effettoCasella = false; Casella arrivo = partenza; percorso = new Casella[dado]; for (int i = 0; i < dado; i++) { arrivo = arrivo.prossimaCasella; percorso[i] = arrivo; if (percorso[i].name == "1" && this.contatorePrigione == -1) { this.TrasferimentoDenaro(200); } } if (this.contatorePrigione == -2) { this.contatorePrigione = -1; } this.indicePercorso = 0; return(arrivo); }
// Metodo per controllare se la nave sia stata affondata public bool ControlloDanni(Casella parteNaveColpita) { // dichiaro le variabili utili alla funzione bool colpitoeAffondato = true; // ciclo for per settare la casella come colpita for (int i = 0; i < this.Lunghezza; i++) { // vado a individuare il punto della nave che è stata colpito if (this.Posizione[i].Riga == parteNaveColpita.Riga && this.Posizione[i].Colonna == parteNaveColpita.Colonna) { // casella trovata, vado a settare lo stato come colpita this.Posizione[i].StatoCasella = Stato.colpita; } } // ciclo for per controllare se la nave sia affondata for (int i = 0; i < this.Lunghezza; i++) { if (this.Posizione[i].StatoCasella != Stato.colpita) { colpitoeAffondato = false; } } return(colpitoeAffondato); }
private void bottoneCampoDaGioco_Click(object sender, MouseEventArgs e) { // Ottengo le cordinate del bottone cliccato Button bottoneCliccato = (Button)sender; Point posizione = (Point)bottoneCliccato.Tag; Casella casellaSelezionata = new Casella(posizione.X, posizione.Y); if (naveSelezionata == null) { formPartita.ConsoleLabel.Text = "Non hai selezionato ancora nessuna nave!"; } else { switch (e.Button) { case MouseButtons.Right: // Se premo il tasto destro del mouse devo modificare la direzione dell'inserimento da orizzontale // a verticale o viceversa direzioneInserimento = !direzioneInserimento; formPartita.ConsoleLabel.Text = "Direzione inserirento:" + ((direzioneInserimento)? "orizzontale" : "verticale"); break; case MouseButtons.Left: // Controllo che la nave non sia stata inserita in precedenza if (naveSelezionata.Inserita) { formPartita.ConsoleLabel.Text = "La nave selezionata è gia stata inserita."; } else { // Provo l'inserimento della nave nel campo del giocatore naveSelezionata.InserimentoNave(casellaSelezionata, giocatore_1.MioCampo, direzioneInserimento); // Condizione if per controllare che l'inserimento sia andato a buon fine if (naveSelezionata.Inserita) { // Se l'inserimento è andato a buon fine aggiorno il campo da gioco del giocatore in modo che l'utente // possa vedere l'avvenuto inserimento picSelezionata.BackColor = Color.FromArgb(73, 255, 93); for (int i = 0; i < naveSelezionata.Lunghezza; i++) { campoG1Btn[naveSelezionata.Posizione[i].Riga, naveSelezionata.Posizione[i].Colonna].Text = "" + naveSelezionata.SimboloNave; campoG1Btn[naveSelezionata.Posizione[i].Riga, naveSelezionata.Posizione[i].Colonna].BackColor = Color.Gray; } } else { formPartita.ConsoleLabel.Text = "La casella e/o la direzione scelta non risulta valida"; } } break; } } // Invoco la funzione che andrà a controllare se la partita può iniziare controlloInizioPartita(); }
public AzioneSpecialDestroyer(Quantum quantum, Casella casellaPartenza) { _partenza = casellaPartenza; this.quantum = quantum; _naveMossa = casellaPartenza.Occupante; int[] disponibili = Tile.Tiles(t => t.PresenzaAlleata(quantum.getGestoreDiGiocatori().getGiocatoreDiTurno())).Select(t => t.ID).ToArray(); quantum.getGUI().Tabellone.IlluminaCaselle(disponibili); quantum.getGUI().Tabellone.ResetSelezioneMouse(); Interfaccia.ConsoleMessaggi.NuovoMessaggio("Scegli l'alleato con cui fare il warp:"); }
/// <summary> /// Azione per piazzare una nave dova clicca il giocatore /// </summary> public AzionePiazzaNave(Quantum quantum, Nave naveDaPiazzare, Casella[] caselleDisponibili) { // Piazzo una Nave in una casella arbitraria fra quelle dell'argomento this.quantum = quantum; this.caselleDisponibili = caselleDisponibili; this.naveDaPiazzare = naveDaPiazzare; quantum.getGUI().Tabellone.ResetSelezioneMouse(); if (!caselleDisponibili.Any()) { Interfaccia.ConsoleMessaggi.NuovoMessaggio("Impossibile piazzare la nave!", Color.Salmon); Cleanup(); } }
public Casella Muovi(Casella partenza, Casella arrivo) { int numeroPartenza = int.Parse(partenza.name); int numeroArrivo = int.Parse(arrivo.name); if (numeroPartenza < numeroArrivo) { return(Muovi(numeroArrivo - numeroPartenza)); } else { return(Muovi(40 + numeroArrivo - numeroPartenza)); } }
public AzioneSpecialFlagship(Quantum quantum, Casella casellaPartenza) { this.quantum = quantum; this.casellaFlagship = casellaPartenza; flagship = casellaPartenza.Occupante; // Selezione caselle da illuminare Func<Tile, bool> filtraAlleati = (t => t.EunaCasella && t.PresenzaAlleata(flagship)); int[] tiles = Tile.IdTiles(filtraAlleati); int[] caselle = tiles.Where(t => { return casellaFlagship.Adiacente(t, true); }).ToArray(); quantum.getGUI().Tabellone.IlluminaCaselle(caselle); fase = sceltaAlleato; Interfaccia.ConsoleMessaggi.NuovoMessaggio("Clicca su un alleato adiacente"); }
public AzioneSpecialBattlestation(Quantum quantum, Casella posizioneIniziale) { this.quantum = quantum; this.posizione = posizioneIniziale; this.nave = posizione.Occupante; var bersagli = Tile.Tiles( (Tile t) => { var c = t as Casella; return c?.Adiacente(posizione, false) == true && c?.Occupante?.Alleato(quantum.getGestoreDiGiocatori().getGiocatoreDiTurno()) == false; }).Select(c => c.ID).ToArray(); quantum.getGUI().Tabellone.IlluminaCaselle(bersagli); quantum.getGUI().Tabellone.ResetSelezioneMouse(); ConsoleMessaggi.NuovoMessaggio("Scegli l'avversario da attaccare"); }
public void Effetto(giocatore giocatoreDiTurno) { if (valore == 0 && movimento == 0) { giocatoreDiTurno.uscitaDiPrigione = true; GameObject.FindObjectOfType <StateController>().uscitaPrigione.SetActive(true); return; } giocatoreDiTurno.TrasferimentoDenaro(this.valore); if (movimento == -3) { giocatoreDiTurno.contatorePrigione = -2; movimento = int.Parse(giocatoreDiTurno.partenza.name) - 3; if (movimento <= 0) { movimento += 40; } } if (movimento != 0) { Casella[] caselle = GameObject.FindObjectsOfType <Casella>(); Casella casella = null; foreach (Casella item in caselle) { if (item.name == movimento.ToString()) { casella = item; } } if (casella.name == "11") { giocatoreDiTurno.contatorePrigione = 0; } giocatoreDiTurno.partenza = giocatoreDiTurno.Muovi(giocatoreDiTurno.partenza, casella); } }
//float pos = 0f; //Curve percorsoX; //Curve percorsoY; public Movimento(Quantum quantum, Nave naveMossa, Casella[] percorso) { // Avevo provato ad usare le curve, ma è un po' difficile (bisogna settare tutte le tangenti una per una) // e forse, con il tabellone quadrato, non viene nemmeno bene // però, con i percorsi dritti, viene un po' troppo squadrato // qualche idea? //percorsoX = new Curve(); //percorsoY = new Curve(); //float i = 0; //float n = percorso.Length; //foreach (var p in percorso) //{ // percorsoX.Keys.Add(new CurveKey(i / n, p.X)); // percorsoY.Keys.Add(new CurveKey(i / n, p.X)); // i++; //} this.quantum = quantum; this.naveMossa = naveMossa; _percorso = percorso.Select(casella => quantum.getGUI().Tabellone.Tile2Pixel(casella)).ToArray(); lungh = percorso.Length; }
void lancioAnimazione() { // Prendo tutti i punti del percorso della nave IEnumerable<Casella> casellePercorso = pathFinder.PercorsoXCasella(casellaTarget).Select ( idCasella => (Casella)Tile.id2Tile(idCasella) ); //Aggiungo la casella di partenza della nave Casella[] caselleDaPercorrere = new Casella[] { casellaPartenza }.Concat(casellePercorso).ToArray(); quantum.getGestoreDiAzioni().ImpilaAzione(new Movimento(quantum, naveMossa, caselleDaPercorrere)); Cleanup(); }
//Metodo per il controllo e il successivo inserimento della nave in griglia di gioco public void InserimentoNave(Casella cordinata, CampoDaGioco campo, bool direzione) { bool casellaLibera = true; if (direzione) // Se direzione = true la nave sarà disposta orizzontalmente { for (int i = 0; i < this.Lunghezza; i++) // ciclo per controllare tutte le caselle necessarie alla nave per inserirsi { if (casellaLibera == true) { // Controllo che i valori siano validi e non eccedano la dimensione della matrice if ((cordinata.Riga) > 9 || (cordinata.Colonna + i) > 9) { casellaLibera = false; } // Faccio un ulteriore controllo che la casella non risulti occupata else if (campo.Casella[cordinata.Riga, cordinata.Colonna + i].StatoCasella != Stato.libera) { casellaLibera = false; } } } if (casellaLibera) // tutte le caselle sono libere { // Vado a inserire la nave for (int i = 0; i < this.Lunghezza; i++) { // Disegno nella griglia il simbolo della nave campo.Casella[cordinata.Riga, cordinata.Colonna + i].SimboloCasella = this.SimboloNave; // Setto la casella come occupata campo.Casella[cordinata.Riga, cordinata.Colonna + i].StatoCasella = Stato.occupata; // Salvo nella nave la posizione nella griglia this.Posizione[i] = new Casella(cordinata.Riga, cordinata.Colonna + i); // Setto la variabile Inserita come true this.Inserita = true; } } } else // direzione = false. La nave deve essere disposta in modo verticale { for (int i = 0; i < this.Lunghezza; i++) // ciclo per conttrollare tutte le caselle necessarie alla nave per inserirsi { if (casellaLibera) { // Controllo che i valori siano validi e non eccedano la dimensione della matrice if ((cordinata.Riga + i) > 9 || (cordinata.Colonna) > 9) { casellaLibera = false; } // Faccio un ulteriore controllo che la casella non risulti occupata else if (campo.Casella[cordinata.Riga + i, cordinata.Colonna].StatoCasella != Stato.libera) { casellaLibera = false; } } } if (casellaLibera) // tutte le caselle sono libere vado a inserire la nave { for (int i = 0; i < this.Lunghezza; i++) { // Disegno nella griglia il simbolo della nave campo.Casella[cordinata.Riga + i, cordinata.Colonna].SimboloCasella = this.SimboloNave; // Setto la casella come occupata campo.Casella[cordinata.Riga + i, cordinata.Colonna].StatoCasella = Stato.occupata; // Salvo nella nave la posizione nella griglia this.Posizione[i] = new Casella(cordinata.Riga + i, cordinata.Colonna); // Setto la variabile Inserita come true this.Inserita = true; } } } }
private void bottoneCampoAvversario_Click(object sender, MouseEventArgs e) { // dichiaro una variabile button e la rendo uguale a sender Button bottoneCliccato = (Button)sender; // faccio una conversione in Point in modo da poter utilizzare il tag // ovvero i valori x e y della casella cliccata Point posizione = (Point)bottoneCliccato.Tag; Casella casellaSelezionata = new Casella(posizione.X, posizione.Y); bool naveColpita; bool colpitaeAffondata; // Faccio un controllo preventivo per vedere se la casella può essere colpita if (giocatore_2.MioCampo.Casella[casellaSelezionata.Riga, casellaSelezionata.Colonna].StatoCasella == Stato.colpita || giocatore_2.MioCampo.Casella[casellaSelezionata.Riga, casellaSelezionata.Colonna].StatoCasella == Stato.mancata) { formPartita.ConsoleLabel.Text = "Hai già fatto fuoco su questa casella. Selezionane un'altra"; } else { // la casella è libera. Posso sparare naveColpita = giocatore_1.FaccioFuoco(casellaSelezionata, giocatore_2.MioCampo); // Una volta sparato faccio un controllo nel caso la nave sia stata affondata if (naveColpita) { // La nave è stata colpita, devo colorare la casella di rosso campoG2Btn[casellaSelezionata.Riga, casellaSelezionata.Colonna].BackColor = Color.Red; colpitaeAffondata = giocatore_2.ControllaNaveColpita(casellaSelezionata); if (colpitaeAffondata) { formPartita.ConsoleLabel.Text = giocatore_1.Nome + ": hai "; formPartita.ConsoleLabel.Text += "colpito e affondato una nave nemica"; // Se la nave è stata affondata controllo che il giocatore avversario abbia altre navi. // In caso contrario sarebbe gameover if (giocatore_2.GameOver()) { // Il giocatore 2 ha perso. Faccio in modo che non si possa più cliccare // sulla casella del campo avversario for (int i = 0; i < 10; i++) { for (int j = 0; j < 10; j++) { campoG2Btn[i, j].MouseClick -= bottoneCampoAvversario_Click; } } formPartita.ConsoleLabel.Text += "\nComplimenti " + giocatore_1.Nome + " hai vinto la partita!"; formPartita.NaviPosizionateBtn.Text = "TORNA AL MENU PRINCIPALE"; formPartita.NaviPosizionateBtn.Visible = true; formPartita.NaviPosizionateBtn.MouseClick += tornoAlMenuPrincipale_Click; } } else { // La nave è stata solamente colpita formPartita.ConsoleLabel.Text = giocatore_1.Nome + ": hai "; formPartita.ConsoleLabel.Text += "colpito una nave nemica"; } } else { // non è stato colpita nessuna nave avversaria. Devo colorare // la casella di blu campoG2Btn[casellaSelezionata.Riga, casellaSelezionata.Colonna].BackColor = Color.Blue; formPartita.ConsoleLabel.Text = giocatore_1.Nome + ": hai "; formPartita.ConsoleLabel.Text += "mancato il nemico!"; } // Turno del giocatore 1 finito. Inizio turno giocatore 2 if (giocatore_2.GameOver() == false) { // Inizio turno giocatore 2. Devo disabilitare il click // sui bottoni del campo del giocatore 1 for (int i = 0; i < giocatore_1.MioCampo.Dimensione; i++) { for (int j = 0; j < giocatore_1.MioCampo.Dimensione; j++) { campoG2Btn[i, j].MouseClick -= bottoneCampoAvversario_Click; } } // Se il giocatore 2 non ha ancora perso, può eseguire il suo turno // verrà utilizzato un timer per far in modo che l'utente possa riuscire // a leggere il risultato del suo sparo nella consoleLabel timer = new System.Windows.Forms.Timer(); timer.Tick += new EventHandler(turnoIA); timer.Interval = 1500; // setto un intervallo di 1 secondo timer.Start(); } } }
public void carregar(int nivell, string[] linies) { int indexLinia = 0; //Primera línia: mida del costat del tauler. int nFiles = System.Int32.Parse(linies[indexLinia].Split(';')[0]); int nColumnes = System.Int32.Parse(linies[indexLinia].Split(';')[1]); //Debug.Log("Files: " + nFiles + ", columnes: " + nColumnes); indexLinia++; //Línia en blanc. indexLinia++; //Debug.Log("Començem a llegir el taulell en la linia " + indexLinia); Dictionary <int, Posicio> vinculador = new Dictionary <int, Posicio>(); List <List <Casella> > t = new List <List <Casella> >(); Jugador jugador = null; Sortida sortida = null; //Aplicar la capa d'estructura { for (int i = 0; i < nFiles; i++) { string[] sFila = linies[indexLinia++].Split(';'); if (sFila.Length != nColumnes) { throw new FitxerFormatException("La fila " + i + " de l'estructura del taulell no és valida, hauria de tenir: " + nColumnes + " columnes i en té: " + sFila.Length); } List <Casella> f = new List <Casella>(nColumnes); t.Add(f); for (int j = 0; j < nColumnes; j++) { Element element = Element.BUIT; Casella parella = null; int valor = System.Int32.Parse(sFila[j]); Posicio pos = new Posicio(i, j); if (valor > 0) { //Fem el doble enllaç de la posició. if (!vinculador.ContainsKey(valor)) { //Debug.Log("Afegim " + pos + " per vincular amb etiqueta "+valor); vinculador.Add(valor, pos); } else { Posicio pParella = vinculador[valor]; //Debug.Log("Anem a vincular la etiqueta " + valor + ", trobat: " + pParella); parella = t[pParella.y][pParella.x]; vinculador.Remove(valor); } } else { element = valor == PARED_IN_H ? Element.PARED_IN_H: Element.PARED_IN_V; } f.Add(new Casella(pos, element, parella, valor)); } } } Debug.Log("Fase 1 acabada, estructura del taulell"); //Línia en blanc. indexLinia++; //Aplicar la capa d'objectes. { for (int i = 0; i < nFiles; i++) { string[] sFila = linies[indexLinia++].Split(';'); if (sFila.Length != nColumnes) { throw new FitxerFormatException("La fila " + i + " de l'estructura dels objectes del taulell no és valida, hauria de tenir: " + nColumnes + " columnes i en té: " + sFila.Length); } for (int j = 0; j < nColumnes; j++) { //Debug.Log("Trobat: " + sFila[j]); switch (sFila[j]) { case "C": //Coin -> Moneda t[i][j].setElement(Element.MONEDA); break; case "E": //Exit -> Sortida sortida = new Sortida(new Posicio(i, j)); break; case "P": //Player -> Jugador jugador = new Jugador(new Posicio(i, j)); break; } } } } Debug.Log("Fase 2 acabada, objectes del taulell"); if (vinculador.Keys.Count > 0) { //El taulell està mal format, cal llençar excepció. } this.setup(new Taulell(nivell, nFiles, nColumnes, t, jugador, sortida).validar()); }
private void turnoIA(object source, EventArgs e) { bool naveColpita; bool colpitaeAffondata; Casella bersaglio = new Casella(); timer.Stop(); // Racchiudo il generatore di cordinate casuali in un ciclo do-while in modo da essere // sicuro che le cordinate generate possano essere accettate. do { // Genero un seme sempre diverso Random rand = new Random((int)DateTime.Now.Millisecond); // Genero 2: uno per la riga, uno per la colonna bersaglio.Riga = rand.Next(0, 10); bersaglio.Colonna = rand.Next(0, 10); } while (giocatore_1.MioCampo.Casella[bersaglio.Riga, bersaglio.Colonna].StatoCasella == Stato.colpita || giocatore_1.MioCampo.Casella[bersaglio.Riga, bersaglio.Colonna].StatoCasella == Stato.mancata); // Una volta generate le cordinate corrette faccio fuoco sul campo avversario naveColpita = giocatore_2.FaccioFuoco(bersaglio, giocatore_1.MioCampo); // Una volta sparato faccio un controllo nel caso la nave sia stata affondata if (naveColpita) { // La nave è stata colpita, devo colorare la casella di rosso campoG1Btn[bersaglio.Riga, bersaglio.Colonna].BackColor = Color.Red; colpitaeAffondata = giocatore_1.ControllaNaveColpita(bersaglio); if (colpitaeAffondata) { formPartita.ConsoleLabel.Text = giocatore_2.Nome + ": hai "; formPartita.ConsoleLabel.Text += "colpito e affondato una nave nemica!"; if (giocatore_1.GameOver()) { // Il giocatore 1 ha perso. Faccio in modo che non si possa più cliccare // sulla casella del campo avversario for (int i = 0; i < 10; i++) { for (int j = 0; j < 10; j++) { campoG2Btn[i, j].MouseClick -= bottoneCampoAvversario_Click; } } formPartita.ConsoleLabel.Text += "\nComplimenti " + giocatore_2.Nome + " hai vinto la partita!"; formPartita.NaviPosizionateBtn.Text = "TORNA AL MENU PRINCIPALE"; formPartita.NaviPosizionateBtn.Visible = true; formPartita.NaviPosizionateBtn.MouseClick += tornoAlMenuPrincipale_Click; } } else { formPartita.ConsoleLabel.Text = giocatore_2.Nome + ": hai "; formPartita.ConsoleLabel.Text += "colpito una nave nemica!"; } } else { campoG1Btn[bersaglio.Riga, bersaglio.Colonna].BackColor = Color.Blue; formPartita.ConsoleLabel.Text = giocatore_2.Nome + ": hai "; formPartita.ConsoleLabel.Text += "mancato il nemico!"; } if (!giocatore_1.GameOver()) { // Turno del giocatore 2 finito. Devo riabilitare il click // sul campo avversario for (int i = 0; i < giocatore_1.MioCampo.Dimensione; i++) { for (int j = 0; j < giocatore_1.MioCampo.Dimensione; j++) { campoG2Btn[i, j].MouseClick += bottoneCampoAvversario_Click; } } } }