public abstract bool EstSimplementValide(Plateau plateau, Coords origine, Coords fin, ref int nbPrises);
public abstract int GetMaxPrisesPossibles(Plateau plateau, Coords position);
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; } } }
private bool EstMinimalementValide(Plateau plateau, Coords origine, Coords fin, Coords unitaire, ref int nbPrises, ref Piece sautee) { if (!Plateau.EstDansLePlateau(fin)) { return(false); } bool dejaPrise = false; var tmp = origine; Piece tmpPiece = null; while (tmp != fin)//on se déplace en diagonale, pas besoin de tout comparer TODO: { tmp += unitaire; tmpPiece = plateau.Get(tmp); if (tmpPiece != null) { if (dejaPrise || tmpPiece.flag) { return(false); } else { dejaPrise = true; sautee = tmpPiece; } 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, int nbPrises = 0) { Coords tmpPos; Piece tmpPiece; Coords[] directions = GetDirections(); possibles.AddLast(nbPrises); for (int i = 0; i < 4; i++) { tmpPos = origine + directions[i]; if (Plateau.EstDansLePlateau(tmpPos)) { tmpPiece = plateau.Get(tmpPos); if (tmpPiece != null && tmpPiece.EstBlanc != EstBlanc && !tmpPiece.flag) { tmpPos = tmpPos + directions[i]; if (Plateau.EstDansLePlateau(tmpPos) && plateau.Get(tmpPos) == null) { // flag pour ne pas ressauter des pieces tmpPiece.flag = true; GetMouvementsPossiblesRec(plateau, possibles, ref tmpPos, nbPrises + 1); tmpPiece.flag = false; } } } } }