问题描述
我制作了一个链表并用 4 个“#”字符填充它,我想用 ncurses 库在屏幕上打印它们,因为我正在尝试制作一个蛇游戏,但不知道为什么它不打印,这是代码:
#include<ncurses.h>
#include<stdlib.h>
struct snake{
char piece;
struct snake *nextPiece;
};
struct snake *addNewPiece(const char piece){
struct snake *newPiece = NULL;
newPiece = malloc(sizeof(struct snake));
if(newPiece != NULL){
newPiece->nextPiece = NULL;
newPiece->piece = piece;
}else{
endwin();
printf("mem aloc failure,the program Couldn't alloc the memory correctly");
}
return newPiece;
}
int main(){
int i = 0;
struct snake *first = NULL;
struct snake *added = NULL;
initscr();
noecho();
int yMaxStd,xMaxStd;
getmaxyx(stdscr,yMaxStd,xMaxStd);
WINDOW* win = newwin(20,50,(yMaxStd/2)-10,10);
Box(win,0);
refresh();
wrefresh(win);
leaveok(win,true);
int yMaxWin,xMaxWin;
getmaxyx(win,yMaxWin,xMaxWin);
wmove(win,yMaxWin/2,yMaxWin/2);
//llenar lista con 4 #
while(i<=4){
if(first == NULL){
first = addNewPiece("#");
if(first != NULL){
added = first;
}
}else{
added->nextPiece = addNewPiece("#");
if(added->nextPiece != NULL){
added = added->nextPiece;
}
}
}
if(first == NULL){
endwin();
printf("Men alloc failure.");
}
printinscreen(first,win);
getch();
endwin();
return 0;
}
void printinscreen(struct snake *piece,WINDOW* win){
struct snake *t;
t = piece;
int y = 5,x = 5;
if(t == NULL){
endwin();
}else{
while(t != NULL){
mvwprintw(win,y,x,t);
t = t->nextPiece;
y--;
}
}
}
我知道我正在完善链表的链接过程,因为我测试它在另一个文件中使用 stdio.h 打印它并且它工作
解决方法
你的程序有几个错误,我已经修复了。最严重的是你的代码不能用C++编译。如果打算在C++下编译,首先需要修复编译错误。
-
更自然>ERROR Error: Angular JIT compilation failed: '@angular/compiler' not loaded! - JIT compilation is discouraged for production use-cases! Consider AOT mode instead. - Did you bootstrap using '@angular/platform-browser-dynamic' or '@angular/platform-server'? - Alternatively provide the compiler with 'import "@angular/compiler";' before bootstrapping.
,这里需要转换:newPiece = malloc(sizeof(struct snake));
,一般不推荐在c++中使用newPiece = (snake *)malloc(sizeof(struct snake));
,使用malloc
-
new
将字符串文字作为first = addNewPiece("#");
参数传递,这里需要传递一个字符。 -
char
,你对API有误解,应该修正为mvwprintw(win,y,x,t);
,你需要在使用库API之前查看document,看看它是什么类型的参数期待 -
您在打印屏幕后忘记刷新屏幕!
-
你没有在 for 循环中增加索引,这是一个无限循环。
你的代码有点c风格,如果你想用C++写,需要重构,一些建议:
- 使用
mvwprintw(win,"%c",t->piece);
来存储snake body,那么我们就不需要手动管理内存了。并避免了容易出错的链表处理。然后可以简化大部分代码。 - 使用日志库并打印日志以帮助调试
固定代码应该可以工作,我的控制台上有一条垂直的蛇。
std::vector
看到 PO 的评论后,我们知道问题被错误地标记为 #include <ncurses.h>
#include <stdlib.h>
struct snake {
char piece;
struct snake *nextPiece;
};
struct snake *addNewPiece(const char piece) {
struct snake *newPiece = NULL;
newPiece = (snake *)malloc(sizeof(struct snake));
if (newPiece != NULL) {
newPiece->nextPiece = NULL;
newPiece->piece = piece;
} else {
endwin();
printf("mem aloc failure,the program couldn't alloc the memory correctly");
}
return newPiece;
}
void printinscreen(struct snake *piece,WINDOW *win);
int main(int argc,char *argv[]) {
int i = 0;
struct snake *first = NULL;
struct snake *added = NULL;
initscr();
noecho();
int yMaxStd,xMaxStd;
getmaxyx(stdscr,yMaxStd,xMaxStd);
WINDOW *win = newwin(20,50,(yMaxStd / 2) - 10,10);
box(win,0);
refresh();
wrefresh(win);
leaveok(win,true);
int yMaxWin,xMaxWin;
getmaxyx(win,yMaxWin,xMaxWin);
wmove(win,yMaxWin / 2,yMaxWin / 2);
// llenar lista con 4 #
while (i <= 4) {
if (first == NULL) {
first = addNewPiece('#');
if (first != NULL) {
added = first;
}
} else {
added->nextPiece = addNewPiece('#');
if (added->nextPiece != NULL) {
added = added->nextPiece;
}
}
++i;
}
if (first == NULL) {
endwin();
printf("Men alloc failure.");
}
printinscreen(first,win);
refresh();
wrefresh(win);
getch();
endwin();
return 0;
}
void printinscreen(struct snake *piece,WINDOW *win) {
struct snake *t;
t = piece;
int y = 5,x = 5;
if (t == NULL) {
endwin();
} else {
while (t != NULL) {
mvwprintw(win,t->piece);
t = t->nextPiece;
y--;
}
}
}
,c 版本代码:
c++