Пример #1
0
        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);
            }
        }
Пример #2
0
        public void sePezzoNonPresenteIlGetterRitornaNull()
        {
            //Given
            IScacchiera scacchiera = new Scacchiera();
            //When
            ICasa casa = scacchiera[Colonna.B, Traversa.Prima];

            //Then
            Assert.Null(casa.PezzoPresente);
        }
Пример #3
0
        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);
        }
Пример #4
0
        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);
        }
Пример #6
0
        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);
        }
Пример #7
0
        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();
        }
Пример #8
0
        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;
                        }


                    }
Пример #9
0
        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);
            }
        }
Пример #10
0
        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);
            }
        }
Пример #11
0
        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);
            }
        }
Пример #12
0
 public void SpostaPezzo(ICasa casaPartenza, ICasa casaArrivo)
 {
     casaArrivo.PezzoPresente   = casaPartenza.PezzoPresente;
     casaPartenza.PezzoPresente = null;
 }