Способы сделать Roguelike в родном C

У меня уже несколько месяцев была мечта сделать Roguelike, и по какой-то причине мой упрямый разум не позволил мне использовать библиотеку. Как можно нарисовать карту и манипулировать ею, не используя и не сортируя библиотеку, кроме stdio.h?

4 ответа

Си не знает, что такое "клавиатура" или "экран терминала". (Как ни странно, C действительно знает, что такое некоторые вещи, например, "локали", но давайте просто не будем об этом говорить.) Это означает, что любая письменная функциональность для такого рода устройств будет изначально непереносимой.

Тем не менее, в то время как вы сможете сделать некоторые прагматические предположения в вашем коде - например, предполагая, что stdin ваша клавиатура и stdout ваш экран - вы не сможете правильно контролировать положение курсора и цвет текста с помощью стандартных текстовых потоков. В Linux можно управлять обоими, используя управляющие коды терминала, но в Windows это невозможно - для этого вам придется использовать функции консоли. Кроме того, в Linux вам все равно придется заботиться о буферизации терминала и других сложностях. Наконец, возможности терминала несколько различаются - типичный терминал Linux имеет больше возможностей, чем консоль Windows, которая не может отображать, например, текст жирным шрифтом или курсивом.

Короче говоря, стандартные текстовые потоки не подходят для создания интерактивных приложений. Наилучшим решением будет создание небольшого уровня, который изолирует реализацию обработки терминала, таким образом, чтобы впоследствии вы могли решить, как лучше всего решить проблему - например, используя ncurses или реализовать свой собственный код обработки терминала.

  1. Напишите свою собственную версию ncurses (и termcap).
  2. Напиши свой Roguelike.

Действительно, ncurses был специально написан, чтобы позволить графику похожей на roguelike игры.

Если вы хотите сделать это без использования каких-либо существующих библиотек, вы постепенно переопределите библиотеки.

Я не рекомендовал бы писать roguelike в C без каких-либо библиотек. Безбиблиотечный С очень слаб для всего, что требует графического контроля.

На http://roguebasin.roguelikedevelopment.org/index.php?title=Main_Page есть отличная вики для разработки roguelike со множеством страниц, посвященных алгоритмам и дизайну roguelike. Он также содержит множество roguelikes, некоторые будут с открытым исходным кодом, некоторые будут на C. Я рекомендую вам прочитать, попробовать воспроизвести в вашей собственной программе, учиться, читать, пытаться воспроизвести в вашей собственной программе, учиться и т. Д. В цикле. И определенно используйте любые библиотеки, которые он рекомендует (вероятно, некоторые версии curses или ncurses, которые обычно используют консольные roguelikes, но не всегда)

Это зависит от степени, которую вы хотите.

  1. Как нарисовать карту, если можно использовать Windows API.

    • подготовить карту

      int map[15][20] = {
           {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
           {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
           {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
           {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
           {0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0},
           {0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0},
           {0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0},
           {0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0},
           {0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0},
           {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
           {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
           {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
           {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
           {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
           {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}};
      
    • подготовить функцию печати

      //used no double buffering and used putchar to make it simple
      void printAt(char c, int x, int y)
      {
          HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE);
          COORD p = {x,y};
          SetConsoleCursorPosition(h,p);
          putchar(c);
      }
      
    • включить заголовок

      #include <windows.h>
      #include <stdio.h>
      
    • сделать основной цикл

      int x = 10;
      int y = 10;
      //main loop
      while(1)
      {
          for(int cy=0;cy<15;cy++)
          {
              for(int cx=0;cx<20;cx++)
              {
                  int cell = map[cy][cx];
                 if(cell == 0)
                      printAt('.',cx,cy);//grass
                  else if(cell == 1)
                      printAt('T',cx,cy);//tree
                  else if(cell == 2)
                      printAt('?',cx,cy);//item
              }
          }
          printAt('@',x,y);//hero
          Sleep(500);
          x++;//simulate keypress
      }
      

      герой уйти из леса

  2. Если вы также хотите избежать API операционной системы, запишите в область памяти, называемую буфер кадров, для печати символа в определенном месте. И прочитать область памяти, называемую кольцевым буфером клавиатуры, где хранятся нажатые клавиши. Но если вам нужен такой подход, вы можете настроить среду, часто называемую голым металлом.

Слова с жирным шрифтом являются ключевыми словами.

Вы можете исследовать эти ключевые слова, если хотите больше.

Другие вопросы по тегам