作者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)
推 AGanPTT:C++不行?? 如果要定義再CLASS裡怎麼設定初值 05/24 01:10
→ AGanPTT:我今天有試著去寫看看 但一直COMPILE錯誤 05/24 01:11
推 legnaleurc:C++更簡單啊...直接用map就好了 05/24 01:57
推 AGanPTT:呵呵 就是不會用MAP= = 等考試過後來研究研究好了 05/24 03:00
→ softwind:我沒有說C++不能用阿 但是C++可以提供更好的技巧 05/24 04:07