Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
Public main
15 / 15 / 0
Регистрация: 06.11.2011
Сообщений: 53
1

Нужен исходник пограммы, создающей случайный лабиринт

18.02.2012, 22:43. Просмотров 2026. Ответов 4
Метки нет (Все метки)

Очень нужен исходник пограммы, создающей случайный лабиринт.
Даны размеры матрицы: SxD (если можно чтоб был еще коэффициент сложности)
Собственно лабиринт - булевский массив. false - это стена, true - свободное пространство. Только свободное пространство должно быть шириной 2, тоесть 2 ячейки true, ширина стены 1 ячейка false. Начало лабиринта клетка 0,0, конец S,D
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.02.2012, 22:43
Ответы с готовыми решениями:

Нужен исходник для расчёта комплектации материалов или т.п. Исходник с расчётами, таблицами
Добрый день всем) Нужна помощь. Занимаюсь расчётами стоимость материалов и стоимость в оконной...

Нужен код пограммы на Visual C++.по нахождению координат точек в пространстве
помогите пожалуйста .мне нужен код пограммы на Visual C++.по нахождению координат точек в...

Нужен исходник
Нужен исходник в Делфи 7, для подбора 5 значного кода в закрытую область (от 0 до 99999) в...

Матрица,нужен исходник
Путем перестановки элементов квадратной действительной матрицы достичь того, чтобы ее максимальный...

Нужен исходник сайта
Нужен исходник сайта http://csgo2x.com/ или аналогичных

4
sau
2087 / 1667 / 285
Регистрация: 22.07.2011
Сообщений: 6,386
Завершенные тесты: 1
19.02.2012, 18:46 2
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
namespace Labirint
{
 
    public partial class MainWindow : Window
    {
        private void RenderMap()
        {
            var Maze = new Maze(30, 2);
            bool[,] maze = Maze.ToMatrix();
            int Size = maze.GetLength(0);
            for (int X = 0; X < Size; X++)
            {
                MapView.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(10) });
                for (int Y = 0; Y < Size; Y++)
                {
                    MapView.RowDefinitions.Add(new RowDefinition { Height = new GridLength(10) });
                    Rectangle r = new Rectangle();
                    MapView.Children.Add(r);
                    r.SetValue(Grid.ColumnProperty, X);
                    r.SetValue(Grid.RowProperty, Y);
                    r.Fill = maze[X, Y] ? new SolidColorBrush(Color.FromRgb(0, 0, 0)) : new SolidColorBrush(Color.FromRgb(200, 200, 200));
                }
            }
        }
 
 
        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            RenderMap();
        }
 
    }
 
    public static class Randomizer
    {
        public static Random rnd = new Random();
    }
 
    public class Maze
    {
        private int RoomCountXY;
        private Room[,] roomData;
 
        public Maze(int RoomCountXY, int RoomSize)
        {
            Room.FloorSize = RoomSize;
            Room.WallSize = 1;
            this.RoomCountXY = RoomCountXY;
        }
 
        public bool[,] ToMatrix()
        {
            int RoomStep = Room.Size - Room.WallSize;//Шаг расстановки комнат, дабы не дублироваь стенки
            int Size = RoomCountXY * RoomStep + Room.WallSize;
            bool[,] mazeMatrix = new bool[Size, Size];
 
            if (roomData == null) Randomize();
 
            for (int roomX = 0; roomX < RoomCountXY; roomX++)
                for (int roomY = 0; roomY < RoomCountXY; roomY++)
                {
                    //Добавляем матрицу комнаты к матрице лабиринта
                    var roomMatrix = roomData[roomX, roomY].ToMatrix();
                    for (int rmX = 0; rmX < Room.Size; rmX++)
                        for (int rmY = 0; rmY < Room.Size; rmY++)
                        {
                            int mmX = roomX * RoomStep + rmX;
                            int mmY = roomY * RoomStep + rmY;
                            if (mazeMatrix[mmX, mmY] == false)
                                mazeMatrix[mmX, mmY] = roomMatrix[rmX, rmY]; //Дабы не перекрывать двери предыдущих комнат
                        }
                }
 
            return mazeMatrix;
        }
 
        public void Randomize()
        {
            roomData = new Room[RoomCountXY, RoomCountXY];
 
            for (int mazeX = 0; mazeX < RoomCountXY; mazeX++)
                for (int mazeY = 0; mazeY < RoomCountXY; mazeY++)
                {
                    roomData[mazeX, mazeY] = new Room();
                    roomData[mazeX, mazeY].RandomDoors(Randomizer.rnd.Next(1, 2));
                    //Убираем двери на границе лабиринта
                    if (mazeX == 0) roomData[mazeX, mazeY].DoorList.Remove(Room.EDoorType.LEFT);
                    if (mazeX == RoomCountXY - 1) roomData[mazeX, mazeY].DoorList.Remove(Room.EDoorType.RIGHT);
                    if (mazeY == 0) roomData[mazeX, mazeY].DoorList.Remove(Room.EDoorType.UP);
                    if (mazeY == RoomCountXY - 1) roomData[mazeX, mazeY].DoorList.Remove(Room.EDoorType.DOWN);
                }
 
            //Пробиваем стенки до заданной позиции по заданной стратегии
            RandomPath(RoomCountXY - 1, RoomCountXY - 1);
        }
 
        //Зигзаго образный путь
        public void ZigZagPath(int FinishX, int FinishY)
        {
            for (int mazeX = 0; mazeX < RoomCountXY; mazeX++)
                for (int mazeY = 0; mazeY < RoomCountXY; mazeY++)
                {
                }
        }
 
        //Рандомный путь
        public void RandomPath(int FinishX, int FinishY)
        {
            int PosX = 0;// Текущий узел
            int PosY = 0;
 
            while (PosX != FinishX || PosY != FinishY)
            {
                Room.EDoorType DoorType = Room.EDoorType.DOWN;//Направление движения
 
                int Line = Randomizer.rnd.Next(1, 3);//Дилна пути до поворота
 
                if (PosX < FinishX && PosY < FinishX)
                {
                    DoorType = new Room.EDoorType[2] { Room.EDoorType.DOWN, Room.EDoorType.RIGHT }[Randomizer.rnd.Next(2)];
                    if (DoorType == Room.EDoorType.RIGHT && Line > FinishX - PosX) Line = FinishX - PosX;
                    if (DoorType == Room.EDoorType.DOWN && Line > FinishY - PosY) Line = FinishY - PosY;
                }
 
                if (PosX < FinishX && PosY == FinishY)
                {
                    DoorType = Room.EDoorType.RIGHT;
                    if (Line > FinishX - PosX) Line = FinishX - PosX;
                }
 
                if (PosX == FinishX && PosY < FinishY)
                {
                    DoorType = Room.EDoorType.DOWN;
                    if (Line > FinishY - PosY) Line = FinishY - PosY;
                }
 
                int DX = 0;
                int DY = 0;
 
                switch (DoorType)
                {
                    case Room.EDoorType.UP: DX = 0; DY = -1; break;
                    case Room.EDoorType.LEFT: DX = -1; DY = 0; break;
                    case Room.EDoorType.DOWN: DX = 0; DY = 1; break;
                    case Room.EDoorType.RIGHT: DX = 1; DY = 0; break;
                }
 
                for (int I = 0; I < Line; I++)
                {
                    if (roomData[PosX, PosY].DoorList.IndexOf(DoorType) < 0)
                        roomData[PosX, PosY].DoorList.Add(DoorType);
                    PosX += DX;
                    PosY += DY;
                }
            }
        }
    }
 
    public class Room
    {
        public enum EDoorType
        {
            UP, LEFT, DOWN, RIGHT
        }
 
        public static int FloorSize;
        public static int WallSize;
        public bool Key;
        public List<EDoorType> DoorList = new List<EDoorType>();
 
        //Общий размер комнаты с учетом толщины стены.
        public static int Size
        {
            get { return FloorSize + WallSize * 2; }
        }
 
 
        public bool[,] ToMatrix()
        {
            bool[,] Result = new bool[Size, Size];
            for (int X = 0; X < Size; X++)
                for (int Y = 0; Y < Size; Y++)
                {
                    //Если XY в зоне пола то TRUE иначе FALSE
                    Result[X, Y] = X >= WallSize && X < Size - WallSize && Y >= WallSize && Y < Size - WallSize;
                    //Если XY в зоне стены но есть дверь то TRUE
                    if (X < WallSize && Y >= WallSize && Y < Size - WallSize && DoorList.IndexOf(EDoorType.LEFT) >= 0) Result[X, Y] = true;
                    if (X >= (Size - WallSize) && Y >= WallSize && Y < Size - WallSize && DoorList.IndexOf(EDoorType.RIGHT) >= 0) Result[X, Y] = true;
                    if (Y < WallSize && X >= WallSize && X < Size - WallSize && DoorList.IndexOf(EDoorType.UP) >= 0) Result[X, Y] = true;
                    if (Y >= (Size - WallSize) && X >= WallSize && X < Size - WallSize && DoorList.IndexOf(EDoorType.DOWN) >= 0) Result[X, Y] = true;
                }
 
            return Result;
        }
 
        public EDoorType AddRandomDoor(List<EDoorType> DoorTypeList)
        {
            var doorType = DoorTypeList[Randomizer.rnd.Next(0, DoorTypeList.Count)];
            //Удаляем уже установленную дверь из списка доступных дверей.
            DoorTypeList.Remove(doorType);
            DoorList.Add(doorType);
            return doorType;
        }
 
        //Кол-во дверей из комнаты определяет сложность лабиринта
        public void RandomDoors(int DoorCount)
        {
            DoorList = new List<EDoorType>();
            var DoorTypeList = new List<EDoorType> { EDoorType.LEFT, EDoorType.UP, EDoorType.RIGHT, EDoorType.DOWN };
            for (int I = 0; I < DoorCount; I++) AddRandomDoor(DoorTypeList);
        }
    }
}
0
KarmaMaker
91 / 90 / 11
Регистрация: 09.12.2011
Сообщений: 233
19.02.2012, 18:53 3
Я бы таки заменил Labirint на Labyrinth ибо исходники с орфографическими ашипками, - это как-то некошерно.
1
sau
2087 / 1667 / 285
Регистрация: 22.07.2011
Сообщений: 6,386
Завершенные тесты: 1
19.02.2012, 19:00 4
Вобще генерировать можно и по другому, например комнаты изначально без дверей, а потом стратегиями в рандомные точки прокладывать пути.
это как-то некошерно.
- та пофиг, я знаю энглишь, просто так захотелось., да и сам алгоритм так себе - просто как вариант.
0
DimanRu
19.02.2012, 19:00     Нужен исходник пограммы, создающей случайный лабиринт
  #5

Не по теме:

Цитата Сообщение от KarmaMaker Посмотреть сообщение
ашипками
Угу, с "ашипками":)

0
19.02.2012, 19:00
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.02.2012, 19:00
Привет! Вот еще темы с ответами:

Нужен исходник приложени
Нужен исходник приложения переводящее сантиметры в метры.Чтоб было звуковое сопровождение перед...

Нужен исходник приложения
Разработать приложение, демонстрирующее подсчет и вывод суммы и произведения чисел, которые...

Нужен исходник сервера
Доброго времени суток . Вот решил написать небольшой сервер на net никогда с этим не работал может...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru