user8694810 user8694810 - 3 years ago 124
C++ Question

initscr() is messing up display

I am new to C++ and ncurses. When I add

initscr()
to my code to allow user input to control the player, the display does not show when it starts and then when you press a button the display shows but it goes all weird. This only happens if I add
initscr()
to my
main()
method. Why is it doing this and how do I fix it?

#include <iostream>
#include <curses.h>
using namespace std;

bool gameOver;
bool pressed;
const int width = 20;
const int height = 20;
int x, y, fruitX, fruitY, score;
enum eDirection { STOP = 0, LEFT, RIGHT, UP, DOWN };
eDirection dir;

void Setup() {
gameOver = false;
dir = STOP;
x = width / 2;
y = height / 2;
fruitX = rand() % width;
fruitY = rand() % height;
score = 0;
}

void Draw() {
system("clear");
for (int i = 0; i < width + 2; i++)
cout << "#";
cout << endl;

for (int i = 0; i < height; i++) {
for (int j = 0; j < width; j++) {
if (j == 0)
cout << "#";
if (i == y && j == x)
cout << "O";
else if (i == fruitY && j == fruitX)
cout << "F";
else
cout << " ";

if (j == width - 1)
cout << "#";
}
cout << endl;
}

for (int i = 0; i < width + 2; i++)
cout << "#";
cout << endl;
}

void Input() {
switch (getch()) {
case 'a':
dir = LEFT;
break;
case 'd':
dir = RIGHT;
break;
case 'w':
dir = UP;
break;
case 's':
dir = DOWN;
break;
case 'x':
gameOver = true;
break;
}
}

void Logic() {
switch (dir) {
case LEFT:
x--;
break;
case RIGHT:
x++;
break;
case UP:
y--;
break;
case DOWN:
y++;
break;
default:
break;
}
}

int main() {
//initscr();
Setup();
while(!gameOver) {
Draw();
Input();
Logic();
}
//endwin();
return 0;
}

Answer Source

You are mixing curses with non-curses screen control and seeing the results of conflict between the libraries.

If you are going to use curses, just use that. Peruse the NCURSES Programming HOWTO for information on doing it correctly. (The documentation there applies to most of PDCurses as well.)

tl;dr: Get rid of system() calls to do stuff to the screen, and use the *addstr() and *printw() functions to print output. Don’t forget to [w]refresh().

Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download