【问题标题】:C- Window / Prints not appearingC-窗口/打印不出现
【发布时间】:2014-07-10 19:28:38
【问题描述】:

伙计们,我不知道为什么没有出现窗口边框/打印。我哪里错了?它以前工作过。我添加了在注释括号中看到的部分。即使我卸下了这些部件,它也停止了工作。

#include <ncurses.h>
#include <stdio.h>
#include <stdlib.h>

int main()
{
    int y = 2;
    int x = 2;
    int oldy = 2;
    int oldx = 2;
    char m = 'l';

    initscr();
    WINDOW* win;
    win = newwin(41,40, 0 ,0);
    /*WINDOW* win2 = newwin(10,10, 40 ,0);*/
    box(win, ACS_VLINE, ACS_HLINE);
    /*box(win2, ACS_VLINE, ACS_HLINE);*/
    mvwprintw(win,1, 1, "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX");
    mvwprintw(win,2, 1, "X X   X     X   X          X       X X");
    mvwprintw(win,3, 1, "X X X X XXX X X X XXXXXXXX X XXXXX X X");
    mvwprintw(win,4, 1, "X X X     X   X X X          X     X X");
    mvwprintw(win,5, 1, "X XXXXXXX XXXXX X X XXXXXXXXXX XXXXX X");
    mvwprintw(win,6, 1, "X       X X     X X          X       X");
    mvwprintw(win,7, 1, "XXXXXXX X XXXXXXX XXXXXXXXXX XXXXXXXXX");
    mvwprintw(win,8, 1, "X       X X       X        X X       X");
    mvwprintw(win,9, 1, "X XXXXXXX X XXXXXXX XXXXXX   X XXXXX X");
    mvwprintw(win,10, 1, "X X       X X             XXXX X X   X");
    mvwprintw(win,11, 1, "X X XXXXX X XXXX XXXXXXXX      X X XXX");
    mvwprintw(win,12, 1, "X X X     X XXXX X       XXXXXXX X X X");
    mvwprintw(win,13, 1, "X   X XXX X    X X XXXXX X   X X   X X");
    mvwprintw(win,14, 1, "XXXXX X X XXXX X   X   X X X X XXXXX X");
    mvwprintw(win,15, 1, "X     X X X    XXXXX X X X X X     X X");
    mvwprintw(win,16, 1, "X XXXXX X X XXXX     X X X X XXXXX X X");
    mvwprintw(win,17, 1, "X X     X X    X XXXXX     X         X");
    mvwprintw(win,18, 1, "X X XXXXX XXXX X X   XXXXXXXXXXXXXXXXX");
    mvwprintw(win,19, 1, "X   X          X   X                 O");
    mvwprintw(win,20, 1, "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX");
    wmove(win,2,2);
    wrefresh(win);
    /*wrefresh(win2);*/


    while(m != 'q')
    {
            /*mvwprintw(win2,41,0,"22");*/
            /*wrefresh(win2);*/
            m=getch();
            /*mvwprintw(win2,40,0,"Please use the following keys to navigate through the maze.(W) Up (S) Down (D) Right (A) Left");*/
            wrefresh(win);

    switch(m)
        {
            case 'S': if(mvwinch(win,(oldy+1),x)=='X')
                        {
                        mvwprintw(win,40,0,"Sorry, you cant move there.");  
                        wrefresh(win);
                        wmove(win,oldy,oldx);
                        wrefresh(win);
                        }

                      else
                        {
                        wmove(win,(y=oldy+1),x);
                        wrefresh(win);
                        oldy = y;
                        }
                break;

            case 'D': if(mvwinch(win,y,(oldx+1))=='X')
                        {
                        mvwprintw(win,40,0,"Sorry, you cant move there.");  
                        wrefresh(win);
                        wmove(win,oldy,oldx);
                        wrefresh(win);
                        }

                      else
                        {
                        wmove(win,y,x=(oldx+1));
                        wrefresh(win);
                        oldx = x;
                        }
                break;

            case 'A': if(mvwinch(win,y,(oldx-1))=='X')
                        {
                        mvwprintw(win,40,0,"Sorry, you cant move there.");  
                        wrefresh(win);
                        wmove(win,oldy,oldx);
                        wrefresh(win);
                        }

                      else
                        {
                        wmove(win,y,x=(oldx-1));
                        wrefresh(win);
                        oldx = x;
                        }
                break; 

            case 'W': if(mvwinch(win,(oldy-1),x)=='X')
                        {
                        mvwprintw(win,40,0,"Sorry, you cant move there.");  
                        wrefresh(win);
                        wmove(win,oldy,oldx);
                        wrefresh(win);
                        }

                      else
                        {
                        wmove(win,y=(oldy-1),x);
                        wrefresh(win);
                        oldy = y;
                        }   
                break;

            default: m = 'q';

        }

    }

    delwin(win);
    /*delwin(win2);*/
    endwin();

    return 0;
}

【问题讨论】:

  • 这就是为什么即使在小型项目中也应该使用版本控制系统(我推荐 gitmercurial),并调整方法在开始处理任何新功能或错误修复之前提交。我建议你现在开始使用一个,它只是一个 git init 或其他任何东西。

标签: c ncurses


【解决方案1】:

您打印的所有内容都在win 中,但getch() 读取自stdscr(默认全屏窗口)。从stdscr 读取会导致它跳到窗口堆栈的顶部,从而遮挡您的win

使用wgetch(win)

【讨论】:

  • 那与运动有关。我对光标的移动没有​​任何问题。唯一的问题是迷宫没有被打印出来。
  • 你试过了吗?我没有猜到。 getch() 绘制 stdscr 使屏幕空白,因为 stdscr 是空白的。你永远没有机会看到win。如果您仍然不相信我,请在您的getch() 之前加上sleep(3)。迷宫出现 3 秒后消失。
  • 你也指的是哪个 getch()?最后的那个?
  • 您发布的代码中只有一个,而且还没有接近尾声。
  • 刚刚注意到主页上有一个更旧的副本,感谢有人编辑它:stackoverflow.com/questions/3808626/ncurses-refresh
猜你喜欢
  • 1970-01-01
  • 2011-09-18
  • 2012-03-12
  • 1970-01-01
  • 2017-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多