bool IsBallCrossingTrajectory(BallLocation cell) { if (Hits.FirstOrDefault(aa => aa.X == cell.X && aa.Y == cell.Y) != null) { return(true); } return(false); }
/// <summary> /// Rzut kulą po tablicy /// </summary> /// <param name="k">K- X direction</param> /// <param name="l">L- Y direction </param> /// <param name="throDirection">kierunek w którym piłka ma sie potoczyć</param> /// <returns></returns> internal List <BallLocation> HitBall(int xSatart, int yStart, Direction throDirection) { //resetuj wyniki Hits = new List <BallLocation>(); if (xSatart > x) { throw new ArgumentException("Za duża początowa wartośc X"); } if (yStart > y) { throw new ArgumentException("Za duża początkowa wartośc Y"); } BallLocation startCell = new BallLocation(yStart, yStart); Hits.Add(startCell); //Obliczam początkowy kierunek dla piłki w prawo czy w lewo i dodołu i do góry bool yDown = IsDownDirection(throDirection); bool xDown = IsRigthSideDirection(throDirection); bool isFinish = false; while (!isFinish) { //jeżeli kończy się plansza dla y to odwróć kierunek if (yDown) { if (yStart - 1 < 0) { //zawracamy piłeczkę yDown = !yDown; } } else { //y if (yStart + 1 > y - 1) { yDown = !yDown; } } //jeżeli kończy się plansza dla X to odwróć kierunek if (xDown) { if (xSatart - 1 < 0) { //zawracamy piłeczkę xDown = !xDown; } } else { //y if (xSatart + 1 > x - 1) { xDown = !xDown; } } //ruszaj piłeczką o jedno pole if (yDown) { yStart--; } else { yStart++; } if (xDown) { xSatart--; } else { xSatart++; } //tworzę pole na którym jest teraz piłka BallLocation cell = new BallLocation(xSatart, yStart); ///Sprawdzam warunek wyjścia ///jeśli Hits zawiera już współrzędne ruchu (cell) to wychodzimy z pętli while ///bo trafiliśmy na pole w którym już była piłka if (IsBallCrossingTrajectory(cell)) { //get out of here isFinish = true; continue; } //Zapisz trajektorie na liście odwiedzonych pól Hits.Add(cell); } return(Hits); }