C_and_CPP 板


LINE

※ 引述《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







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:BabyMother站内搜寻

TOP