public bool PuòMuovere( Colonna colonnaPartenza, Traversa traversaPartenza, Colonna colonnaArrivo, Traversa traversaArrivo, IEnumerable <ICasa> listaCase = null) { listaCase = listaCase ?? Enumerable.Empty <ICasa>(); ICasa casaPartenza = listaCase.SingleOrDefault(casa => casa.Colonna == colonnaPartenza && casa.Traversa == traversaPartenza && casa.PezzoPresente == this); if ((this.colore == Colore.Bianco && colonnaArrivo - colonnaPartenza == 1 && traversaArrivo - traversaPartenza == 1) || (this.colore == Colore.Nero && colonnaPartenza - colonnaArrivo == 1 && traversaPartenza - traversaArrivo == 1)) { ICasa casaArrivo = listaCase.SingleOrDefault(casa => casa.Colonna == colonnaArrivo && casa.Traversa == traversaArrivo); if (casaArrivo.PezzoPresente.Colore != this.colore) { return(true); } } var stessaColonna = colonnaPartenza == colonnaArrivo; int distanzaTraLeTraverse; if (Colore == Colore.Bianco) { distanzaTraLeTraverse = (int)traversaArrivo - (int)traversaPartenza; } else { distanzaTraLeTraverse = (int)traversaPartenza - (int)traversaArrivo; } if (stessaColonna && distanzaTraLeTraverse == 1) { if (listaCase.SingleOrDefault(casa => casa.Colonna == colonnaArrivo && casa.Traversa == traversaArrivo)?.PezzoPresente == null) { return(true); } else { return(false); } } else { return(false); } }
public void sePezzoNonPresenteIlGetterRitornaNull() { //Given IScacchiera scacchiera = new Scacchiera(); //When ICasa casa = scacchiera[Colonna.B, Traversa.Prima]; //Then Assert.Null(casa.PezzoPresente); }
public void indexerDeveRestituireCasaCorretta() { //Given IScacchiera scacchiera = new Scacchiera(); //When ICasa casa = scacchiera[Colonna.F, Traversa.Quinta]; //Then Assert.Equal(Colonna.F, casa.Colonna); Assert.Equal(Traversa.Quinta, casa.Traversa); }
public override bool PuòMuovere( Colonna colonnaPartenza, Traversa traversaPartenza, Colonna colonnaArrivo, Traversa traversaArrivo, IEnumerable <ICasa> listaCase = null) { listaCase = listaCase ?? Enumerable.Empty <ICasa>(); if (!base.PuòMuovere(colonnaPartenza, traversaPartenza, colonnaArrivo, traversaArrivo, listaCase)) { return(false); } ICasa casaPartenza = listaCase.SingleOrDefault(casa => casa.Colonna == colonnaPartenza && casa.Traversa == traversaPartenza && casa.PezzoPresente == this); ICasa casaArrivo = listaCase.SingleOrDefault(casa => casa.Colonna == colonnaArrivo && casa.Traversa == traversaArrivo); if (casaArrivo?.PezzoPresente?.Colore == this.Colore) { return(false); } var differenzaColonne = colonnaPartenza - colonnaArrivo; var differenzaTraverse = (int)traversaPartenza - (int)traversaArrivo; if (differenzaTraverse == 2 || differenzaTraverse == -2) { if (differenzaColonne == 1 || differenzaColonne == -1) { return(true); } else { return(false); } } else if (differenzaColonne == 2 || differenzaColonne == -2) { if (differenzaTraverse == 1 || differenzaTraverse == -1) { return(true); } else { return(false); } } else { return(false); } }
public void ComportamentoDiCasa() { //Given ICasa casa1 = new Casa(Colonna.A, Traversa.Prima); ICasa casa2 = casa1; casa1.PezzoPresente = new Pedone(Colore.Bianco); casa2.PezzoPresente = new Pedone(Colore.Nero); //Then Assert.Equal(Colore.Nero, casa1.PezzoPresente.Colore); Assert.Equal(Colore.Nero, casa2.PezzoPresente.Colore); }
public void iPezziVengonoInseritiNellaPosizioneGiusta(Type pezzo, Colore colore, Colonna colonna, Traversa traversa) { //Given Scacchiera scacchiera = new Scacchiera(); //When scacchiera.disponiPezziInConfigurazioneIniziale(); ICasa casa = scacchiera[colonna, traversa]; //Then Assert.Equal(casa.PezzoPresente.GetType(), pezzo); Assert.Equal(casa.PezzoPresente.Colore, colore); }
public void InserisciMossa(string mossa) { Coordinata partenza = InterpretaCoordinataCasa(mossa.Substring(0, 2)); Coordinata arrivo = InterpretaCoordinataCasa(mossa.Substring(3, 2)); ICasa casaPartenza = Scacchiera[partenza.Colonna, partenza.Traversa]; ICasa casaArrivo = Scacchiera[arrivo.Colonna, arrivo.Traversa]; if (casaPartenza.PezzoPresente == null || casaPartenza.PezzoPresente?.Colore != Orologio.TurnoAttuale || casaArrivo.PezzoPresente?.Colore == Orologio.TurnoAttuale || casaPartenza.PezzoPresente?.PuòMuovere(partenza.Colonna, partenza.Traversa, arrivo.Colonna, arrivo.Traversa, Scacchiera.Case) == false ) { throw new InvalidOperationException("Mossa non valida"); } Scacchiera.SpostaPezzo(casaPartenza, casaArrivo); BloccoNote.ScriviMossa(mossa); //Controllo che il re non sia stato mangiato Colore coloreControlloSconfitta; if (Orologio.TurnoAttuale == Colore.Bianco) { coloreControlloSconfitta = Colore.Nero; } else { coloreControlloSconfitta = Colore.Bianco; } bool reInVita = Scacchiera.ReInVita(coloreControlloSconfitta); if (!reInVita) { Vittoria.Invoke(Scacchiera, Orologio.TurnoAttuale); } Orologio.FineTurno(); }
public override bool PuòMuovere( Colonna colonnaPartenza, Traversa traversaPartenza, Colonna colonnaArrivo, Traversa traversaArrivo, IEnumerable<ICasa> listaCase = null) { listaCase = listaCase??Enumerable.Empty<ICasa>(); if (!base.PuòMuovere(colonnaPartenza, traversaPartenza, colonnaArrivo, traversaArrivo, listaCase)) return false; if(colonnaArrivo == colonnaPartenza && traversaPartenza != traversaArrivo || traversaPartenza == traversaArrivo && colonnaPartenza != colonnaArrivo) { //Caso input senza listaCase if(listaCase == null){ return true; } else{ // Caso con lista in input ICasa casaPartenza = listaCase.SingleOrDefault(casa => casa.Colonna == colonnaPartenza && casa.Traversa == traversaPartenza && casa.PezzoPresente == this); ICasa casaArrivo = listaCase.SingleOrDefault( casa => casa.Colonna==colonnaArrivo && casa.Traversa == traversaArrivo); // Movimento in verticale if(colonnaArrivo == colonnaPartenza){ Traversa traversaMaggiore = traversaPartenza > traversaArrivo? traversaPartenza : traversaArrivo; Traversa traversaMinore = traversaPartenza < traversaArrivo? traversaPartenza : traversaArrivo; IEnumerable<ICasa> caseInMezzo = listaCase .Where(casa => casa.Colonna == colonnaPartenza && casa.Traversa < traversaMaggiore && casa.Traversa > traversaMinore) .ConPezzi(); if(caseInMezzo.Count() == 0){ // Nessun pezzo in mezzo if(casaArrivo?.PezzoPresente == null || casaPartenza.PezzoPresente.Colore != casaArrivo.PezzoPresente.Colore){ return true; // Mangiato o casella vuota! } else{ // Stesso colore nella casella di arrivo return false; } } else { // Pezzi in mezzo return false; } } else { // Movimento in orizzontale Colonna colonnaMaggiore = colonnaPartenza > colonnaArrivo ? colonnaPartenza: colonnaArrivo; Colonna colonnaMinore = colonnaPartenza < colonnaArrivo ? colonnaPartenza: colonnaArrivo; IEnumerable<ICasa> caseInMezzo = listaCase .Where(casa => casa.Traversa == traversaPartenza && casa.Colonna < colonnaMaggiore && casa.Colonna > colonnaMinore) .ConPezzi(); if(caseInMezzo.Count() == 0){ // Nessun pezzo in mezzo if(casaPartenza?.PezzoPresente?.Colore != casaArrivo?.PezzoPresente?.Colore || casaArrivo?.PezzoPresente == null){ return true; // Mangiato o casella vuota! } else{ // Stesso colore nella casella di arrivo return false; } } else { // Pezzi in mezzo return false; } } else { // Pezzi in mezzo return false; } }
public override bool PuòMuovere( Colonna colonnaPartenza, Traversa traversaPartenza, Colonna colonnaArrivo, Traversa traversaArrivo, IEnumerable <ICasa> listaCase = null) { var differenzaColonne = colonnaPartenza - colonnaArrivo; var differenzaTraverse = (int)traversaPartenza - (int)traversaArrivo; if (listaCase != null) { listaCase = listaCase ?? Enumerable.Empty <ICasa>(); ICasa casaPartenza = listaCase.SingleOrDefault(casa => casa.Colonna == colonnaPartenza && casa.Traversa == traversaPartenza && casa.PezzoPresente == this); ICasa casaArrivo = listaCase.SingleOrDefault(casa => casa.Colonna == colonnaArrivo && casa.Traversa == traversaArrivo); if (((Math.Abs(differenzaColonne) - Math.Abs(differenzaTraverse)) == 0) && (differenzaColonne != 0 && differenzaTraverse != 0)) { int pezziInTraiettoria; if (traversaArrivo > traversaPartenza) { if (colonnaArrivo > colonnaPartenza) { pezziInTraiettoria = (listaCase.Where(casa => (casa.Traversa <traversaArrivo && casa.Traversa> traversaPartenza) && (casa.Colonna <colonnaArrivo && casa.Colonna> colonnaPartenza))).Count(); if (pezziInTraiettoria > 0) { return(false); } else { if (casaArrivo?.PezzoPresente?.Colore != this.Colore) { return(true); } else { return(false); } } } else { pezziInTraiettoria = (listaCase.Where(casa => (casa.Traversa <traversaArrivo && casa.Traversa> traversaPartenza) && (casa.Colonna > colonnaArrivo && casa.Colonna < colonnaPartenza))).Count(); if (pezziInTraiettoria > 0) { return(false); } else { if (casaArrivo?.PezzoPresente?.Colore != this.Colore) { return(true); } else { return(false); } } } } else { if (colonnaArrivo < colonnaPartenza) { pezziInTraiettoria = (listaCase.Where(casa => (casa.Traversa > traversaArrivo && casa.Traversa < traversaPartenza) && (casa.Colonna > colonnaArrivo && casa.Colonna < colonnaPartenza))).Count(); if (pezziInTraiettoria > 0) { return(false); } else { if (casaArrivo.PezzoPresente?.Colore != this.Colore) { return(true); } else { return(false); } } } else { pezziInTraiettoria = (listaCase.Where(casa => (casa.Traversa > traversaArrivo && casa.Traversa < traversaPartenza) && (casa.Colonna <colonnaArrivo && casa.Colonna> colonnaPartenza))).Count(); if (pezziInTraiettoria > 0) { return(false); } else { if (casaArrivo?.PezzoPresente?.Colore != this.Colore) { return(true); } else { return(false); } } } } } } if (differenzaColonne == 0 && differenzaTraverse == 0) { return(false); } if ((Math.Abs(differenzaColonne) - Math.Abs(differenzaTraverse)) == 0) { return(true); } else { return(false); } }
public override bool PuòMuovere( Colonna colonnaPartenza, Traversa traversaPartenza, Colonna colonnaArrivo, Traversa traversaArrivo, IEnumerable <ICasa> listaCase = null) { bool puòMuovere = base.PuòMuovere(colonnaPartenza, traversaPartenza, colonnaArrivo, traversaArrivo, listaCase); if (!puòMuovere) { return(false); } listaCase = listaCase ?? Enumerable.Empty <ICasa>(); ICasa casaPartenza = listaCase.SingleOrDefault(casa => casa.Colonna == colonnaPartenza && casa.Traversa == traversaPartenza && casa.PezzoPresente == this); //Avanzamento diagonale del pedone if ((this.Colore == Colore.Bianco && Math.Abs(colonnaArrivo - colonnaPartenza) == 1 && traversaArrivo - traversaPartenza == 1) || (this.Colore == Colore.Nero && Math.Abs(colonnaPartenza - colonnaArrivo) == 1 && traversaPartenza - traversaArrivo == 1)) { ICasa casaArrivo = listaCase.SingleOrDefault(casa => casa.Colonna == colonnaArrivo && casa.Traversa == traversaArrivo); if (casaArrivo?.PezzoPresente?.Colore != this.Colore) { return(true); } } //Normale avanzamento del pedone var stessaColonna = colonnaPartenza == colonnaArrivo; var primaMossa = traversaPartenza == traversaInizio; int distanzaTraLeTraverse; if (Colore == Colore.Bianco) { distanzaTraLeTraverse = (int)traversaArrivo - (int)traversaPartenza; } else { distanzaTraLeTraverse = (int)traversaPartenza - (int)traversaArrivo; } if (stessaColonna && distanzaTraLeTraverse == 1) { if (listaCase.SingleOrDefault(casa => casa.Colonna == colonnaArrivo && casa.Traversa == traversaArrivo)?.PezzoPresente == null) { return(true); } else { return(false); } } //Avanzamento del pedone di due caselle else if (primaMossa && stessaColonna && Math.Abs(distanzaTraLeTraverse) == 2) { try { //Vedo se trovo un pezzo all'interno della casa tra quella di //partenza e quella di arrivo. Se la trovo il pedone non si muove listaCase.Single((casa) => (this.Colore == Colore.Bianco && casa.Traversa <traversaArrivo && casa.Traversa> traversaPartenza && casa.PezzoPresente != null) || (this.Colore == Colore.Nero && casa.Traversa <traversaPartenza && casa.Traversa> traversaArrivo && casa.PezzoPresente != null)); return(false); } catch (InvalidOperationException ex) { return(true); } } else { return(false); } }
public override bool PuòMuovere( Colonna colonnaPartenza, Traversa traversaPartenza, Colonna colonnaArrivo, Traversa traversaArrivo, IEnumerable <ICasa> listaCase = null) { listaCase = listaCase ?? Enumerable.Empty <ICasa>(); //prendo la casa di partenza ICasa casaPartenza = listaCase.SingleOrDefault(casa => casa.Colonna == colonnaPartenza && casa.Traversa == traversaPartenza && casa.PezzoPresente == this); //prendo la casa di arrivo senza specificare se ci sia un pezzo o meno ICasa casaArrivo = listaCase.SingleOrDefault(casa => casa.Colonna == colonnaArrivo && casa.Traversa == traversaArrivo); //controllo che non ci siano pezzi tra me e l'arrivo //prendo le differenze tra colonne e traverse var differenzaColonne = (int)colonnaPartenza - (int)colonnaArrivo; var differenzaTraverse = (int)traversaPartenza - (int)traversaArrivo; //confronto le colonne e le traverse var stessaColonna = colonnaPartenza == colonnaArrivo; var stessaTraversa = traversaPartenza == traversaArrivo; //controllo se sono rimasto fermo if (differenzaColonne == 0 && differenzaTraverse == 0) { return(false); } //se la lista non è vuota devo fare un certo tipo di controlli per i test scritti if (listaCase.Count() != 0) { int pezziTrovati = -1; //prima di tutto devo capire se mi sto muovendo verticalmente, orizzontalmente o in obliquo if (((Math.Abs(differenzaColonne) - Math.Abs(differenzaTraverse)) == 0)) { // MI STO MUOVENDO IN OBLIQUO //controllo che davanti a me non ci siano pezzi di alcun genere pezziTrovati = (listaCase.Where(casa => casa.Colonna != casaPartenza.Colonna && casa.Traversa != casaPartenza.Traversa && casa.PezzoPresente != null)).Count(); } else if (stessaTraversa && !stessaColonna) { // MI STO MUOVENDO IN ORIZZONTALE //controllo che davanti a me non ci siano pezzi di alcun genere pezziTrovati = (listaCase.Where(casa => casa.Colonna != casaPartenza.Colonna && casa.PezzoPresente != null)).Count(); } else if (stessaColonna && !stessaTraversa) { // MI STO MUOVENDO IN VERTICALE //controllo che davanti a me non ci siano pezzi di alcun genere pezziTrovati = (listaCase.Where(casa => casa.Traversa != casaPartenza.Traversa && casa.PezzoPresente != null)).Count(); } // ora posso analizzare i pezzi trovati if (pezziTrovati > 1) { //ci sono più di un pezzo tra me e la destinazione, non è possibile andare oltre! return(false); } else if (pezziTrovati == 1) { //devo controllare la posizione di questo pezzo if (casaArrivo.PezzoPresente == null) { //allora il pezzo sta in mezzo tra me e la destinazione return(false); } else if (casaArrivo.PezzoPresente.Colore == this.Colore) { //questa voce causa fallimenti nei test precedenti quelli che non consideravano //le pedine nella scacchiera per farlo passare devo cancellare per forza i test //precedenti return(false); } else { return(true); } } else if (pezziTrovati == 0) { //non c'è nessun pezzo tra me e la destinazione posso andare lì return(true); } else { //Se sono qui la variabile è rimasta inizializzata a -1 e quindi ho avuto un errore nell'interpretazione //del programma return(false); } } //Se sono qui sto facendo un test senza considerare delle case in input if ((Math.Abs(differenzaColonne) <= 1 && Math.Abs(differenzaTraverse) <= 1) || ((stessaTraversa && !stessaColonna) || (stessaColonna && !stessaTraversa)) || ((Math.Abs(differenzaColonne) - Math.Abs(differenzaTraverse)) == 0)) { return(true); } else { return(false); } }
public void SpostaPezzo(ICasa casaPartenza, ICasa casaArrivo) { casaArrivo.PezzoPresente = casaPartenza.PezzoPresente; casaPartenza.PezzoPresente = null; }