/// <summary> /// смотрим конфигурацию стен, чтобы определить - куда поворачивать луч /// битовая конфигурация, всего 8 вариантов /// \ 4 /// 1 2 /// /// </summary> public static int GetWallsConfig(StructBeam beam) { int res = 0; int dx = GetStep(beam.dir).X; int dy = GetStep(beam.dir).Y; if (field[beam.x + 0, beam.y + dy] > 0) { res += (beam.dir == 1 || beam.dir == 3) ? 4 : 1; } if (field[beam.x + dx, beam.y + dy] > 0) { res += 2; } if (field[beam.x + dx, beam.y + 0] > 0) { res += (beam.dir == 1 || beam.dir == 3) ? 1 : 4; } return(res); }
/// <summary> /// Прямой проход по всему лучу /// </summary> /// <returns>Список с ячейко-лучами</returns> internal static List <StructBeam> GetBeam(int x, int y, int _dir) { List <StructBeam> beams = new List <StructBeam>(); bool bWork = true; int cnt = 0; int dir = _dir; x += GetStep(dir).X; y += GetStep(dir).Y; //тут уже стена if (field[x, y] > 0) { return(beams); } while (bWork) { dir = NoramlDir(dir); StructBeam beam = new StructBeam(x, y, dir); int dx = GetStep(beam.dir).X; int dy = GetStep(beam.dir).Y; beams.Add(beam); switch (GetWallsConfig(beam)) { case 0: case 1: case 4: x += dx; y += dy; break; case 3: if (dir == 1 || dir == 3) { y += dy; } else { x += dx; } dir++; //поворот вправо break; case 6: if (dir == 1 || dir == 3) { x += dx; } else { y += dy; } dir--; //поворот влево break; default: //варианты 2, 5, 7 bWork = false; //дальше нет хода break; } cnt++; if (x <= 0 || y <= 0 || x > fieldWidth || y > fieldHeight || cnt > (fieldHeight * fieldWidth)) { bWork = false; } } return(beams); }