Project1
标题: 菜鸟求教,关于这段代码 [打印本页]
作者: 寒冷魔王 时间: 2014-12-27 20:39
标题: 菜鸟求教,关于这段代码
本帖最后由 寒冷魔王 于 2014-12-27 22:42 编辑
// 在主空间:
#include <conio.h>
enum Key { up = 72, down = 80, left = 75, right = 77, esc = 27, enter = 13 };
// 在某一函数内部:
enum Key move;
for (char key = _getch();; key = _getch())
{
if (key == Key::up || key == Key::down || key == Key::left || key == Key::right)
{
move = static_cast<Key>(key);
break;
}
else if() {} // 还有其他判断
}
// 在主空间:
#include <conio.h>
enum Key { up = 72, down = 80, left = 75, right = 77, esc = 27, enter = 13 };
// 在某一函数内部:
enum Key move;
for (char key = _getch();; key = _getch())
{
if (key == Key::up || key == Key::down || key == Key::left || key == Key::right)
{
move = static_cast<Key>(key);
break;
}
else if() {} // 还有其他判断
}
我怎么总感觉写得繁琐了。C++有没有比较简便的写法?(在不影响效率的前提下)
另外:
conio.h据说是Win的库,有没有C++的标准函数达到_getch()的目的?(查了半天没查到)
注:IDE:VS2013,我希望写一段通用的代码,可以普遍地运行在Linux等系统上。
还是不用switch了,用switch显得乱,而且代码字节数一比还多许多。
主要是esc和enter判断比较长,用switch反而不如else if。
另:
何故?
求救:精通C系者R君 全能大触T君
作者: taroxd 时间: 2014-12-27 21:13
本帖最后由 taroxd 于 2014-12-27 21:40 编辑
要跨平台的一套通用代码还是比较麻烦的吧。Linux 上大概是用 input.h 里的东西判断的。想要跨平台的话,考虑用宏来判断平台怎么样?
conio.h 也好,Windows API 也好,都直接用上吧,没关系的。
P.S. 其实我不是全能大触。我也不是很懂这些。
P.S.2 那个 for 循环和 while(true) 没什么区别吧……
作者: RyanBern 时间: 2014-12-27 21:17
本帖最后由 RyanBern 于 2014-12-27 21:22 编辑
差不多是这样?
char key;
while(true){
key = getch();
switch(key){
case up:
case down:
case left:
case right:
// do something
break;
case esc:
// do something
break;
}
}
char key;
while(true){
key = getch();
switch(key){
case up:
case down:
case left:
case right:
// do something
break;
case esc:
// do something
break;
}
}
利用switch-case结构可能更简单些,利用不写break的贯穿结构,比if稍稍好点。
另外我也是没找到标准库里面和getch功能相同的函数,好久不用这个东西都快忘了的说……
作者: 寒冷魔王 时间: 2014-12-27 21:45
本帖最后由 寒冷魔王 于 2014-12-27 21:54 编辑
RyanBern 发表于 2014-12-27 21:17
差不多是这样?
char key;
对啊,我都忘了这个啦
另外这个提示错误不知为何
还有那个while循环= =你的break貌似不能打断吧
貌似需要goto
作者: 寒冷魔王 时间: 2014-12-27 21:57
taroxd 发表于 2014-12-27 21:13
要跨平台的一套通用代码还是比较麻烦的吧。Linux 上大概是用 input.h 里的东西判断的。想要跨平台的话,考 ...
enum Key move;
for (;;)
{
char key = _getch();
if (key == Key::up || key == Key::down || key == Key::left || key == Key::right)
{
move = static_cast<Key>(key);
break;
}
else if() {} // 还有其他判断
}
enum Key move;
for (;;)
{
char key = _getch();
if (key == Key::up || key == Key::down || key == Key::left || key == Key::right)
{
move = static_cast<Key>(key);
break;
}
else if() {} // 还有其他判断
}
感觉上在循环里每次初始化貌似影响效率
作者: yagami 时间: 2014-12-27 22:04
本帖最后由 yagami 于 2014-12-27 22:06 编辑
寒冷魔王 发表于 2014-12-27 21:57
enum Key move;
for (;;)
{
goto 做大死 要打断随便加个defult 里作点事情就行比如char key;
while(1){
key = getch();
switch(key){
case (char)Key::up: //编译器严格得话 可能要强转
case Key::down:
case Key::left:
case Key::right:
// do something
break;
case esc:
// do something
break;
default:
key = -1;
};
if(key!=-1)
break;
}
char key;
while(1){
key = getch();
switch(key){
case (char)Key::up: //编译器严格得话 可能要强转
case Key::down:
case Key::left:
case Key::right:
// do something
break;
case esc:
// do something
break;
default:
key = -1;
};
if(key!=-1)
break;
}
作者: 寒冷魔王 时间: 2014-12-27 22:27
本帖最后由 寒冷魔王 于 2014-12-27 22:30 编辑
yagami 发表于 2014-12-27 22:04
goto 做大死 要打断随便加个defult 里作点事情就行比如char key;
while(1){
key = getch();
谢谢~我喜欢用for,这样改
for (char key = 0; key == 0;)
{
key = _getch();
switch (key)
{
case (char)Key::up: //编译器严格得话 可能要强转
case Key::down:
case Key::left:
case Key::right:
// do something
break;
case esc:
// do something
break;
default:
key = 0;
}
}
for (char key = 0; key == 0;)
{
key = _getch();
switch (key)
{
case (char)Key::up: //编译器严格得话 可能要强转
case Key::down:
case Key::left:
case Key::right:
// do something
break;
case esc:
// do something
break;
default:
key = 0;
}
}
但是总感觉用switch行数略多
作者: 寒冷魔王 时间: 2014-12-27 22:39
还是不用switch了,用switch显得乱,而且代码字节数一比还多许多
主要是esc和enter判断比较长,用switch反而不如else if
欢迎光临 Project1 (https://rpg.blue/) |
Powered by Discuz! X3.1 |