我已经有了几个月制作Roguelike的梦想,出于某种原因,我顽固的头脑不会让我使用图书馆。如何在不使用stdio.h以外的库和其他库的情况下绘制地图并对其进行操作?
答案 0 :(得分:4)
C不知道“键盘”或“终端屏幕”是什么。 (奇怪的是,C确实知道某些事物是什么,比如“locales”,但让我们只是而不是谈论它。)这意味着这些的任何书面功能某种设备本质上是不可移植的。
尽管如此,虽然您可以在代码中做出一些实用的假设 - 例如,假设stdin
是您的键盘并且stdout
是您的屏幕 - ,您将不会能够使用标准文本流正确控制光标位置和文本着色。在Linux中,可以使用终端转义码来控制它们,但在Windows中这是不可能的 - 您必须使用console functions。此外,在Linux中,您仍然需要关心终端缓冲和其他并发症。最后,终端功能有所不同 - 典型的Linux终端具有比Windows控制台更多的功能,例如,无法显示粗体或斜体中的文本。
简而言之,标准文本流不适合创建交互式应用程序。最好的解决方案是创建一个隔离终端处理实现的小层,以便以后可以决定如何最好地解决问题 - 例如,使用ncurses
或实现自己的终端处理代码。
答案 1 :(得分:2)
真的,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)
这取决于你想要的程度。
如果可以使用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>
如果您还想避免使用操作系统API,请写入名为帧缓冲区的内存区域以在特定位置打印字符。并读取名为键盘环缓冲区的存储区,其中存储了按键。但是如果你想要这种方法,你可能想要设置通常被称为裸机的环境。
粗体字是关键字。
如果您需要更多关键字,可能需要研究这些关键字。