查看: 2425|回复: 7

[已经过期] 菜鸟求教,关于这段代码

[复制链接]

寒

梦石
0
星屑
1049
在线时间
1391 小时
注册时间
2010-8-9
回帖
3301
发表于 2014-12-27 20:39:42 | 显示全部楼层 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有账号?注册会员

×
本帖最后由 寒冷魔王 于 2014-12-27 22:42 编辑

[pre lang="Cpp" line="1"]// 在主空间:
#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() {} // 还有其他判断
}[/pre]
我怎么总感觉写得繁琐了。C++有没有比较简便的写法?(在不影响效率的前提下)
另外:
conio.h据说是Win的库,有没有C++的标准函数达到_getch()的目的?(查了半天没查到)
注:IDE:VS2013,我希望写一段通用的代码,可以普遍地运行在Linux等系统上。

还是不用switch了,用switch显得乱,而且代码字节数一比还多许多。
主要是esc和enter判断比较长,用switch反而不如else if。
另: 快照1.png 何故?

求救:精通C系者R君  全能大触T君  

…あたしは天

梦石
0
星屑
2308
在线时间
4033 小时
注册时间
2010-10-4
回帖
10548

开拓者贵宾

发表于 2014-12-27 21:13:05 | 显示全部楼层
本帖最后由 taroxd 于 2014-12-27 21:40 编辑

要跨平台的一套通用代码还是比较麻烦的吧。Linux 上大概是用 input.h 里的东西判断的。想要跨平台的话,考虑用宏来判断平台怎么样?

conio.h 也好,Windows API 也好,都直接用上吧,没关系的。

P.S. 其实我不是全能大触。我也不是很懂这些。

P.S.2 那个 for 循环和 while(true) 没什么区别吧……
回复

使用道具 举报

梦石
0
星屑
9557
在线时间
5074 小时
注册时间
2013-6-21
回帖
3459

开拓者贵宾剧作品鉴家

发表于 2014-12-27 21:17:27 | 显示全部楼层
本帖最后由 RyanBern 于 2014-12-27 21:22 编辑

差不多是这样?
[pre lang="CPP"]
char key;
while(true){
    key = getch();
    switch(key){
        case up:
        case down:
        case left:
        case right:
        // do something
            break;
        case esc:
        // do something
            break;
    }
}[/pre]
利用switch-case结构可能更简单些,利用不写break的贯穿结构,比if稍稍好点。
另外我也是没找到标准库里面和getch功能相同的函数,好久不用这个东西都快忘了的说……
回复

使用道具 举报

寒

梦石
0
星屑
1049
在线时间
1391 小时
注册时间
2010-8-9
回帖
3301
 楼主| 发表于 2014-12-27 21:45:04 | 显示全部楼层
本帖最后由 寒冷魔王 于 2014-12-27 21:54 编辑
RyanBern 发表于 2014-12-27 21:17
差不多是这样?

char key;


对啊,我都忘了这个啦
另外这个提示错误不知为何
快照1.png
还有那个while循环= =你的break貌似不能打断吧
貌似需要goto

点评

明白了,谢了  发表于 2014-12-28 09:59
那就要看你具体的功能了,switch-case比if好的原因是因为只需做一次判断然后在跳转,如果用if的话就要判断很多次。另外goto不要用  发表于 2014-12-28 09:29
回复

使用道具 举报

寒

梦石
0
星屑
1049
在线时间
1391 小时
注册时间
2010-8-9
回帖
3301
 楼主| 发表于 2014-12-27 21:57:44 | 显示全部楼层
taroxd 发表于 2014-12-27 21:13
要跨平台的一套通用代码还是比较麻烦的吧。Linux 上大概是用 input.h 里的东西判断的。想要跨平台的话,考 ...

[pre lang="cpp" line="1"]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() {} // 还有其他判断
}[/pre]
感觉上在循环里每次初始化貌似影响效率
回复

使用道具 举报

梦石
0
星屑
3703
在线时间
3081 小时
注册时间
2011-11-17
回帖
943
发表于 2014-12-27 22:04:57 | 显示全部楼层
本帖最后由 yagami 于 2014-12-27 22:06 编辑
寒冷魔王 发表于 2014-12-27 21:57
enum Key move;
for (;;)
{


goto 做大死 要打断随便加个defult 里作点事情就行比如[pre lang="cpp" line="1"]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;
}[/pre]

评分

参与人数 1星屑 +60 收起 理由
RyanBern + 60 我很赞同

查看全部评分

回复

使用道具 举报

寒

梦石
0
星屑
1049
在线时间
1391 小时
注册时间
2010-8-9
回帖
3301
 楼主| 发表于 2014-12-27 22:27:41 | 显示全部楼层
本帖最后由 寒冷魔王 于 2014-12-27 22:30 编辑
yagami 发表于 2014-12-27 22:04
goto 做大死 要打断随便加个defult 里作点事情就行比如char key;
while(1){
    key = getch();


谢谢~我喜欢用for,这样改
[pre lang="cpp" line="1"]        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;
        }
}[/pre]

但是总感觉用switch行数略多
回复

使用道具 举报

寒

梦石
0
星屑
1049
在线时间
1391 小时
注册时间
2010-8-9
回帖
3301
 楼主| 发表于 2014-12-27 22:39:55 | 显示全部楼层
还是不用switch了,用switch显得乱,而且代码字节数一比还多许多
主要是esc和enter判断比较长,用switch反而不如else if
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部