Esempio n. 1
0
        public override bool EstSimplementValide(Plateau plateau, Coords origine, Coords fin, ref int nbPrises)
        {
            if (!Plateau.EstDansLePlateau(fin))
            {
                return(false);
            }
            Coords deplacement = fin - origine;

            if (deplacement.EstDiag() && deplacement.Longueur() > 0)
            {
                deplacement = deplacement.GetVraiUnitaire();
                bool  dejaPrise = false;
                var   tmp       = origine;
                Piece tmpPiece  = null;
                while (tmp.X != fin.X)//on se déplace en diagonale, pas besoin de tout comparer
                {
                    tmp     += deplacement;
                    tmpPiece = plateau.Get(tmp);
                    if (tmpPiece != null)
                    {
                        if (dejaPrise)
                        {
                            return(false);
                        }
                        else
                        {
                            dejaPrise = true;
                        }
                        if (tmpPiece.EstBlanc == EstBlanc)
                        {
                            return(false);
                        }
                    }
                }
                if (tmpPiece == null)
                {
                    if (dejaPrise)
                    {
                        nbPrises++;
                    }
                    return(true);
                }
            }

            return(false);
        }
Esempio n. 2
0
        private void GetMouvementsPossiblesRec(Plateau plateau, LinkedList <int> possibles, ref Coords origine, Coords directionOrigineDirecteur, int nbPrises = 0)
        {
            possibles.AddLast(nbPrises);
            Coords tmpPos          = origine;
            Piece  tmpPiece        = null;
            Coords direction       = directionOrigineDirecteur;
            int    tmpPrises       = 0;
            bool   invalideUneFois = false;

            while (true)
            {
                tmpPos   += direction;
                tmpPrises = nbPrises;
                if (EstMinimalementValide(plateau, origine, tmpPos, direction, ref tmpPrises, ref tmpPiece))
                {
                    if (tmpPrises > nbPrises)
                    {
                        tmpPiece.flag = true;
                        GetMouvementsPossiblesRec(plateau, possibles, ref tmpPos, direction, tmpPrises);
                        tmpPiece.flag = false;
                    }
                }
                else
                {
                    if (invalideUneFois)
                    {
                        invalideUneFois = false;
                        break;
                    }
                    invalideUneFois = true;
                }
            }
            if (directionOrigineDirecteur.GetVraiUnitaire() == DIAG1)
            {
                direction = DIAG2;
            }
            else
            {
                direction = DIAG1;
            }
            tmpPos = origine;
            while (true)
            {
                tmpPos   += direction;
                tmpPrises = nbPrises;
                if (EstMinimalementValide(plateau, origine, tmpPos, direction, ref tmpPrises, ref tmpPiece))
                {
                    if (tmpPrises > nbPrises)
                    {
                        tmpPiece.flag = true;
                        GetMouvementsPossiblesRec(plateau, possibles, ref tmpPos, direction, tmpPrises);
                        tmpPiece.flag = false;
                    }
                }
                else
                {
                    if (invalideUneFois)
                    {
                        invalideUneFois = false;
                        break;
                    }
                    invalideUneFois = true;
                }
            }
            tmpPos = origine;
            while (true)
            {
                tmpPos   -= direction; // la difference est la
                tmpPrises = nbPrises;
                if (EstMinimalementValide(plateau, origine, tmpPos, -direction, ref tmpPrises, ref tmpPiece))
                {
                    if (tmpPrises > nbPrises)
                    {
                        tmpPiece.flag = true;
                        GetMouvementsPossiblesRec(plateau, possibles, ref tmpPos, direction, tmpPrises);
                        tmpPiece.flag = false;
                    }
                }
                else
                {
                    if (invalideUneFois)
                    {
                        invalideUneFois = false;
                        break;
                    }
                    invalideUneFois = true;
                }
            }
        }