在控制台C ++中移动一个数字

时间:2017-01-19 15:43:27

标签: c++

我正在编写一个程序,它应该在控制台中打印由ASCII字符组成的"X',改变大小并允许用键移动它。我知道如何打印这个X并改变尺寸,但我完全卡住了,我不知道如何移动它。

#include <iostream>
#include <conio.h>
#include <Windows.h>

void Intro();
void Draw();

const int Esc = 27;

int main()
{
Intro();
Draw();

return 0;
}

void Intro()
{
std::cout << "Napisz program rysowania znakiem ponizszej figury:\n";
std::cout << "    *    * \n";
std::cout << "     *  *  \n";
std::cout << "      *    \n";
std::cout << "     *  *  \n";
std::cout << "    *    * \n";

std::cout << std::endl;

std::cout << "Program powinien umozliwiac:\n"
    << " - Wybor znaku kodu ASII,\n"
    << " - Wczytanie poczatkowych rozmiarow figury,\n"
    << " - Zmiane wielkosci figury klawiszami '+' i '-',\n"
    << " - Przesuwanie figury w czterech kierunkach za pomoca kursorow,\n"
    << " - Ograniczenie przesuwania i rozmiarow figury do obszaru ekranu.\n";

_getch();

return;
}

void Draw()
{
int Size;
char AsciiChar;
char Tab[50][80];
int AsciiCharPosX = 0;
int AsciiCharPosY = 0;
char Key;

system("cls");

std::cout << "Enter the size: ";
std::cin >> Size;
std::cout << std::endl;
std::cout << "Enter the ASCII char from the keyboard: ";
std::cin >> AsciiChar;
std::cout << std::endl;

for (int i = 0; i < Size; i++)
{
    for (int j = 0; j < Size; j++)
    {
        Tab[i][j] = 'e';                                    // e - empty field
    }
}
Tab[AsciiCharPosX][AsciiCharPosY] = 'f';                    //f - filled

do
{
    system("cls");

    for (int Rows = 1; Rows <= Size; Rows++)
    {
        for (int Cols = 1; Cols <= Size; Cols++)
        {
            if (Rows == Cols || Cols == (Size + 1) - Rows)
            {
                Tab[Rows][Cols] = 'f';
                if (Tab[Rows][Cols] == 'f')
                {
                    std::cout << AsciiChar;
                }
            }
            else
            {
                Tab[Rows][Cols] = 'e';
                if (Tab[Rows][Cols] == 'e')
                {
                    std::cout << " ";
                }
            }
        }
        std::cout << std::endl;
    }

    Key = _getch();

    switch (Key)
    {
    case '+':
    {
        Size = Size + 2;
        break;
    }
    case '-':
    {
        Size = Size - 2;
        break;
    }
    case 's':
    {
        AsciiCharPosY++;
        break;
    }
    case 'w':
    {
        AsciiCharPosY--;
        break;
    }
    case 'a':
    {
        AsciiCharPosX--;
        break;
    }
    case 'd':
    {
        AsciiCharPosX++;
        break;
    }
    }
} while (Key != Esc);

    return;
}

1 个答案:

答案 0 :(得分:0)

要移动它,您需要遵循以下两种方法之一:

控制台控制

编写可以发送控制台选择的特殊字符的代码,意味着特殊的东西,如移动光标更改颜色等。最常见的方法是使用库为此,像libncurses。请注意,这在很大程度上取决于您使用的控制台,并且您需要根据该控制台查找要使用的代码或库。

伪造

您可以通过简单地重写整个屏幕来填充所需的更改并希望您的受害者(用户)不会向上滚动以查看正在发生的事情来伪造它。

在这两种情况下,您都需要在步骤(框架)中写出更改,您将通过了解animation获益。

祝你好运!