如何在本地C制作Roguelike

时间:2013-06-05 01:08:39

标签: c native roguelike

我已经有了几个月制作Roguelike的梦想,出于某种原因,我顽固的头脑不会让我使用图书馆。如何在不使用stdio.h以外的库和其他库的情况下绘制地图并对其进行操作?

4 个答案:

答案 0 :(得分:4)

C不知道“键盘”或“终端屏幕”是什么。 (奇怪的是,C确实知道某些事物是什么,比如“locales”,但让我们只是而不是谈论它。)这意味着这些的任何书面功能某种设备本质上是不可移植的。

尽管如此,虽然您可以在代码中做出一些实用的假设 - 例如,假设stdin是您的键盘并且stdout是您的屏幕 - ,您将不会能够使用标准文本流正确控制光标位置和文本着色。在Linux中,可以使用终端转义码来控制它们,但在Windows中这是不可能的 - 您必须使用console functions。此外,在Linux中,您仍然需要关心终端缓冲和其他并发症。最后,终端功能有所不同 - 典型的Linux终端具有比Windows控制台更多的功能,例如,无法显示粗体斜体中的文本。

简而言之,标准文本流不适合创建交互式应用程序。最好的解决方案是创建一个隔离终端处理实现的小层,以便以后可以决定如何最好地解决问题 - 例如,使用ncurses或实现自己的终端处理代码。

答案 1 :(得分:2)

  1. 编写自己的ncurses版本(和termcap)。
  2. 写下你的Roguelike。
  3. 真的,ncurses是专门为了允许roguelike游戏的图形而编写的。

    如果你想在不使用任何现有库的情况下这样做,你最终会慢慢重新实现这些库。

答案 2 :(得分:1)

我不建议在没有任何库的情况下在C中编写roguelike。无库存C对于需要图形控制的任何东西都非常弱。

http://roguebasin.roguelikedevelopment.org/index.php?title=Main_Page有一个关于roguelike开发的伟大wiki,有许多关于算法和roguelike设计的页面。它还包含许多roguelike,有些将是开源的,有些将在C中。我建议你阅读,尝试在你自己的程序中重现,学习,阅读,尝试在你自己的程序中重现,学习等循环。并且绝对使用它推荐的任何库(可能是某些版本的curses或ncurses,这通常是控制台roguelike但不总是使用)

答案 3 :(得分:0)

这取决于你想要的程度。

  1. 如果可以使用Windows API,如何绘制地图。

    • 准备地图

      UnsafeMutableRawPointer
    • 准备打印功能

      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>
      

      hero walk away from forest

  2. 如果您还想避免使用操作系统API,请写入名为帧缓冲区的内存区域以在特定位置打印字符。并读取名为键盘环缓冲区的存储区,其中存储了按键。但是如果你想要这种方法,你可能想要设置通常被称为裸机的环境。

  3. 粗体字是关键字。

    如果您需要更多关键字,可能需要研究这些关键字。