【发布时间】: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 编写一个小游戏,首先我创建一个用户登录窗口,然后是游戏本身的窗口。从字面上看,昨天一切正常,今天除了标准窗口和一开始的输入外什么都没有显示。我不明白这是怎么回事,也许我不小心删除了一些东西,我不知道。整个代码看了好几遍,还没找到哪里错了,请大神指点一下
【问题讨论】:
-
我编译了你的代码,我能够通过第一个提示并显示汽车。游戏似乎需要最小终端窗口大小,否则某些计算会超出范围。您是否尝试最大化您的终端窗口?