协调屏幕上的对象

时间:2019-05-25 14:09:05

标签: c++ visual-studio visual-c++

所以我想在屏幕上显示具有特定坐标的对象并使它能够移动。例如,如果按下“ u”,它将上升,依此类推。因此,我尝试使用变量X和Y(初始化为0),并在“清除屏幕”之后使用for循环部署对象。所以检查一下:

#include <iostream>
#include <conio.h>
#include <cstdlib>
#include <vector>
#include <iomanip>
using namespace std;
char input;
char player = 1;
char keyup = 0x48, keydown = 0x50, keyright = 0x4d, keyleft = 0x4b;
int x = 0, y = 0;
void position()
{
    for (int start = 0; start <= y; start++)
    {
        cout << "\n";
    }
    for (int start = 0; start <= x; start++)
    {
        cout << " ";
    }
    cout << player;
}
void moveup()
{
    x - 1;
    system("cls");
    position();
}
void movedown()
{
    y + 1;
    system("cls");
    position();
}
void moveright()
{
    x + 1;
    system("cls");
    position();
}
void moveleft()
{
    y - 1;
    system("cls");
    position();
}
int main()
{
    while (1)
    {
        position();
        cin >> input;
        if (input == keyup) moveup();
        if (input == keydown) movedown();
        if (input == keyright) moveright();
        if (input == keyleft) moveleft();
        system("cls");
    }
}

因此,当我运行它时,它仅向我显示ASCII键= 1的多维数据集;无论我按什么,它都会闪烁,向我显示处于同一位置的“玩家”。 你们能告诉我什么是问题吗?

2 个答案:

答案 0 :(得分:1)

首先,我建议使用字符文字而不是数值:

char const keyup = 'u';
//    ^ they are constants, aren't they???

0不是可打印字符,因此将其用作symbol不会在屏幕上打印任何内容...您可以使用e。 G。改为'+'

然后,您将在函数中重复很多代码。您实际需要的只是一种打印功能。像这样:

void update()
{
    system("cls");
    for(int i = 0; i < y; ++i)
        std::cout << '\n'; // navigate to appropriate line

    for(int i = 0; i < x; ++i)
        std::cout << ' '; // navigate to column

    std::cout << symbol << std::endl; // endl flashes buffer, too
}

您可以使用它来将符号打印到当前位置(x / y)。在输入时,您只需要修改坐标(我个人建议使用switch语句而不是if / else链):

std::cin >> input;
switch(input)
{
case keyup: // NEEDS to be a constant to be used that way!
    --y;
    break;
case keydown:
    ++y;
    break;
case keyleft:
    --x;
    break;
case keyright:
    ++x;
    break;
default: // catch invalid user input
    // if you have, appropriate error handling – or just ignore
    break;      
}

可以排除一个空的默认 –但是,总是捕获无效案例是一个好习惯。

最后:第二次清除屏幕(在if / else链之后)将再次清空屏幕,之前用户可能没有看到任何东西。随便吧。总计:

for(;;)
{
    update(); // first screen update and returning here in every loop
    std::cin >> input;
    switch(input)
    {
    // ...
    case ExitKey: // recommend to add it!
        // the only disadvantage of switch: cannot use 'break' to exit loop!
        goto LOOP_END;
    default:
        break;
    }
}
LOOP_END:
// clean up application
return 0; // exit main...

上面我还没有提到的一件事,但非常很重要:范围检查!在增加或减少其中一个坐标之前,您需要检查一下是否可以:

if(x > 0)
    --x;

或者我个人喜欢的变体:

y += y < SCREEN_HEIGHT; // needs to be defined appropriately...

关于屏幕尺寸:this可能很有趣...

答案 1 :(得分:0)

所以改进后的代码如下:

#include <iostream>
#include <conio.h>
#include <cstdlib>
#include <vector>
#include <iomanip>
using namespace std;
char input;
char player = 1;
const char keyup = 'u', keydown = 'd', keyright = 'r', keyleft = 'l', Exitkey = 'k';
int x = 0, y = 0;
void space()
{
    for (int start = 0; start < 7; start++)
    {
        cout << "\n";
    }
}
void update()
{
    system("cls");
    for (int i = 0; i < y; ++i)
    cout << '\n'; 

    for (int i = 0; i < x; ++i)
    cout << ' ';
    cout << player << endl;
}
void inputfunc()
{
    cin >> input; 
    switch (input)
    {
    case keyup:
        if (y = 0)
        {
            y = 0;
        }
        else --y;
        goto endloop;
    case keydown:
        ++y;
        goto endloop;
    case keyleft:
        if (x = 0)
        {
            x = 0;
        }
        else --x;
        goto endloop;
    case keyright:
        ++x;
        goto endloop;
    case Exitkey:
        goto endloop;
    default:
        break;
    }
endloop:;
}
int main()
{
    for (;;)
    {
        update();
        space();
        inputfunc();
    }
}

还有另一件事:输入一个字符后,我不知道如何自动使它继续。我需要输入尽可能多的字符,然后按Enter部署播放器。如何执行Scheff?