#c #cmd
#c #cmd
Вопрос:
Предполагается, что в этой программе есть карта, состоящая из точек, и игрок, которого вы можете перемещать.
Но когда я однажды открыл эту программу, текст мерцал и двигался вверх и вниз.
Он использует Windows.h для перерисовки на консоли без мерцания и для скрытия курсора
Нужно ли что-то делать со свойствами cmd, кодом или заголовочным файлом Windows.h?
#include <iostream>
#include <conio.h>
#include <Windows.h>
char map[1000][1000];
int width = 100;
int height = 10;
char Tmt = '.';
void cls()
{
COORD cursorPosition;
cursorPosition.X = 0;
cursorPosition.Y = 0;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), cursorPosition);
}
void hidcur()
{
HANDLE consoleHandle = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_CURSOR_INFO info;
info.dwSize = 100;
info.bVisible = FALSE;
SetConsoleCursorInfo(consoleHandle, amp;info);
}
class Player {
public:
int x;
int y;
char sym;
void Draw()
{
map[x][y] = sym;
}
void Logic()
{
if (x < 1) { x ; }
if (y < 1) { y ; }
if (x > width) { x--; }
if (y > height) { y--; }
}
void Input()
{
if (_kbhit())
{
switch (_getch())
{
case 'w':
map[x][y] = Tmt;
y--;
break;
case 'a':
map[x][y] = Tmt;
x--;
break;
case 's':
map[x][y] = Tmt;
y ;
break;
case 'd':
map[x][y] = Tmt;
x ;
break;
case 'p':
system("cls");
break;
}
}
}
void PrintPos()
{
printf("Pos:n");
if (x >= 10) { printf(" %dn", x); }
else { printf(" 0%dn", x); }
if (y >= 10) { printf(" %dn", y); }
else { printf(" 0%dn", y); }
}
};
Player player1;
void Setup()
{
player1.x = 2;
player1.y = 2;
player1.sym = '@';
player1.Draw();
player1.Logic();
for (int mapsui = 1; mapsui <= width; mapsui )
{
for (int mapsuj = 1; mapsuj <= height; mapsuj )
{
map[mapsui][mapsuj] = Tmt;
}
}
}
void DrawMap()
{
player1.PrintPos();
printf("nnn");
for (int drawi = 1; drawi <= width; drawi )
{
for (int drawj = 1; drawj <= height; drawj )
{
printf("%c", map[drawj][drawi]);
}
printf("n");
}
}
int main()
{
Setup();
while (1)
{
DrawMap();
player1.Input();
player1.Logic();
player1.Draw();
cls();
hidcur();
}
return 0;
}
Ответ №1:
В методе DrawMap, когда у вас есть два цикла for , вы проверяете ширину во внешнем цикле и высоту во внутреннем цикле, в то время как должно быть наоборот. Обратите внимание, что внешний цикл контролирует количество строк, и поскольку вы ограничиваете его шириной (100), вы отображаете 100 строк, большинство из которых пустые, потому что программа установки просто инициализирует 10 строк. Поскольку в окне командной строки отображается меньше строк (я думаю, что по умолчанию это около 30 или что-то в этом роде), карта увеличивается, и это приводит к мерцанию, которое вы видите. Это должно быть:
for (int drawi = 1; drawi <= height; drawi )
{
for (int drawj = 1; drawj <= width; drawj )
{
printf("%c", map[drawj][drawi]);
}
printf("n");
}
Обратите внимание, что при настройке вы также используете циклы таким образом (внешний цикл проверяет ширину, а внутренний цикл проверяет высоту), но в этом случае вы позже используете индексы для карты наоборот (сначала i, а затем j), что приводит к правильной инициализации карты (10 строк по 100 столбцов).