所以我想在屏幕上显示具有特定坐标的对象并使它能够移动。例如,如果按下“ 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的多维数据集;无论我按什么,它都会闪烁,向我显示处于同一位置的“玩家”。 你们能告诉我什么是问题吗?
答案 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?