Как сделать перемещение лабиринта за пределы области консоли - C#
Формулировка задачи:
К примеру символ был в центре консоли и при нажатии стрелочек что бы лабиринт сдвигался вверх, вниз, влево или вправо. Чтоб лабиринт был больше области консоли. Как это реализовать? Помогите пожалуйста! Заранее спасибо!
Решение задачи: «Как сделать перемещение лабиринта за пределы области консоли»
textual
Листинг программы
namespace ConsoleApplication6
{
class Program
{
const int BOARD_X = 10, BOARD_Y = 5;
const int x_size = 20, y_size = 20, x_view = 10, y_view = 10;
static void Main(string[] args)
{
var rdn = new Random(2);
var xs = new char[y_size, x_size];
for (int yi = 0; yi < y_size; yi++)
for (int xi = 0; xi < x_size; xi++)
xs[yi, xi] = ((yi == 0) || (yi == y_size - 1) || (xi == 0) || (xi == x_size - 1)
|| rdn.NextDouble() < 0.05) ? '#' : ' ';
Console.SetCursorPosition(9, BOARD_Y - 1);
Console.Write("+----------+");
for (int yi = 0; yi < y_view; yi++)
{
Console.SetCursorPosition(9, BOARD_Y + yi);
Console.Write("|");
for (int xi = 0; xi < x_view; xi++) Console.Write(xs[yi, xi]);
Console.Write("|");
}
Console.SetCursorPosition(9, BOARD_Y + y_view);
Console.Write("+----------+");
int x = 0, y = 0;
bool cont = true;
while (cont)
switch (Console.ReadKey(true).KeyChar)
{
case 'a': if (x > 0) outcol(x_view, y_view, xs, --x, y, 0, 1); break;
case 'd': if (x < x_size - x_view) outcol(x_view, y_view, xs, ++x, y, x_view - 1, 0); break;
case 'w': if (y > 0) outrow(x_view, y_view, xs, x, --y, 0, 1); break;
case 's': if (y < y_size - y_view) outrow(x_view, y_view, xs, x, ++y, y_view - 1, 0); break;
case 'q': cont = false; break;
default: break;
};
}
private static void outcol(int x_view, int y_view, char[,] xs, int x, int y, int dx, int shift)
{
Console.MoveBufferArea(1 - shift + BOARD_X, 0 + BOARD_Y, x_view - 1, y_view, shift + BOARD_X, 0 + BOARD_Y);
for (int yi = 0; yi < y_view; yi++)
{
Console.SetCursorPosition(BOARD_X + dx, BOARD_Y + yi);
Console.Write(xs[x + dx, yi + y]);
}
}
private static void outrow(int x_view, int y_view, char[,] xs, int x, int y, int dy, int shift)
{
Console.MoveBufferArea(0 + BOARD_X, 1 - shift + BOARD_Y, x_view, y_view - 1, 0 + BOARD_X, shift + BOARD_Y);
for (int xi = 0; xi < x_view; xi++)
{
Console.SetCursorPosition(BOARD_X + xi, BOARD_Y + dy);
Console.Write(xs[x + xi, dy + y]);
}
}
}
}