Я пытаюсь сделать генератор лабиринта в C#. Ни одна из ячеек никогда не устанавливается на закрытый_top, закрытый_bottom, recke_left, recall_right или открыта, даже когда они походят по этому новому пути. /> Найдите случайную соседнюю ячейку, которая еще не была посещена. /> Проблема возникает, когда я вернулся в предыдущую ячейку (ячейку A) и продолжил новую соседнюю ячейку (ячейка B), которая еще не была посещена. Я знаю, что мой код посещает новую ячейку (ячейку B) и продолжает по этому пути, но он никогда не отмечает предыдущую ячейку (ячейку A) как имея три открытых сторона. < /P>
Я не знаю, что не так в моей логике. Я знаю, что вся сетка заполняется. Что я делаю не так? < /P>
using System;
using System.Collections.Generic;
using System.Text;
namespace MazeGenerator
{
class MapGenerator
{
private Random random = new Random();
public const int CLOSED = -1;
public const int OPEN_TOP = 0;
public const int OPEN_LEFT = 1;
public const int OPEN_RIGHT = 2;
public const int OPEN_BOTTOM = 3;
public const int OPEN_TOP_LEFT = 4;
public const int OPEN_TOP_RIGHT = 5;
public const int OPEN_TOP_BOTTOM = 6;
public const int OPEN_LEFT_RIGHT = 7;
public const int OPEN_LEFT_BOTTOM = 8;
public const int OPEN_RIGHT_BOTTOM = 9;
public const int CLOSED_TOP = 10;
public const int CLOSED_LEFT = 11;
public const int CLOSED_RIGHT = 12;
public const int CLOSED_BOTTOM = 13;
public const int OPEN = 14;
public int[] StartingPoint { get; }
public int[] EndingPoint { get; }
public int NumCols { get; set; }
public int NumRows { get; set; }
public int[,] MapGrid { get; }
public MapGenerator(int numRows, int numCols)
{
NumCols = numCols;
NumRows = numRows;
MapGrid = new int[numRows, numCols];
for (int i = 0; i < numRows; i++)
{
for (int j = 0; j < numCols; j++)
{
MapGrid[i,j] = CLOSED;
}
}
StartingPoint = new int[] { 0, 0 };
EndingPoint = new int[] { numRows - 1, numCols - 1 };
GoDownPath(0, 0);
}
private void GoDownPath(int row, int col)
{
int cellState = MapGrid[row, col];
while (NumberUnvisitedNeighbors(row, col) > 0)
{
// go down this path
int nextCellWall = random.Next(0, 4);
if (nextCellWall == 0)
{
// go up
if (row > 0 && MapGrid[row - 1, col] == CLOSED)
{
switch (cellState)
{
case CLOSED:
MapGrid[row, col] = OPEN_TOP;
break;
case OPEN_LEFT:
MapGrid[row, col] = OPEN_TOP_LEFT;
break;
case OPEN_RIGHT:
MapGrid[row, col] = OPEN_TOP_RIGHT;
break;
case OPEN_BOTTOM:
MapGrid[row, col] = OPEN_TOP_BOTTOM;
break;
case OPEN_LEFT_RIGHT:
MapGrid[row, col] = CLOSED_BOTTOM;
break;
case OPEN_LEFT_BOTTOM:
MapGrid[row, col] = CLOSED_RIGHT;
break;
case OPEN_RIGHT_BOTTOM:
MapGrid[row, col] = CLOSED_LEFT;
break;
case CLOSED_TOP:
MapGrid[row, col] = OPEN;
break;
default:
MapGrid[row, col] = OPEN;
break;
}
MapGrid[row - 1, col] = OPEN_BOTTOM;
GoDownPath(row - 1, col);
}
} else if (nextCellWall == 1)
{
// go down
if (row < NumRows - 1 && MapGrid[row + 1, col] == CLOSED)
{
switch (cellState)
{
case CLOSED:
MapGrid[row, col] = OPEN_BOTTOM;
break;
case OPEN_TOP:
MapGrid[row, col] = OPEN_TOP_BOTTOM;
break;
case OPEN_LEFT:
MapGrid[row, col] = OPEN_LEFT_BOTTOM;
break;
case OPEN_RIGHT:
MapGrid[row, col] = OPEN_RIGHT_BOTTOM;
break;
case OPEN_TOP_LEFT:
MapGrid[row, col] = CLOSED_RIGHT;
break;
case OPEN_TOP_RIGHT:
MapGrid[row, col] = CLOSED_LEFT;
break;
case OPEN_LEFT_RIGHT:
MapGrid[row, col] = CLOSED_TOP;
break;
case CLOSED_BOTTOM:
MapGrid[row, col] = OPEN;
break;
default:
MapGrid[row, col] = OPEN;
break;
}
MapGrid[row + 1, col] = OPEN_TOP;
GoDownPath(row + 1, col);
}
} else if (nextCellWall == 2)
{
// go left
if (col > 0 && MapGrid[row, col - 1] == CLOSED)
{
switch (cellState)
{
case CLOSED:
MapGrid[row, col] = OPEN_LEFT;
break;
case OPEN_TOP:
MapGrid[row, col] = OPEN_TOP_LEFT;
break;
case OPEN_RIGHT:
MapGrid[row, col] = OPEN_LEFT_RIGHT;
break;
case OPEN_BOTTOM:
MapGrid[row, col] = OPEN_LEFT_BOTTOM;
break;
case OPEN_TOP_RIGHT:
MapGrid[row, col] = CLOSED_BOTTOM;
break;
case OPEN_TOP_BOTTOM:
MapGrid[row, col] = CLOSED_RIGHT;
break;
case OPEN_RIGHT_BOTTOM:
MapGrid[row, col] = CLOSED_TOP;
break;
case CLOSED_LEFT:
MapGrid[row, col] = OPEN;
break;
default:
MapGrid[row, col] = OPEN;
break;
}
MapGrid[row, col - 1] = OPEN_RIGHT;
GoDownPath(row, col - 1);
}
} else if (nextCellWall == 3)
{
// go right
if (col < NumCols - 1 && MapGrid[row, col + 1] == CLOSED)
{
switch (cellState)
{
case CLOSED:
MapGrid[row, col] = OPEN_RIGHT;
break;
case OPEN_TOP:
MapGrid[row, col] = OPEN_TOP_RIGHT;
break;
case OPEN_LEFT:
MapGrid[row, col] = OPEN_LEFT_RIGHT;
break;
case OPEN_BOTTOM:
MapGrid[row, col] = OPEN_RIGHT_BOTTOM;
break;
case OPEN_TOP_LEFT:
MapGrid[row, col] = CLOSED_BOTTOM;
break;
case OPEN_TOP_BOTTOM:
MapGrid[row, col] = CLOSED_LEFT;
break;
case OPEN_LEFT_BOTTOM:
MapGrid[row, col] = CLOSED_TOP;
break;
case CLOSED_RIGHT:
MapGrid[row, col] = OPEN;
break;
default:
MapGrid[row, col] = OPEN;
break;
}
MapGrid[row, col + 1] = OPEN_LEFT;
GoDownPath(row, col + 1);
}
}
}
}
private int NumberUnvisitedNeighbors(int row, int col)
{
int numUnvisited = 0;
if (row > 0 && MapGrid[row - 1, col] == CLOSED) numUnvisited++;
if (row < NumRows - 1 && MapGrid[row + 1, col] == CLOSED) numUnvisited++;
if (col > 0 && MapGrid[row, col - 1] == CLOSED) numUnvisited++;
if (col < NumCols - 1 && MapGrid[row, col + 1] == CLOSED) numUnvisited++;
return numUnvisited;
}
}
}
Подробнее здесь: https://stackoverflow.com/questions/638 ... open-sides
Мой генератор лабиринта, кажется, не может обрабатывать блоки с тремя открытыми сторонами ⇐ C#
Место общения программистов C#
1758408565
Anonymous
Я пытаюсь сделать генератор лабиринта в C#. Ни одна из ячеек никогда не устанавливается на закрытый_top, закрытый_bottom, recke_left, recall_right или открыта, даже когда они походят по этому новому пути. /> Найдите случайную соседнюю ячейку, которая еще не была посещена. /> Проблема возникает, когда я вернулся в предыдущую ячейку (ячейку A) и продолжил новую соседнюю ячейку (ячейка B), которая еще не была посещена. Я знаю, что мой код посещает новую ячейку (ячейку B) и продолжает по этому пути, но он никогда не отмечает предыдущую ячейку (ячейку A) как имея три открытых сторона. < /P>
Я не знаю, что не так в моей логике. Я знаю, что вся сетка заполняется. Что я делаю не так? < /P>
using System;
using System.Collections.Generic;
using System.Text;
namespace MazeGenerator
{
class MapGenerator
{
private Random random = new Random();
public const int CLOSED = -1;
public const int OPEN_TOP = 0;
public const int OPEN_LEFT = 1;
public const int OPEN_RIGHT = 2;
public const int OPEN_BOTTOM = 3;
public const int OPEN_TOP_LEFT = 4;
public const int OPEN_TOP_RIGHT = 5;
public const int OPEN_TOP_BOTTOM = 6;
public const int OPEN_LEFT_RIGHT = 7;
public const int OPEN_LEFT_BOTTOM = 8;
public const int OPEN_RIGHT_BOTTOM = 9;
public const int CLOSED_TOP = 10;
public const int CLOSED_LEFT = 11;
public const int CLOSED_RIGHT = 12;
public const int CLOSED_BOTTOM = 13;
public const int OPEN = 14;
public int[] StartingPoint { get; }
public int[] EndingPoint { get; }
public int NumCols { get; set; }
public int NumRows { get; set; }
public int[,] MapGrid { get; }
public MapGenerator(int numRows, int numCols)
{
NumCols = numCols;
NumRows = numRows;
MapGrid = new int[numRows, numCols];
for (int i = 0; i < numRows; i++)
{
for (int j = 0; j < numCols; j++)
{
MapGrid[i,j] = CLOSED;
}
}
StartingPoint = new int[] { 0, 0 };
EndingPoint = new int[] { numRows - 1, numCols - 1 };
GoDownPath(0, 0);
}
private void GoDownPath(int row, int col)
{
int cellState = MapGrid[row, col];
while (NumberUnvisitedNeighbors(row, col) > 0)
{
// go down this path
int nextCellWall = random.Next(0, 4);
if (nextCellWall == 0)
{
// go up
if (row > 0 && MapGrid[row - 1, col] == CLOSED)
{
switch (cellState)
{
case CLOSED:
MapGrid[row, col] = OPEN_TOP;
break;
case OPEN_LEFT:
MapGrid[row, col] = OPEN_TOP_LEFT;
break;
case OPEN_RIGHT:
MapGrid[row, col] = OPEN_TOP_RIGHT;
break;
case OPEN_BOTTOM:
MapGrid[row, col] = OPEN_TOP_BOTTOM;
break;
case OPEN_LEFT_RIGHT:
MapGrid[row, col] = CLOSED_BOTTOM;
break;
case OPEN_LEFT_BOTTOM:
MapGrid[row, col] = CLOSED_RIGHT;
break;
case OPEN_RIGHT_BOTTOM:
MapGrid[row, col] = CLOSED_LEFT;
break;
case CLOSED_TOP:
MapGrid[row, col] = OPEN;
break;
default:
MapGrid[row, col] = OPEN;
break;
}
MapGrid[row - 1, col] = OPEN_BOTTOM;
GoDownPath(row - 1, col);
}
} else if (nextCellWall == 1)
{
// go down
if (row < NumRows - 1 && MapGrid[row + 1, col] == CLOSED)
{
switch (cellState)
{
case CLOSED:
MapGrid[row, col] = OPEN_BOTTOM;
break;
case OPEN_TOP:
MapGrid[row, col] = OPEN_TOP_BOTTOM;
break;
case OPEN_LEFT:
MapGrid[row, col] = OPEN_LEFT_BOTTOM;
break;
case OPEN_RIGHT:
MapGrid[row, col] = OPEN_RIGHT_BOTTOM;
break;
case OPEN_TOP_LEFT:
MapGrid[row, col] = CLOSED_RIGHT;
break;
case OPEN_TOP_RIGHT:
MapGrid[row, col] = CLOSED_LEFT;
break;
case OPEN_LEFT_RIGHT:
MapGrid[row, col] = CLOSED_TOP;
break;
case CLOSED_BOTTOM:
MapGrid[row, col] = OPEN;
break;
default:
MapGrid[row, col] = OPEN;
break;
}
MapGrid[row + 1, col] = OPEN_TOP;
GoDownPath(row + 1, col);
}
} else if (nextCellWall == 2)
{
// go left
if (col > 0 && MapGrid[row, col - 1] == CLOSED)
{
switch (cellState)
{
case CLOSED:
MapGrid[row, col] = OPEN_LEFT;
break;
case OPEN_TOP:
MapGrid[row, col] = OPEN_TOP_LEFT;
break;
case OPEN_RIGHT:
MapGrid[row, col] = OPEN_LEFT_RIGHT;
break;
case OPEN_BOTTOM:
MapGrid[row, col] = OPEN_LEFT_BOTTOM;
break;
case OPEN_TOP_RIGHT:
MapGrid[row, col] = CLOSED_BOTTOM;
break;
case OPEN_TOP_BOTTOM:
MapGrid[row, col] = CLOSED_RIGHT;
break;
case OPEN_RIGHT_BOTTOM:
MapGrid[row, col] = CLOSED_TOP;
break;
case CLOSED_LEFT:
MapGrid[row, col] = OPEN;
break;
default:
MapGrid[row, col] = OPEN;
break;
}
MapGrid[row, col - 1] = OPEN_RIGHT;
GoDownPath(row, col - 1);
}
} else if (nextCellWall == 3)
{
// go right
if (col < NumCols - 1 && MapGrid[row, col + 1] == CLOSED)
{
switch (cellState)
{
case CLOSED:
MapGrid[row, col] = OPEN_RIGHT;
break;
case OPEN_TOP:
MapGrid[row, col] = OPEN_TOP_RIGHT;
break;
case OPEN_LEFT:
MapGrid[row, col] = OPEN_LEFT_RIGHT;
break;
case OPEN_BOTTOM:
MapGrid[row, col] = OPEN_RIGHT_BOTTOM;
break;
case OPEN_TOP_LEFT:
MapGrid[row, col] = CLOSED_BOTTOM;
break;
case OPEN_TOP_BOTTOM:
MapGrid[row, col] = CLOSED_LEFT;
break;
case OPEN_LEFT_BOTTOM:
MapGrid[row, col] = CLOSED_TOP;
break;
case CLOSED_RIGHT:
MapGrid[row, col] = OPEN;
break;
default:
MapGrid[row, col] = OPEN;
break;
}
MapGrid[row, col + 1] = OPEN_LEFT;
GoDownPath(row, col + 1);
}
}
}
}
private int NumberUnvisitedNeighbors(int row, int col)
{
int numUnvisited = 0;
if (row > 0 && MapGrid[row - 1, col] == CLOSED) numUnvisited++;
if (row < NumRows - 1 && MapGrid[row + 1, col] == CLOSED) numUnvisited++;
if (col > 0 && MapGrid[row, col - 1] == CLOSED) numUnvisited++;
if (col < NumCols - 1 && MapGrid[row, col + 1] == CLOSED) numUnvisited++;
return numUnvisited;
}
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/63843316/my-maze-generator-cant-seem-to-handle-blocks-with-three-open-sides[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия