设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 1997|回复: 7
打印 上一主题 下一主题

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

[复制链接]

Lv3.寻梦者

梦石
0
星屑
1024
在线时间
1389 小时
注册时间
2010-8-9
帖子
3471
跳转到指定楼层
1
发表于 2014-12-27 20:39:42 | 只看该作者 |只看大图 回帖奖励 |正序浏览 |阅读模式

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

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

x
本帖最后由 寒冷魔王 于 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君  
SRPG on RM 项目研发组 正式成立。目前SRPG·RMVA系统进度88.8%。SMRC Kernel 进度90%
↖(^ω^)↗热烈庆祝~SMRC Ver5.1 SRPG战棋地图移动范围生成脚本正式发布~~
-----------------------------------------------------------------------------------------
SMRC具有高性能、高兼容、定制自由、使用方便的特点。
1.性能,100移动力轻松算出,无压力;
2.兼容,RGSS1-3通吃,效率保证;
3.支持移动形状定制,支持4方位、6方位、正方形或其他任意有移动规律的形状;
4.可以充当高性能寻路来使用。
【链接点此】
-----------------------------------------------------------------------------------------
【2016/01/06更新 | 改版】RM脚本编辑器Gemini
-----------------------------------------------------------------------------------------

Lv3.寻梦者

梦石
0
星屑
1024
在线时间
1389 小时
注册时间
2010-8-9
帖子
3471
8
 楼主| 发表于 2014-12-27 22:39:55 | 只看该作者
还是不用switch了,用switch显得乱,而且代码字节数一比还多许多
主要是esc和enter判断比较长,用switch反而不如else if
SRPG on RM 项目研发组 正式成立。目前SRPG·RMVA系统进度88.8%。SMRC Kernel 进度90%
↖(^ω^)↗热烈庆祝~SMRC Ver5.1 SRPG战棋地图移动范围生成脚本正式发布~~
-----------------------------------------------------------------------------------------
SMRC具有高性能、高兼容、定制自由、使用方便的特点。
1.性能,100移动力轻松算出,无压力;
2.兼容,RGSS1-3通吃,效率保证;
3.支持移动形状定制,支持4方位、6方位、正方形或其他任意有移动规律的形状;
4.可以充当高性能寻路来使用。
【链接点此】
-----------------------------------------------------------------------------------------
【2016/01/06更新 | 改版】RM脚本编辑器Gemini
-----------------------------------------------------------------------------------------
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1024
在线时间
1389 小时
注册时间
2010-8-9
帖子
3471
7
 楼主| 发表于 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,这样改
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行数略多
SRPG on RM 项目研发组 正式成立。目前SRPG·RMVA系统进度88.8%。SMRC Kernel 进度90%
↖(^ω^)↗热烈庆祝~SMRC Ver5.1 SRPG战棋地图移动范围生成脚本正式发布~~
-----------------------------------------------------------------------------------------
SMRC具有高性能、高兼容、定制自由、使用方便的特点。
1.性能,100移动力轻松算出,无压力;
2.兼容,RGSS1-3通吃,效率保证;
3.支持移动形状定制,支持4方位、6方位、正方形或其他任意有移动规律的形状;
4.可以充当高性能寻路来使用。
【链接点此】
-----------------------------------------------------------------------------------------
【2016/01/06更新 | 改版】RM脚本编辑器Gemini
-----------------------------------------------------------------------------------------
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
3570
在线时间
3064 小时
注册时间
2011-11-17
帖子
980
6
发表于 2014-12-27 22:04:57 | 只看该作者
本帖最后由 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. }

评分

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

查看全部评分

回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1024
在线时间
1389 小时
注册时间
2010-8-9
帖子
3471
5
 楼主| 发表于 2014-12-27 21:57:44 | 只看该作者
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. }

感觉上在循环里每次初始化貌似影响效率
SRPG on RM 项目研发组 正式成立。目前SRPG·RMVA系统进度88.8%。SMRC Kernel 进度90%
↖(^ω^)↗热烈庆祝~SMRC Ver5.1 SRPG战棋地图移动范围生成脚本正式发布~~
-----------------------------------------------------------------------------------------
SMRC具有高性能、高兼容、定制自由、使用方便的特点。
1.性能,100移动力轻松算出,无压力;
2.兼容,RGSS1-3通吃,效率保证;
3.支持移动形状定制,支持4方位、6方位、正方形或其他任意有移动规律的形状;
4.可以充当高性能寻路来使用。
【链接点此】
-----------------------------------------------------------------------------------------
【2016/01/06更新 | 改版】RM脚本编辑器Gemini
-----------------------------------------------------------------------------------------
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1024
在线时间
1389 小时
注册时间
2010-8-9
帖子
3471
4
 楼主| 发表于 2014-12-27 21:45:04 | 只看该作者
本帖最后由 寒冷魔王 于 2014-12-27 21:54 编辑
RyanBern 发表于 2014-12-27 21:17
差不多是这样?

char key;


对啊,我都忘了这个啦
另外这个提示错误不知为何

还有那个while循环= =你的break貌似不能打断吧
貌似需要goto

点评

明白了,谢了  发表于 2014-12-28 09:59
那就要看你具体的功能了,switch-case比if好的原因是因为只需做一次判断然后在跳转,如果用if的话就要判断很多次。另外goto不要用  发表于 2014-12-28 09:29
SRPG on RM 项目研发组 正式成立。目前SRPG·RMVA系统进度88.8%。SMRC Kernel 进度90%
↖(^ω^)↗热烈庆祝~SMRC Ver5.1 SRPG战棋地图移动范围生成脚本正式发布~~
-----------------------------------------------------------------------------------------
SMRC具有高性能、高兼容、定制自由、使用方便的特点。
1.性能,100移动力轻松算出,无压力;
2.兼容,RGSS1-3通吃,效率保证;
3.支持移动形状定制,支持4方位、6方位、正方形或其他任意有移动规律的形状;
4.可以充当高性能寻路来使用。
【链接点此】
-----------------------------------------------------------------------------------------
【2016/01/06更新 | 改版】RM脚本编辑器Gemini
-----------------------------------------------------------------------------------------
回复 支持 反对

使用道具 举报

Lv4.逐梦者 (版主)

梦石
0
星屑
9532
在线时间
5073 小时
注册时间
2013-6-21
帖子
3580

开拓者贵宾剧作品鉴家

3
发表于 2014-12-27 21:17:27 | 只看该作者
本帖最后由 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功能相同的函数,好久不用这个东西都快忘了的说……
回复 支持 反对

使用道具 举报

Lv3.寻梦者 (版主)

…あたしは天使なんかじゃないわ

梦石
0
星屑
2208
在线时间
4033 小时
注册时间
2010-10-4
帖子
10779

开拓者贵宾

2
发表于 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) 没什么区别吧……
回复 支持 反对

使用道具 举报

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

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-10-3 21:25

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表