[码农] 微软弹珠台是由巨型switch()语句组成

楼主: geminitea (维亚)   2025-09-08 16:15:16
https://reurl.cc/OmeMaR
以下内容转自脸书(连结如上)
https://files.catbox.moe/0pu43a.png
前几日微软工程师 Dave W Plummer 分享
当初微软推出新的作业系统 Windows NT 后
要把立体弹珠台 (Pinball) 这个内建游戏改写到新的作业系统
于是被交派这个任务的他看了原本的程式码
结果发现是一个超级巨型的 swtich() 语句
底下有超过五十个 case 所组成
作者: serding (累紧地们)   2025-09-08 16:16:00
不能乱动了
作者: SangoGO (隐世的外来人Lv.1)   2025-09-08 16:16:00
至少他还有用Switch而不是if else
作者: HJC6666 (帕修)   2025-09-08 16:16:00
switch也没很乱吧 总比把东西乱放好
作者: yezero (肥雁改)   2025-09-08 16:16:00
可以想像只是有点失望
作者: kirimaru73 (雾丸)   2025-09-08 16:17:00
很合理啊 都是用球去撞switch成五十块反而可以让每块的深度不要太深
作者: xga00mex (七祈绮契)   2025-09-08 16:17:00
然后发现第一个case永远为true
作者: StarTouching (抚星)   2025-09-08 16:18:00
巨型状态机 这不是很棒吗?
作者: h0103661 (路人喵)   2025-09-08 16:18:00
1993年欸,那个时候上课都在用组语
作者: HJC6666 (帕修)   2025-09-08 16:18:00
永远true更爽了 剩下49条砍掉都不怕出事= =
作者: h0103661 (路人喵)   2025-09-08 16:19:00
用switch已经是高阶语言了
作者: tnlinna (serena)   2025-09-08 16:19:00
好奇那个年代可以呈现出那样的弹珠弹跳感算是很厉害吗?那时有物理引擎之类的东西了?
作者: gino0717 (gino0717)   2025-09-08 16:19:00
那个谁跟你说你应该总是使用if else还出了本书
作者: piyan5566   2025-09-08 16:19:00
至少不是写成巢状if else
作者: kirimaru73 (雾丸)   2025-09-08 16:20:00
二维运动反弹加个重力 不算太复杂
作者: twosheep0603 (两羊)   2025-09-08 16:20:00
状态机 没有问题
作者: HolyBugTw (HolyBug)   2025-09-08 16:20:00
还有什么更好的写法吗?愿闻其详
作者: speedingriot (纯朴岛民)   2025-09-08 16:22:00
以弹珠台这例子来说,用switch没有什么不好吧?
作者: oyaji5566 (大叔56)   2025-09-08 16:22:00
if else if else if else if else if else if else
作者: Gwaewluin (神无月 孝臣)   2025-09-08 16:27:00
至少比全都if好很多了
作者: kirimaru73 (雾丸)   2025-09-08 16:27:00
这个案例写50个case或50个if else都算是合理用法
作者: StarTouching (抚星)   2025-09-08 16:27:00
任天堂又赢
作者: xxxzxcvb (阿........)   2025-09-08 16:28:00
不然要一堆if else 喔 最后的判断要把前面全都跑过
作者: xga00mex (七祈绮契)   2025-09-08 16:29:00
写到50我猜是用来判断撞到什么 现代可能写成物件吧
作者: kirimaru73 (雾丸)   2025-09-08 16:29:00
if else要判断的只有if里面的东西啊 switch一样要比较如果那50个东西被弹珠撞的反应有明显的树状结构
作者: xga00mex (七祈绮契)   2025-09-08 16:30:00
不过逻辑如果不复杂用switch也没差
作者: kirimaru73 (雾丸)   2025-09-08 16:30:00
那就会写成树状if else了 不过我也不是做这游戏的
作者: yezero (肥雁改)   2025-09-08 16:31:00
只是在这里听到switch这种程设课前几堂就学到的东西觉得有点奇怪而已。身为微软的程式猿没有更神奇的写法吗…
作者: kirimaru73 (雾丸)   2025-09-08 16:31:00
如果处理50种碰撞都是相异的小事 那并列没什么问题
作者: xga00mex (七祈绮契)   2025-09-08 16:31:00
能写的简单干嘛复杂化
作者: kirimaru73 (雾丸)   2025-09-08 16:32:00
弹珠台本身就是个贴图碰撞游戏 不管你是要显示外观还是要处理弹珠碰撞 switch和if else都是最直接的选择我个人是比较偏好if else啦 switch你还要想一下冒号换行 以及里面如果要宣告变量可能会有什么麻烦
作者: lsd25968 (cookie)   2025-09-08 16:34:00
这边switch case很合理吧 每个事件都是平等的话 如果一
作者: kirimaru73 (雾丸)   2025-09-08 16:34:00
当然你内容够简单的话用哪个都没差
作者: llabc1000 (野生的攻城獅)   2025-09-08 16:35:00
只要她会动,那就没问题。
作者: kirimaru73 (雾丸)   2025-09-08 16:35:00
50个case和50个else if其实看起来也差不多case里面宣告变量反而还稍微有点问题
作者: shallreturn (千本鸟居)   2025-09-08 16:35:00
菜鸡觉得用switch 很美(X
作者: npc776 (二次元居民)   2025-09-08 16:35:00
牛用奶头走路.gif
作者: vios10009 (vios10009)   2025-09-08 16:37:00
至少不是用if else 外加 goto
作者: clh960524 (CLH)   2025-09-08 16:38:00
我倒是觉得是用 X-macro 加上 array,之后套 switch-case这样只要维护 X-macro 就好
作者: kirimaru73 (雾丸)   2025-09-08 16:41:00
以这张图来说 只知道是跟这50个弹珠台零件有关的判断
作者: FertilizerN (七星破军迅送头)   2025-09-08 16:41:00
If it works, it works
作者: ltytw (ltytw)   2025-09-08 16:47:00
用switch会好读吗
作者: NightDream08 (夜梦ND)   2025-09-08 16:50:00
这个的关键不是在switch,而是"巨型"。无论什么程式码你只要听到某个"巨型"的东西(不管那东西是条件判断还是函式还是其他的什么),那通常都会让人类一个头两个大,就这样。
作者: ULTIMGBK (幻杀)   2025-09-08 16:51:00
看起来就是球跟场地有互动就来跑这个switch 简单粗暴 比什么不小心搜寻到整个包包造成卡顿 还是什么你看这颗石头有几百万面但优化0分 拍卖太多人用会坏掉 好很多
作者: YeaPa (叶胖)   2025-09-08 16:51:00
我猜碰触物件之后该物件会触发一个共同event,而不是每个物件有独立的event,然后再从参数里面带物件的编号,所以后面的handler用switch case去处理,如果是这样的话那会比if else好很多,包括效能的部分
作者: npc776 (二次元居民)   2025-09-08 16:52:00
我有点忘记 场上是不是可以多一颗球 这样运作没问题吗
作者: ss218 (大青花鱼)   2025-09-08 16:54:00
那时代的程式语言就差不多那样吧
作者: ymsc30102 (囧脸葱)   2025-09-08 16:54:00
可以三颗噢
作者: EXTECH (EXTECH)   2025-09-08 16:54:00
写得蛮好的啊
作者: Giornno (乔鲁诺.乔三槐)   2025-09-08 16:57:00
至少不是if
作者: ilohoo (ilohoo)   2025-09-08 16:58:00
switch case比if else好读 不过要是能物件化每个物件各自处理碰撞事件会更好扩充
作者: Giornno (乔鲁诺.乔三槐)   2025-09-08 16:58:00
或者是用jumpx跳来跳去的
作者: inte629l   2025-09-08 16:58:00
多球不知道如何设计 handler再传入ball*之类的? 但又要忙多颗球的物理有点忙C++的话有种想套template method XD
作者: EXTECH (EXTECH)   2025-09-08 17:06:00
如果是50物件都有独自物理特性,没毛病啊
作者: whosu (HiHi)   2025-09-08 17:06:00
看他这个图片的案例 switch确实没啥问题 就是很多而已
作者: Pixis (说好不摆烂)   2025-09-08 17:17:00
童年
作者: crazyanight (crazyanight)   2025-09-08 17:28:00
我比较喜欢看if else switch还要找break不过如果内容简单的话确实switch更合理
作者: ao40418 (噗噜噜咕)   2025-09-08 17:34:00
switch控制状态机不是基本到不行吗
作者: edgefish02   2025-09-08 17:51:00
至少不是用goto 大家就要知足 XD
作者: axis0985 (YOO)   2025-09-08 18:03:00
难不成想看到一堆goto吗?
作者: anondog (anon)   2025-09-08 18:27:00
原始访谈 https://youtu.be/Lmi_TuIYXYw拿到手的原始码基本都是组合语言,核心的switch statements还有彩蛋藏在里面,不过访谈没说是什么彩蛋
作者: WiLLSTW (WiLLS)   2025-09-08 18:30:00
没有问题吧 游戏就是一个巨大的状态机
作者: anondog (anon)   2025-09-08 18:32:00
Windows工作管理员也是他写出来的
作者: spfy (spfy)   2025-09-08 18:48:00
这东西开发的时候还 设计模式 物件导向还不是主流吧

Links booklink

Contact Us: admin [ a t ] ucptt.com