Roguelike. Движение персонажа, проверить реализацию кода - C#
Формулировка задачи:
Здравствуйте. Решил продолжить свое изучение C# на практике. Хочется написать небольшой рогалик. В общем - сейчас реализовал только до жути примитивный рендер карты из массива, и движение/столкновение персонажа("@").
Но вот чувствую что я пишу всё через задницу, и ничего "правильного" в моем коде нет.
Конкретные неувязки:
- Перемещение персонажа по карте. Всё осуществляется с помощью замены в массиве персонажа("@") с тем пустым местом(".") что находится по соседству в определенном направлении, и последующей очисткой экрана и рендерингом этого массива. Чувствую что можно поумнее это дело организовать.
- Проверка на столкновения. Перед движением персонажа в определенную сторону, проверяется - нет ли там стены("#"), если есть, то не двигаться, а просто перерисовать экран. Всё бы хорошо, но в будущем мне нужно будет "сталкиваться" не только со стенами, а так же с предметами которые можно будет поднять, с водой к примеру, и еще кучей всего. И несколько десятков if'ов в блоке кода каждого движения как-то бы вообще не хотелось. Как обрабатывать столкновения красиво?
- По скольку обрабатываю нажатия клавиш с помощью ReadKey(), всё что ввожу с клавиатуры - выводится на экран. Нельзя ли просто обрабатывать нажатия клавиш без вывода иных на экран?
Листинг программы
- // Управление - 8,6,2,4 на нумпаде.
- using System;
- namespace Roguelike
- {
- class Program
- {
- public static void mapRender(char[,] map) //Очищает и рендерит карту;
- {
- Console.Clear();
- for (int i = 0; i < 5; i++)
- {
- for (int j = 0; j < 7; j++)
- {
- Console.Write(map[i, j]);
- }
- Console.WriteLine();
- }
- }
- static void Main(string[] args)
- {
- int heroX = 3; //Задаем координаты персонажа
- int heroY = 2;
- char[,] map =
- {
- {'#','#','#','#','#','#','#'},
- {'#','.','.','.','.','.','#'},
- {'#','.','.','.','.','.','#'},
- {'#','.','.','.','.','.','#'},
- {'#','#','#','#','#','#','#'}
- };
- map[heroY, heroX] = '@'; //Ставим персонажа на карту
- mapRender(map); //Рендерим
- ConsoleKeyInfo keypress;
- do
- {
- keypress = Console.ReadKey();
- if (keypress.KeyChar == '8') //Движение вверх
- {
- if (map[heroY - 1, heroX] != '#') //Провяем нет ли стены там, куда мы будем двигаться
- {
- map[heroY, heroX] = '.';
- map[heroY - 1, heroX] = '@';
- heroY--;
- mapRender(map);
- }
- else mapRender(map);
- }
- if (keypress.KeyChar == '6') //Движение вправо
- {
- if (map[heroY, heroX + 1] != '#')
- {
- map[heroY, heroX] = '.';
- map[heroY, heroX + 1] = '@';
- heroX++;
- mapRender(map);
- }
- else mapRender(map);
- }
- if (keypress.KeyChar == '2') //Движение вниз
- {
- if (map[heroY + 1, heroX] != '#')
- {
- map[heroY, heroX] = '.';
- map[heroY + 1, heroX] = '@';
- heroY++;
- mapRender(map);
- }
- else mapRender(map);
- }
- if (keypress.KeyChar == '4') //Движение влево
- {
- if (map[heroY, heroX - 1] != '#')
- {
- map[heroY, heroX] = '.';
- map[heroY, heroX - 1] = '@';
- heroX--;
- mapRender(map);
- }
- else mapRender(map);
- }
- } while (keypress.KeyChar != 'Q');
- }
- }
- }
Решение задачи: «Roguelike. Движение персонажа, проверить реализацию кода»
textual
Листинг программы
- // Управление - 8,6,2,4 на нумпаде.
- using System;
- namespace Roguelike
- {
- class Program
- {
- static int OffsetX = 20;
- static int OffsetY = 3;
- public static void firstDraw(char[,] map) //Очищает и рендерит карту;
- {
- Console.Clear();
- for (int y = 0; y < 5; y++)
- for (int x = 0; x < 7; x++)
- putCh(map[y, x], y, x);
- }
- private static void putCh(char ch, int y, int x)
- {
- Console.SetCursorPosition(OffsetX + x, OffsetY + y);
- Console.Write(ch);
- }
- static char[,] map =
- {
- {'#','#','#','#','#','#','#'},
- {'#','.','.','.','.','.','#'},
- {'#','.','.','.','.','.','#'},
- {'#','.','.','.','.','.','#'},
- {'#','#','#','#','#','#','#'}
- };
- static int heroX = 3; //Задаем координаты персонажа
- static int heroY = 2;
- static void Main(string[] args)
- {
- map[heroY, heroX] = '@'; //Ставим персонажа на карту
- firstDraw(map); //Рендерим
- ConsoleKeyInfo keypress;
- do
- {
- keypress = Console.ReadKey(true);
- switch (keypress.KeyChar)
- {
- case 'w': move(0, -1); break;
- case 's': move(0, 1); break;
- case 'd': move(1, 0); break;
- case 'a': move(-1, 0); break;
- default:
- break;
- }
- } while (keypress.KeyChar != 'q');
- }
- private static void move(int dx, int dy)
- {
- if (map[heroY + dy, heroX + dx] == '#') return; //Провяем нет ли стены там, куда мы будем двигаться
- map[heroY, heroX] = '.';
- putCh('.', heroY, heroX);
- heroY += dy; heroX += dx;
- map[heroY, heroX] = '@';
- putCh('@', heroY, heroX);
- }
- }
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д