作者softwind (software everywhere)
看板C_and_CPP
标题Re: [问题] switch 的case 一定要常数??
时间Sat May 23 22:20:41 2009
※ 引述《AGanPTT (阿干)》之铭言:
: 如题
: 我写了一个小游戏
: 我本来都用
: #define Up 'H'
: switch( Input )
: case Up:
: dosomething();
: break;
: ...................
: 我想写出能让玩家自己选择要哪些键当作上下左右等等...
: 我试过int Up = 'H';
: 但switch的case compile都不会过
: 只有const int Up = 'H';才会过
: 要如何才能写出更改按键
: 用if...else???
typedef void (*T_fp_action)();
typedef struct{
char Key; //按键
T_fp_action Action; //作啥动作?
}T_key_action;
//定义你的动作 here
void goLeft() { /* ... */ }
void goRight() { /* ... */ }
void goForward( { /* ... */ }
void goBack() { /* ... */ }
// 建立你的table
static T_key_action lookup_table[]={
{'w', goForward},
{'s', goBack},
{'a', goLeft},
{'d', goRight},
};
static bool b_table_inited=false;
// 封装你的table,
#define _INNER_USE_
_INNER_USE_ static int _cmp_with_key_ (const void* pl, const void* pr){
return ((T_key_action*)pl)->Key - ((T_key_action*)pr)->Key;
}
_INNER_USE_ static void sortTable(){
qsort( loop_table,
sizeof(lookup_table)/sizeof(lookup_table[0]),
sizeof(lookup_table[0]),
_cmp_with_key );
}
// 提供针对table 专用的 API
#define _EXT_USE_
_EXT_USE_ T_fp_action* searchAction(const char KEY){
if( b_table_inited==false ) {
sortTable();
b_table_inited=true;
}
T_fp_action fp=bsearch(&KEY, lookup_table,
sizeof(lookup_table)/sizeof(lookup_table[0]),
sizeof(T_key_action),
_cmp_with_key);
return (fp==0)?(0):(fp->Action);
}
// how to use
int main(){
char key=(-1);
while( scanKey(&key) ){
T_fp_action* fp = search(key);
if(fp==0) continue; //不是你有定义的key
fp();
}
return 0;
}
orz ... WHY? 我连review 都觉得痛苦...
比较:
如果使用 array来get func_ptr 复杂度 O(1);
但是缺点是 (可能会)浪费空间! 因为 array 必须连续
但事 不一定 每个key 都会有相对应动作
我写的是用 pair< key, value>的方式
配合 qsort+bsearch 让复杂度 变成 O(logN)
但是 不会浪费不需要的空间
done. so 看看搂
ps. 纯C适用
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 118.166.122.157
※ 编辑: softwind 来自: 118.166.117.186 (05/24 00:44)
1F:推 AGanPTT:C++不行?? 如果要定义再CLASS里怎麽设定初值 05/24 01:10
2F:→ AGanPTT:我今天有试着去写看看 但一直COMPILE错误 05/24 01:11
3F:推 legnaleurc:C++更简单啊...直接用map就好了 05/24 01:57
4F:推 AGanPTT:呵呵 就是不会用MAP= = 等考试过後来研究研究好了 05/24 03:00
5F:→ softwind:我没有说C++不能用阿 但是C++可以提供更好的技巧 05/24 04:07