示例#1
0
        /// <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);
        }
示例#2
0
        /// <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);
        }