如何从文件加载 2D 字符数组并使用 ncurses.h 在 C 中使用 mvprintw() 打印它?
How to load 2D char array from file and print it with mvprintw() in C using ncurses.h?
我正在编写一个小游戏,我决定从文件中加载地图,但我面对的 problem.The 文件如下所示:
我需要像在文件中一样打印它,而不是点。它们必须是空格。
我的打印代码如下所示:
void printmap(){
clear();
refresh();
FILE *mapfile;
int width=30;
int height=20;
char map[20][30];
mapfile = fopen(mapname, "r+");
for (int row = 0; row < height; row++) {
for (int col = 0; col < width; col++) {
mvprintw(0,0," ");
mvprintw(0,0,"%d %d",row,col);
refresh();
map[row][col]=fgetc(mapfile);
}
}
fclose(mapfile);
offsetW=(xMax-width)/2;
offsetY=((yMax-height)/2)-3;
printOffsetW = offsetW+23;
printOffsetY = offsetY+17;
for(int i=0;i<20;i++){
offsetW=(xMax-width)/2;
for(int y=0;y<width;y++){
if(map[i][y]=='#'){
attron(COLOR_PAIR(1));
mvprintw(i,y,"#");
attroff(COLOR_PAIR(1));
}
else if(map[i][y]=='*'){
attron(COLOR_PAIR(2));
mvprintw(i,y,"*");
attroff(COLOR_PAIR(2));
}
else if(map[i][y]==' '||map[i][y]=='.'){
mvprintw(i,y," ");
}
offsetW++;
}
offsetY++;
}
mvprintw(printOffsetY,printOffsetW,"@");
refresh();
}
偏移量只是为了使地图居中(将来),所以您可以忽略它们。
我的实际印刷品是这样的:
我也说不清问题出在哪里。
如有任何帮助,我将不胜感激。
谢谢
由于地图文件在行尾包含换行符,
每行包含 width + 1
个字符。然后顺序 fgetc()
为每行读取额外字节并导致垂直对齐偏移。
解决方法是显式读取换行符,例如:
for (int row = 0; row < height; row++) {
for (int col = 0; col < width; col++) {
...
map[row][col]=fgetc(mapfile);
}
fgetc(mapfile); // read the newline character and discard
}
或更便携的方式:
char map[20][30];
char buf[BUFSIZ]; // line buffer
mapfile = fopen(mapname, "r+");
for (int row = 0; row < height; row++) {
fgets(buf, BUFSIZ, mapfile); // read each line
for (int col = 0; col < width; col++) {
...
map[row][col]=buf[col]; // assign column values of the line
}
}
我正在编写一个小游戏,我决定从文件中加载地图,但我面对的 problem.The 文件如下所示:
我需要像在文件中一样打印它,而不是点。它们必须是空格。 我的打印代码如下所示:
void printmap(){
clear();
refresh();
FILE *mapfile;
int width=30;
int height=20;
char map[20][30];
mapfile = fopen(mapname, "r+");
for (int row = 0; row < height; row++) {
for (int col = 0; col < width; col++) {
mvprintw(0,0," ");
mvprintw(0,0,"%d %d",row,col);
refresh();
map[row][col]=fgetc(mapfile);
}
}
fclose(mapfile);
offsetW=(xMax-width)/2;
offsetY=((yMax-height)/2)-3;
printOffsetW = offsetW+23;
printOffsetY = offsetY+17;
for(int i=0;i<20;i++){
offsetW=(xMax-width)/2;
for(int y=0;y<width;y++){
if(map[i][y]=='#'){
attron(COLOR_PAIR(1));
mvprintw(i,y,"#");
attroff(COLOR_PAIR(1));
}
else if(map[i][y]=='*'){
attron(COLOR_PAIR(2));
mvprintw(i,y,"*");
attroff(COLOR_PAIR(2));
}
else if(map[i][y]==' '||map[i][y]=='.'){
mvprintw(i,y," ");
}
offsetW++;
}
offsetY++;
}
mvprintw(printOffsetY,printOffsetW,"@");
refresh();
}
偏移量只是为了使地图居中(将来),所以您可以忽略它们。
我的实际印刷品是这样的:
我也说不清问题出在哪里。
如有任何帮助,我将不胜感激。 谢谢
由于地图文件在行尾包含换行符,
每行包含 width + 1
个字符。然后顺序 fgetc()
为每行读取额外字节并导致垂直对齐偏移。
解决方法是显式读取换行符,例如:
for (int row = 0; row < height; row++) {
for (int col = 0; col < width; col++) {
...
map[row][col]=fgetc(mapfile);
}
fgetc(mapfile); // read the newline character and discard
}
或更便携的方式:
char map[20][30];
char buf[BUFSIZ]; // line buffer
mapfile = fopen(mapname, "r+");
for (int row = 0; row < height; row++) {
fgets(buf, BUFSIZ, mapfile); // read each line
for (int col = 0; col < width; col++) {
...
map[row][col]=buf[col]; // assign column values of the line
}
}