[碼農] 微軟彈珠台是由巨型switch()語句組成

看板C_Chat (希洽)作者 (維亞)時間1天前 (2025/09/08 16:15), 編輯推噓43(43063)
留言106則, 45人參與, 1天前最新討論串1/1
https://reurl.cc/OmeMaR 以下內容轉自臉書(連結如上) https://files.catbox.moe/0pu43a.png
前幾日微軟工程師 Dave W Plummer 分享 當初微軟推出新的作業系統 Windows NT 後 要把立體彈珠台 (Pinball) 這個內建遊戲改寫到新的作業系統 於是被交派這個任務的他看了原本的程式碼 結果發現是一個超級巨型的 swtich() 語句 底下有超過五十個 case 所組成 ----- Sent from MeowPtt on my SH-M28 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 101.9.200.133 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/C_Chat/M.1757319319.A.D4A.html

09/08 16:16, 1天前 , 1F
不能亂動了
09/08 16:16, 1F

09/08 16:16, 1天前 , 2F
至少他還有用Switch而不是if else
09/08 16:16, 2F

09/08 16:16, 1天前 , 3F
switch也沒很亂吧 總比把東西亂放好
09/08 16:16, 3F

09/08 16:16, 1天前 , 4F
可以想像只是有點失望
09/08 16:16, 4F

09/08 16:17, 1天前 , 5F
很合理啊 都是用球去撞
09/08 16:17, 5F

09/08 16:17, 1天前 , 6F
switch成五十塊反而可以讓每塊的深度不要太深
09/08 16:17, 6F

09/08 16:17, 1天前 , 7F
然後發現第一個case永遠為true
09/08 16:17, 7F

09/08 16:18, 1天前 , 8F
巨型狀態機 這不是很棒嗎?
09/08 16:18, 8F

09/08 16:18, 1天前 , 9F
1993年欸,那個時候上課都在用組語
09/08 16:18, 9F

09/08 16:18, 1天前 , 10F
永遠true更爽了 剩下49條砍掉都不怕出事= =
09/08 16:18, 10F

09/08 16:19, 1天前 , 11F
用switch已經是高階語言了
09/08 16:19, 11F

09/08 16:19, 1天前 , 12F
好奇那個年代可以呈現出那樣的彈珠彈跳感算是很厲
09/08 16:19, 12F

09/08 16:19, 1天前 , 13F
害嗎?那時有物理引擎之類的東西了?
09/08 16:19, 13F

09/08 16:19, 1天前 , 14F
那個誰跟你說你應該總是使用if else還出了本書
09/08 16:19, 14F

09/08 16:19, 1天前 , 15F
至少不是寫成巢狀if else
09/08 16:19, 15F

09/08 16:20, 1天前 , 16F
二維運動反彈加個重力 不算太複雜
09/08 16:20, 16F

09/08 16:20, 1天前 , 17F
狀態機 沒有問題
09/08 16:20, 17F

09/08 16:20, 1天前 , 18F
還有什麼更好的寫法嗎?願聞其詳
09/08 16:20, 18F

09/08 16:22, 1天前 , 19F
以彈珠台這例子來說,用switch沒有什麼不好吧?
09/08 16:22, 19F

09/08 16:22, 1天前 , 20F
if else if else if else if else if else if else
09/08 16:22, 20F

09/08 16:27, 1天前 , 21F
至少比全都if好很多了
09/08 16:27, 21F

09/08 16:27, 1天前 , 22F
這個案例寫50個case或50個if else都算是合理用法
09/08 16:27, 22F

09/08 16:27, 1天前 , 23F
任天堂又贏
09/08 16:27, 23F

09/08 16:27, 1天前 , 24F
switch有一些比較奇怪的規則要注意 你想要穩一點就寫
09/08 16:27, 24F

09/08 16:28, 1天前 , 25F
50個if else然後都用{}框好 有人要叫就隨便他叫
09/08 16:28, 25F

09/08 16:28, 1天前 , 26F
不然要一堆if else 喔 最後的判斷要把前面全都跑過
09/08 16:28, 26F

09/08 16:29, 1天前 , 27F
寫到50我猜是用來判斷撞到什麼 現代可能寫成物件吧
09/08 16:29, 27F

09/08 16:29, 1天前 , 28F
if else要判斷的只有if裡面的東西啊 switch一樣要比較
09/08 16:29, 28F

09/08 16:30, 1天前 , 29F
如果那50個東西被彈珠撞的反應有明顯的樹狀結構
09/08 16:30, 29F

09/08 16:30, 1天前 , 30F
不過邏輯如果不複雜用switch也沒差
09/08 16:30, 30F

09/08 16:30, 1天前 , 31F
那就會寫成樹狀if else了 不過我也不是做這遊戲的
09/08 16:30, 31F

09/08 16:31, 1天前 , 32F
只是在這裡聽到switch這種程設課前幾堂就學到的東西覺得
09/08 16:31, 32F

09/08 16:31, 1天前 , 33F
有點奇怪而已。身為微軟的程式猿沒有更神奇的寫法嗎…
09/08 16:31, 33F

09/08 16:31, 1天前 , 34F
如果處理50種碰撞都是相異的小事 那並列沒什麼問題
09/08 16:31, 34F

09/08 16:31, 1天前 , 35F
能寫的簡單幹嘛複雜化
09/08 16:31, 35F

09/08 16:32, 1天前 , 36F
彈珠檯本身就是個貼圖碰撞遊戲 不管你是要顯示外觀
09/08 16:32, 36F

09/08 16:33, 1天前 , 37F
還是要處理彈珠碰撞 switch和if else都是最直接的選擇
09/08 16:33, 37F

09/08 16:33, 1天前 , 38F
我個人是比較偏好if else啦 switch你還要想一下冒號
09/08 16:33, 38F

09/08 16:34, 1天前 , 39F
換行 以及裡面如果要宣告變數可能會有什麼麻煩
09/08 16:34, 39F
還有 27 則推文
09/08 16:51, 1天前 , 67F
你看這顆石頭有幾百萬面但優化0分 拍賣太多人用會
09/08 16:51, 67F

09/08 16:51, 1天前 , 68F
壞掉 好很多
09/08 16:51, 68F

09/08 16:51, 1天前 , 69F
我猜碰觸物件之後該物件會觸發一個共同event,而不是每個物
09/08 16:51, 69F

09/08 16:51, 1天前 , 70F
件有獨立的event,然後再從參數裡面帶物件的編號,所以後面
09/08 16:51, 70F

09/08 16:51, 1天前 , 71F
的handler用switch case去處理,如果是這樣的話那會比if el
09/08 16:51, 71F

09/08 16:51, 1天前 , 72F
se好很多,包括效能的部分
09/08 16:51, 72F

09/08 16:52, 1天前 , 73F
我有點忘記 場上是不是可以多一顆球 這樣運作沒問題嗎
09/08 16:52, 73F

09/08 16:54, 1天前 , 74F
那時代的程式語言就差不多那樣吧
09/08 16:54, 74F

09/08 16:54, 1天前 , 75F
可以三顆噢
09/08 16:54, 75F

09/08 16:54, 1天前 , 76F
寫得蠻好的啊
09/08 16:54, 76F

09/08 16:57, 1天前 , 77F
至少不是if
09/08 16:57, 77F

09/08 16:58, 1天前 , 78F
switch case比if else好讀 不過要是能物件化每個物件各自
09/08 16:58, 78F

09/08 16:58, 1天前 , 79F
處理碰撞事件會更好擴充
09/08 16:58, 79F

09/08 16:58, 1天前 , 80F
或者是用jumpx跳來跳去的
09/08 16:58, 80F

09/08 16:58, 1天前 , 81F
多球不知道如何設計 handler再傳入ball*之類的? 但又要
09/08 16:58, 81F

09/08 16:58, 1天前 , 82F
忙多顆球的物理有點忙
09/08 16:58, 82F

09/08 16:59, 1天前 , 83F
C++的話有種想套template method XD
09/08 16:59, 83F

09/08 17:06, 1天前 , 84F
如果是50物件都有獨自物理特性,沒毛病啊
09/08 17:06, 84F

09/08 17:06, 1天前 , 85F
看他這個圖片的案例 switch確實沒啥問題 就是很多而已
09/08 17:06, 85F

09/08 17:17, 1天前 , 86F
童年
09/08 17:17, 86F

09/08 17:28, 1天前 , 87F
我比較喜歡看if else switch還要找break
09/08 17:28, 87F

09/08 17:29, 1天前 , 88F
不過如果內容簡單的話確實switch更合理
09/08 17:29, 88F

09/08 17:34, 1天前 , 89F
switch控制狀態機不是基本到不行嗎
09/08 17:34, 89F

09/08 17:51, 1天前 , 90F
至少不是用goto 大家就要知足 XD
09/08 17:51, 90F

09/08 18:03, 1天前 , 91F
難不成想看到一堆goto嗎?
09/08 18:03, 91F

09/08 18:27, 1天前 , 92F
09/08 18:27, 92F

09/08 18:30, 1天前 , 93F
拿到手的原始碼基本都是組合語言,核心的switch statemen
09/08 18:30, 93F

09/08 18:30, 1天前 , 94F
ts還有彩蛋藏在裡面,不過訪談沒說是什麼彩蛋
09/08 18:30, 94F

09/08 18:30, 1天前 , 95F
沒有問題吧 遊戲就是一個巨大的狀態機
09/08 18:30, 95F

09/08 18:32, 1天前 , 96F
Windows工作管理員也是他寫出來的
09/08 18:32, 96F

09/08 18:48, 1天前 , 97F
這東西開發的時候還 設計模式 物件導向還不是主流吧
09/08 18:48, 97F

09/09 07:29, 1天前 , 98F
說switch沒很亂的是不懂策略模式嗎
09/09 07:29, 98F

09/09 08:10, 1天前 , 99F
到底留言的會是主攻軟工還是嵌入呢?前者台灣蠻罕見了
09/09 08:10, 99F

09/09 08:11, 1天前 , 100F
c的case只能是數值,若他是連續的或可以構造成連續的,
09/09 08:11, 100F

09/09 08:11, 1天前 , 101F
可以用函數指標陣列取代。像是把每個case放到一個個func
09/09 08:11, 101F

09/09 08:11, 1天前 , 102F
tion再把每個function pointer放到fptr_table,code若是
09/09 08:11, 102F

09/09 08:11, 1天前 , 103F
case的數值,則可以一行fptr_table[code]();呼叫。必須
09/09 08:11, 103F

09/09 08:11, 1天前 , 104F
確保code數值一定在0到fptr數量-1之間,現代設備上效能
09/09 08:11, 104F

09/09 08:11, 1天前 , 105F
差不多,但好維護很多。
09/09 08:11, 105F

09/09 08:12, 1天前 , 106F
策略模式喔,用C寫看看啊~
09/09 08:12, 106F
文章代碼(AID): #1elf2NrA (C_Chat)
文章代碼(AID): #1elf2NrA (C_Chat)