Project1

标题: 菜鸟求教,关于这段代码 [打印本页]

作者: 寒冷魔王    时间: 2014-12-27 20:39
标题: 菜鸟求教,关于这段代码
本帖最后由 寒冷魔王 于 2014-12-27 22:42 编辑

CPP 代码复制
  1. // 在主空间:
  2. #include <conio.h>
  3. enum Key { up = 72, down = 80, left = 75, right = 77, esc = 27, enter = 13 };
  4. // 在某一函数内部:
  5. enum Key move;
  6. for (char key = _getch();; key = _getch())
  7. {
  8.         if (key == Key::up || key == Key::down || key == Key::left || key == Key::right)
  9.         {
  10.                 move = static_cast<Key>(key);
  11.                 break;
  12.         }
  13.         else if() {} // 还有其他判断
  14. }

我怎么总感觉写得繁琐了。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 编辑

差不多是这样?
CPP 代码复制
  1. char key;
  2. while(true){
  3.     key = getch();
  4.     switch(key){
  5.         case up:
  6.         case down:
  7.         case left:
  8.         case right:
  9.         // do something
  10.             break;
  11.         case esc:
  12.         // do something
  13.             break;
  14.     }
  15. }

利用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 里的东西判断的。想要跨平台的话,考 ...

CPP 代码复制
  1. enum Key move;
  2. for (;;)
  3. {
  4.         char key = _getch();
  5.         if (key == Key::up || key == Key::down || key == Key::left || key == Key::right)
  6.         {
  7.                 move = static_cast<Key>(key);
  8.                 break;
  9.         }
  10.         else if() {} // 还有其他判断
  11. }

感觉上在循环里每次初始化貌似影响效率
作者: yagami    时间: 2014-12-27 22:04
本帖最后由 yagami 于 2014-12-27 22:06 编辑
寒冷魔王 发表于 2014-12-27 21:57
enum Key move;
for (;;)
{


goto 做大死 要打断随便加个defult 里作点事情就行比如
CPP 代码复制
  1. char key;
  2. while(1){
  3.     key = getch();
  4.     switch(key){
  5.         case (char)Key::up: //编译器严格得话 可能要强转
  6.         case Key::down:
  7.         case Key::left:
  8.         case Key::right:
  9.         // do something
  10.             break;
  11.         case esc:
  12.         // do something
  13.             break;
  14.         default:
  15.             key = -1;
  16.     };
  17.     if(key!=-1)
  18.         break;
  19. }

作者: 寒冷魔王    时间: 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,这样改
CPP 代码复制
  1. for (char key = 0; key == 0;)
  2. {
  3.         key = _getch();
  4.         switch (key)
  5.         {
  6.         case (char)Key::up: //编译器严格得话 可能要强转
  7.         case Key::down:
  8.         case Key::left:
  9.         case Key::right:
  10.                 // do something
  11.                 break;
  12.         case esc:
  13.                 // do something
  14.                 break;
  15.         default:
  16.                 key = 0;
  17.         }
  18. }


但是总感觉用switch行数略多

作者: 寒冷魔王    时间: 2014-12-27 22:39
还是不用switch了,用switch显得乱,而且代码字节数一比还多许多
主要是esc和enter判断比较长,用switch反而不如else if




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1