C ++ добавляет дополнительное число к int при его вычитании

Я работаю над ASCII-игрой на C ++. Игрок перемещается, избегая препятствий (‘X’s). Игрок имеет здоровье и теряет его при столкновении с препятствием. Я объявил здоровье как int и установил в 100:

int health = 100;

И тогда я сделал выключатель, обнаружив столкновение.
Затем я набрал:

health--;

И запустил программу. Я столкнулся с препятствием, и оно снизило здоровье, но добавило дополнительное число (например, вместо 99 было 999).
Я попробовал отладку, но ничего не нашел. Что я делаю неправильно? Вот полный код:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>

#define FPS 100

using namespace std;

char Map[21][33] =
{
"##############################",
"#@                           #",
"#                            #",
"#                            #",
"#                            #",
"#                            #",
"#                            #",
"#                            #",
"#                            #",
"#                            #",
"#                            #",
"#                            #",
"#                            #",
"#                            #",
"#                            #",
"#                            #",
"#                            #",
"#                            #",
"#                           !#",
"##############################",};

int x = 1;
int y = 1;
int choice;
int level = 1;
int health = 100;
int lives = 5;
int score;

void clearScreen()
{
short posX = 0;
short posY = 0;
COORD coord = {posX,posY};
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
}

void clearMoney()
{
for(int i = 0; i < 21; i++)
{
for(int j = 0; j < 33; j++)
{
switch(Map[i][j])
{
case '$':
{
Map[i][j] = ' ';
}
}
}
}
}

void setupMoney()
{
clearMoney();
for(int i = 0; i < 21; i++)
{
for(int j = 0; j < 33; j++)
{
switch(Map[i][j])
{
case ' ':
{
choice = rand() % 30 + 1;
switch(choice)
{
case 2:
{
Map[i][j] = '$';
}
}
}
}
}
}
}

void clearObstacles()
{
for(int i = 0; i < 21; i++)
{
for(int j = 0; j < 33; j++)
{
switch(Map[i][j])
{
case 'X':
{
Map[i][j] = ' ';
}
}
}
}
}

void setupObstacles()
{
clearObstacles();
for(int i = 0; i < 21; i++)
{
for(int j = 0; j < 33; j++)
{
switch(Map[i][j])
{
case ' ':
{
choice = rand() % 15 + 1;
switch(choice)
{
case 2:
{
Map[i][j] = 'X';
}
}
}
}
}
}
}

void showMap()
{
for(int i = 0; i < 20; i++)
{
for(int j = 0; j < 33; j++)
{
printf("%c", Map[i][j]);
}
putchar('\n');
}
}

void convertToAscii()
{
for(int g = 0; g < 20; g++)
{
for(int h = 0; h < 30; h++)
{
switch(Map[g][h])
{
case '#':
{
Map[g][h] = 219;
break;
}
case '@':
{
Map[g][h] = 254;
break;
}
}
}
}
}

int main()
{
srand(time(NULL));
printf("Loading...");
convertToAscii();
setupObstacles();
setupMoney();
system("cls");
for( ; ; )
{
if(GetAsyncKeyState(VK_UP))
{
switch(Map[y-1][x])
{
case ' ':
{
for(int i = 0; i < rand() % 5 + 2; i++)
{
switch(Map[y-1][x])
{
case ' ':
{
y--;
Map[y][x] = 254;
Map[y+1][x] = ' ';
showMap();
clearScreen();
Sleep(FPS);
break;
}
case 'X':
{
health--;
break;
}
case '!':
{
Map[y][x] = ' ';
x = 1;
y = 1;
Map[y][x] = 254;
setupObstacles();
setupMoney();
level++;
break;
}
case '$':
{
score += 50;
y--;
Map[y][x] = 254;
Map[y+1][x] = ' ';
showMap();
clearScreen();
}
}
}
break;
}
case 'X':
{
health--;
break;
}
case '!':
{
Map[y][x] = ' ';
x = 1;
y = 1;
Map[y][x] = 254;
setupObstacles();
setupMoney();
break;
}
case '$':
{
score += 50;
y--;
Map[y][x] = 254;
Map[y+1][x] = ' ';
}
}
}
else if(GetAsyncKeyState(VK_DOWN))
{
switch(Map[y+1][x])
{
case ' ':
{
for(int i = 0; i < rand() % 5 + 2; i++)
{
switch(Map[y+1][x])
{
case ' ':
{
y++;
Map[y][x] = 254;
Map[y-1][x] = ' ';
showMap();
clearScreen();
Sleep(FPS);
break;
}
case 'X':
{
health--;
break;
}
case '!':
{
Map[y][x] = ' ';
x = 1;
y = 1;
Map[y][x] = 254;
setupObstacles();
setupMoney();
level++;
break;
}
case '$':
{
score += 50;
y++;
Map[y][x] = 254;
Map[y-1][x] = ' ';
showMap();
clearScreen();
}
}
}
break;
}
case 'X':
{
health--;
break;
}
case '!':
{
Map[y][x] = ' ';
x = 1;
y = 1;
Map[y][x] = 254;
setupObstacles();
setupMoney();
break;
}
case '$':
{
score += 50;
y++;
Map[y][x] = 254;
Map[y-1][x] = ' ';
}
}
}
else if(GetAsyncKeyState(VK_LEFT))
{
switch(Map[y][x-1])
{
case ' ':
{
for(int i = 0; i < rand() % 5 + 2; i++)
{
switch(Map[y][x-1])
{
case ' ':
{
x--;
Map[y][x] = 254;
Map[y][x+1] = ' ';
showMap();
clearScreen();
Sleep(FPS);
break;
}
case 'X':
{
health--;
break;
}
case '!':
{
Map[y][x] = ' ';
x = 1;
y = 1;
Map[y][x] = 254;
setupObstacles();
setupMoney();
level++;
break;
}
case '$':
{
score += 50;
x--;
Map[y][x] = 254;
Map[y][x+1] = ' ';
showMap();
}
}
}
break;
}
case 'X':
{
health--;
break;
}
case '!':
{
Map[y][x] = ' ';
x = 1;
y = 1;
Map[y][x] = 254;
setupObstacles();
setupMoney();
level++;
break;
}
case '$':
{
score += 50;
x--;
Map[y][x] = 254;
Map[y][x+1] = ' ';
}
}
}
else if(GetAsyncKeyState(VK_RIGHT))
{
switch(Map[y][x+1])
{
case ' ':
{
for(int i = 0; i < rand() % 5 + 2; i++)
{
switch(Map[y][x+1])
{
case ' ':
{
x++;
Map[y][x] = 254;
Map[y][x-1] = ' ';
showMap();
clearScreen();
Sleep(FPS);
break;
}
case 'X':
{
health--;
break;
}
case '!':
{
Map[y][x] = ' ';
x = 1;
y = 1;
Map[y][x] = 254;
setupObstacles();
setupMoney();
level++;
break;
}
case '$':
{
score += 50;
x++;
Map[y][x] = 254;
Map[y][x-1] = ' ';
showMap();
clearScreen();
}
}
}
break;
}
case 'X':
{
health--;
break;
}
case '!':
{
Map[y][x] = ' ';
x = 1;
y = 1;
Map[y][x] = 254;
setupObstacles();
setupMoney();
level++;
break;
}
case '$':
{
score += 50;
x++;
Map[y][x] = 254;
Map[y][x-1] = ' ';
}
}
}
showMap();
putchar('\n');
printf("Health: %i", health);
putchar('\n');
printf("Lives: ", lives);
putchar('\n');
printf("Score: %i", score);
putchar('\n');
printf("Level: %i", level);
Sleep(FPS);
clearScreen();
continue;
}
return 0;
}

0

Решение

Я не могу запустить вашу программу, но из того, что я вижу, вы на самом деле никогда не очищаете экран, вы просто пишете поверх старых данных, но поскольку вы не выписываете целые строки, любые старые данные, которые могут все равно быть на экране волшебным образом не исчезнет, ​​если вы не перезапишите его.

Поставьте пробелы после% i, и я уверен, что ваша проблема исчезнет. Попробуйте это вместо этого:

    printf("Health: %i         ", health);

Вы хотели бы делать такие вещи в каждой строке, где они не всегда записывают одинаковое количество столбцов.

Кроме того, почему бы вам не поставить новую строку в printf вместо того, чтобы в последующем putchar?

    printf("Health: %i         \n", health);
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]