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); }
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; } } }