Roguelike. Движение персонажа, проверить реализацию кода - C#

Узнай цену своей работы

Формулировка задачи:

Здравствуйте. Решил продолжить свое изучение C# на практике. Хочется написать небольшой рогалик. В общем - сейчас реализовал только до жути примитивный рендер карты из массива, и движение/столкновение персонажа("@"). Но вот чувствую что я пишу всё через задницу, и ничего "правильного" в моем коде нет. Конкретные неувязки:
  1. Перемещение персонажа по карте. Всё осуществляется с помощью замены в массиве персонажа("@") с тем пустым местом(".") что находится по соседству в определенном направлении, и последующей очисткой экрана и рендерингом этого массива. Чувствую что можно поумнее это дело организовать.
  2. Проверка на столкновения. Перед движением персонажа в определенную сторону, проверяется - нет ли там стены("#"), если есть, то не двигаться, а просто перерисовать экран. Всё бы хорошо, но в будущем мне нужно будет "сталкиваться" не только со стенами, а так же с предметами которые можно будет поднять, с водой к примеру, и еще кучей всего. И несколько десятков if'ов в блоке кода каждого движения как-то бы вообще не хотелось. Как обрабатывать столкновения красиво?
  3. По скольку обрабатываю нажатия клавиш с помощью ReadKey(), всё что ввожу с клавиатуры - выводится на экран. Нельзя ли просто обрабатывать нажатия клавиш без вывода иных на экран?
Ну и в общем хотелось бы посмотреть на то, как нужно делать правильно. Спасибо.
Листинг программы
  1. // Управление - 8,6,2,4 на нумпаде.
  2. using System;
  3. namespace Roguelike
  4. {
  5. class Program
  6. {
  7. public static void mapRender(char[,] map) //Очищает и рендерит карту;
  8. {
  9. Console.Clear();
  10. for (int i = 0; i < 5; i++)
  11. {
  12. for (int j = 0; j < 7; j++)
  13. {
  14. Console.Write(map[i, j]);
  15. }
  16. Console.WriteLine();
  17. }
  18. }
  19. static void Main(string[] args)
  20. {
  21. int heroX = 3; //Задаем координаты персонажа
  22. int heroY = 2;
  23. char[,] map =
  24. {
  25. {'#','#','#','#','#','#','#'},
  26. {'#','.','.','.','.','.','#'},
  27. {'#','.','.','.','.','.','#'},
  28. {'#','.','.','.','.','.','#'},
  29. {'#','#','#','#','#','#','#'}
  30. };
  31. map[heroY, heroX] = '@'; //Ставим персонажа на карту
  32. mapRender(map); //Рендерим
  33. ConsoleKeyInfo keypress;
  34. do
  35. {
  36. keypress = Console.ReadKey();
  37. if (keypress.KeyChar == '8') //Движение вверх
  38. {
  39. if (map[heroY - 1, heroX] != '#') //Провяем нет ли стены там, куда мы будем двигаться
  40. {
  41. map[heroY, heroX] = '.';
  42. map[heroY - 1, heroX] = '@';
  43. heroY--;
  44. mapRender(map);
  45. }
  46. else mapRender(map);
  47. }
  48. if (keypress.KeyChar == '6') //Движение вправо
  49. {
  50. if (map[heroY, heroX + 1] != '#')
  51. {
  52. map[heroY, heroX] = '.';
  53. map[heroY, heroX + 1] = '@';
  54. heroX++;
  55. mapRender(map);
  56. }
  57. else mapRender(map);
  58. }
  59. if (keypress.KeyChar == '2') //Движение вниз
  60. {
  61. if (map[heroY + 1, heroX] != '#')
  62. {
  63. map[heroY, heroX] = '.';
  64. map[heroY + 1, heroX] = '@';
  65. heroY++;
  66. mapRender(map);
  67. }
  68. else mapRender(map);
  69. }
  70. if (keypress.KeyChar == '4') //Движение влево
  71. {
  72. if (map[heroY, heroX - 1] != '#')
  73. {
  74. map[heroY, heroX] = '.';
  75. map[heroY, heroX - 1] = '@';
  76. heroX--;
  77. mapRender(map);
  78. }
  79. else mapRender(map);
  80. }
  81. } while (keypress.KeyChar != 'Q');
  82. }
  83. }
  84. }

Решение задачи: «Roguelike. Движение персонажа, проверить реализацию кода»

textual
Листинг программы
  1. // Управление - 8,6,2,4 на нумпаде.
  2. using System;
  3.  
  4. namespace Roguelike
  5. {
  6.     class Program
  7.     {
  8.         static int OffsetX = 20;
  9.         static int OffsetY = 3;
  10.  
  11.         public static void firstDraw(char[,] map) //Очищает и рендерит карту;
  12.         {
  13.             Console.Clear();
  14.             for (int y = 0; y < 5; y++)
  15.                 for (int x = 0; x < 7; x++)
  16.                     putCh(map[y, x], y, x);
  17.         }
  18.  
  19.         private static void putCh(char ch, int y, int x)
  20.         {
  21.             Console.SetCursorPosition(OffsetX + x, OffsetY + y);
  22.             Console.Write(ch);
  23.         }
  24.  
  25.         static char[,] map =
  26.             {
  27.                 {'#','#','#','#','#','#','#'},
  28.                 {'#','.','.','.','.','.','#'},
  29.                 {'#','.','.','.','.','.','#'},
  30.                 {'#','.','.','.','.','.','#'},
  31.                 {'#','#','#','#','#','#','#'}
  32.             };
  33.  
  34.         static int heroX = 3; //Задаем координаты персонажа
  35.         static int heroY = 2;
  36.  
  37.  
  38.         static void Main(string[] args)
  39.         {
  40.             map[heroY, heroX] = '@'; //Ставим персонажа на карту
  41.             firstDraw(map); //Рендерим
  42.  
  43.             ConsoleKeyInfo keypress;
  44.             do
  45.             {
  46.                 keypress = Console.ReadKey(true);
  47.                 switch (keypress.KeyChar)
  48.                 {
  49.                     case 'w': move(0, -1); break;
  50.                     case 's': move(0, 1); break;
  51.                     case 'd': move(1, 0); break;
  52.                     case 'a': move(-1, 0); break;
  53.                     default:
  54.                         break;
  55.                 }
  56.             } while (keypress.KeyChar != 'q');
  57.         }
  58.  
  59.         private static void move(int dx, int dy)
  60.         {
  61.  
  62.             if (map[heroY + dy, heroX + dx] == '#') return; //Провяем нет ли стены там, куда мы будем двигаться
  63.             map[heroY, heroX] = '.';
  64.             putCh('.', heroY, heroX);
  65.             heroY += dy; heroX += dx;
  66.             map[heroY, heroX] = '@';
  67.             putCh('@', heroY, heroX);
  68.         }
  69.     }
  70. }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 4.111 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы