【问题标题】:Why don't appear window created by ncurses?为什么不出现ncurses创建的窗口?
【发布时间】:2022-12-11 14:57:31
【问题描述】:

必须出现一个带有输入的新窗口。但只是显示一个标准的 ncurses 窗口。 `

#define _POSIX_C_SOURCE 200201L
#include <stdlib.h>
#include <curses.h>
#include <time.h>

int main () {
    srand(time(NULL));
    initscr();
    cbreak();
    noecho();

    // get screen sizes
    int yMax, xMax;
    getmaxyx(stdscr, yMax, xMax);

    //create a new window for input
    int height = 10;
    int width = 120;
    WINDOW * inputwin = newwin(height, width, yMax/2 - 5, (xMax/2 - width/2));
    box(inputwin, 0, 0);
    refresh();
    wrefresh(inputwin);

    // get amount roads
    echo();
    mvwprintw(inputwin, 4, width/2 - 38, "Press key left to choose beginner level, key right - intermediate, key up - advanced.");
    int amount_roads = 0;
    keypad(inputwin, TRUE);

    int a;

    while (a != KEY_DOWN) {
        int c = mvwgetch(inputwin, 5, 50);

        if (c == KEY_LEFT) {
            mvwprintw(inputwin, 5, 50, "You chose beginner                ");
            amount_roads = 2;
        } else if (c == KEY_RIGHT) {
            mvwprintw(inputwin, 5, 50, "You chose intermediate            ");
            amount_roads = 3;
        } else if (c == KEY_UP) {
            mvwprintw(inputwin, 5, 50, "You chose advanced                ");
            amount_roads = 4;
        } else mvwprintw(inputwin, 5, 50, "INCORRECT INPUT. TRY AGAIN");
        wrefresh(inputwin);

        mvwprintw(inputwin, 6, 47, "Press key down to continue");
        a =  mvwgetch(inputwin, 7, 60);
    }
    delwin(inputwin);
    wrefresh(stdscr);

    //create win for game
    height = yMax - 4;
    width = xMax - 10;
    WINDOW * gamewin = newwin(height, width, 2, 5);
    box(gamewin, 0, 0);
    refresh();
    wrefresh(gamewin);

    // draw roads
    int road_width = (width - 2) / amount_roads;
    for (int i = road_width; i < width - 2; i += road_width + 1) {
        for (int j = 1; j < height - 1; j ++) {
            mvwprintw(gamewin, j, i, "|");
        }
    }

    //draw car

    char car[8][12] =
    {
        {' ', ' ', ' ', '_', '_', '_', '_', '_', ' ', ' ', ' ', '\0'},
        {' ', '(', ')', ' ', '|', '|', '|', ' ', '(', ')', ' ', '\0'},
        {'/', ' ', '_', '_', '_', '_', '_', '_', '_', ' ', '\\', '\0'},
        {'|', '/', '_', '_', '_', '_', '_', '_', '_', '\\', '|', '\0'},
        {'|', ' ', ' ', '_', '_', '_', '_', '_', ' ', ' ', '|', '\0'},
        {'|', ' ', ' ', '\\', '_', '_','_', '/', ' ', ' ', '|', '\0'},
        {'\\', '@', '@', ' ', '|', ' ', '|', ' ', '@', '@', '/', '\0'},
        {' ', ' ', '@', '_', '|', '_', '|', '_', '@', ' ', ' ', '\0'}
    };

    int y = height - 9;   //y position

    for (int i = 0; i < 8; i ++) {
        int x = (road_width/2) - (11/2);  // x position
        for (int j = 0; j < 12; j ++) {
            mvwprintw(gamewin, y, x, "%c", car[i][j]);
            x ++;
        }
        y ++;
    }
    wrefresh(gamewin);

    // let car moves
    void delete_car() {
        int yCurr, xCurr;
        getyx(gamewin, yCurr, xCurr);
        int yPos = height - 9;   //y position

        for (int i = 0; i < 8; i ++) {
            int xPos = xCurr - 13;  // x position
            for (int j = 0; j < 12; j ++) {
                mvwprintw(gamewin, yPos, xPos, "%c", ' ');
                xPos ++;
            }
            yPos ++;
        }
        wrefresh(gamewin);
    }

    int move_car(const char direction) {
        // let to move at given side
        int add;
        if (direction == 'l') add = -road_width;
        else if (direction == 'r') add = road_width;
        else return 0;

        //defines a start position for car from left side
        int yCurr, xCurr;
        getyx(gamewin, yCurr, xCurr);
        int yPos = height - 9;

        for (int i = 0; i < 8; i ++) {
            int xPos = (xCurr - 13) + add;  // x position
            for (int j = 0; j < 12; j ++) {
                mvwprintw(gamewin, yPos, xPos, "%c", car[i][j]);
                xPos ++;
            }
            yPos ++;
        }
        wrefresh(gamewin);
        getyx(gamewin, yCurr, xCurr);
        return xCurr;
    }

    int attempt = 0;

    while (attempt < 20) {
        keypad(gamewin, TRUE);
        int move = mvwgetch(gamewin, y - 1, ((road_width/2) - (11/2)) + 13);

        if (move == KEY_RIGHT) {
            int yCurr, xCurr; // check is the road on the right
            getyx(gamewin, yCurr, xCurr);
            if ((xCurr - 13) > (road_width * amount_roads + (amount_roads - 1))) {
                wprintw(gamewin, "There is no the road");
            }
            delete_car();// clear current road
            move_car('r');// add car to next road
        } else if (move == KEY_LEFT) {
            int yCurr, xCurr; // check is the road on the left
            getyx(gamewin, yCurr, xCurr);
            if ((xCurr - 13) < road_width) wprintw(gamewin, "There is no the road");
            delete_car(); // clear current road
            move_car('l'); // add car to next road
        }
    }


    wrefresh(gamewin);

    getch();
    endwin();

    return EXIT_SUCCESS;
}

`

我正在使用 ncurses 编写一个小游戏,首先我创建一个用户登录窗口,然后是游戏本身的窗口。从字面上看,昨天一切正常,今天除了标准窗口和一开始的输入外什么都没有显示。我不明白这是怎么回事,也许我不小心删除了一些东西,我不知道。整个代码看了好几遍,还没找到哪里错了,请大神指点一下

【问题讨论】:

  • 我编译了你的代码,我能够通过第一个提示并显示汽车。游戏似乎需要最小终端窗口大小,否则某些计算会超出范围。您是否尝试最大化您的终端窗口?

标签: c ubuntu ncurses curses


【解决方案1】:

可以使用一个函数来擦除或打印汽车。
使用 xMax 和 yMax 作为窗口尺寸的基础,以便窗口适合终端。

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

#define CAR_HEIGHT 8
#define CAR_WIDTH 12

void draw_car ( WINDOW *gamewin, char car[][CAR_WIDTH], int y, int x, int show) {
    for ( int i = 0; i < CAR_HEIGHT; i ++) {
        for ( int j = 0; j < CAR_WIDTH; j ++) {
            if ( show) {
                mvwprintw ( gamewin, y + i, x + j, "%c", car[i][j]);
            } else {
                mvwprintw ( gamewin, y + i, x + j, " ");
            }
        }
    }
}

 int main ( void) {
    initscr ( );
    cbreak ( );
    noecho ( );

    srand ( time ( NULL));
    // get screen sizes
    int yMax = 0, xMax = 0;
    getmaxyx ( stdscr, yMax, xMax);

    //create a new window for input
    int height = yMax - 2;
    int width = xMax - 2;
    WINDOW *inputwin = newwin ( height, width, 1, 1);
    box ( inputwin, 0, 0);
    refresh ( );
    wrefresh ( inputwin);

    // get amount roads
    echo ( );
    mvwprintw ( inputwin, 1, 1, "Press key left to choose beginner level.");
    mvwprintw ( inputwin, 2, 7, "key right - intermediate.");
    mvwprintw ( inputwin, 3, 7, "key up - advanced.");
    int amount_roads = 0;
    keypad ( inputwin, TRUE);

    int a = 0;

    do {
        a =  mvwgetch ( inputwin, 7, 60);
        switch ( a) {
            case KEY_LEFT:
                mvwprintw ( inputwin, 5, width / 2, "You chose beginner        ");
                amount_roads = 2;
                break;
            case KEY_RIGHT:
                mvwprintw ( inputwin, 5, width / 2, "You chose intermediate    ");
                amount_roads = 3;
                break;
            case KEY_UP:
                mvwprintw ( inputwin, 5, width / 2, "You chose advanced        ");
                amount_roads = 4;
                break;
            case KEY_DOWN:
                break;
            default:
                amount_roads = 0;
        }

        if ( amount_roads) {
            mvwprintw ( inputwin, 6, width / 2, "Press key down to continue");
        } else {
            mvwprintw ( inputwin, 5, width / 2, "INCORRECT INPUT. TRY AGAIN");
            mvwprintw ( inputwin, 6, width / 2, "                          ");
        }
        wrefresh ( inputwin);

    } while ( ! amount_roads || a != KEY_DOWN);
    wrefresh ( inputwin);
    delwin ( inputwin);
    refresh ( );

    //create win for game
    height = yMax - 4;
    width = xMax - 4;
    WINDOW *gamewin = newwin ( height, width, 2, 2);
    box ( gamewin, 0, 0);
    keypad ( gamewin, TRUE);
    refresh ( );
    wrefresh ( gamewin);

    // draw roads
    int road_width = ( width - amount_roads) / amount_roads;
    for ( int i = road_width; i < width - 2; i += road_width + 1) {
        for ( int j = 2; j < height - 1; j ++) {
            mvwprintw ( gamewin, j, i, "|");
        }
    }

    char car[CAR_HEIGHT][CAR_WIDTH] = {
        { "   _____   "},
        { " () ||| () "},
        { "/ _______ \"},
        { "|/_______\|"},
        { "|  _____  |"},
        { "|  \___/  |"},
        { "\@@ | | @@/"},
        { "  @_|_|_@  "}
    };

    int y = height - 9;   //y position
    int road_lane = 0;
    int show = 1;

    int x = road_lane * road_width + ( road_width / 2 - 5);  // x position
    draw_car ( gamewin, car, y, x, show);

    wrefresh ( gamewin);

    int attempt = 0;

    int change = 0;

    do {
        change = mvwgetch ( gamewin, 1, 1);
        draw_car ( gamewin, car, y, x, ! show);
        switch ( change) {
            case KEY_RIGHT:
                if ( road_lane == amount_roads - 1) {
                    mvwprintw ( gamewin, 1, 2, "There is no the road");
                } else {
                    mvwprintw ( gamewin, 1, 2, "                    ");
                    ++road_lane;
                    x += road_width + 1;  // x position
                }
                break;
            case KEY_LEFT:
                if ( road_lane == 0) {
                    mvwprintw ( gamewin, 1, 2, "There is no the road");
                } else {
                    mvwprintw ( gamewin, 1, 2, "                    ");
                    --road_lane;
                    x -= road_width + 1;  // x position
                }
                break;
            case KEY_DOWN:
                if ( y == height - 9) {
                    mvwprintw ( gamewin, 1, 2, "There is no the road");
                } else {
                    mvwprintw ( gamewin, 1, 2, "                    ");
                    ++y;
                }
                break;
            case KEY_UP:
                if ( y == 2) {
                    mvwprintw ( gamewin, 1, 2, "There is no the road");
                } else {
                    mvwprintw ( gamewin, 1, 2, "                    ");
                    --y;
                }
                break;
        }
        draw_car ( gamewin, car, y, x, show);
    } while ( attempt < 20 && change != '
');

    wrefresh ( gamewin);
    // getch();
    delwin ( gamewin);
    endwin ( );

    return EXIT_SUCCESS;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-01
    • 1970-01-01
    相关资源
    最近更新 更多