[Live in Swift] Vol. 3 球場主角還是附屬棒球隊?球員動作以及多狀態設計

更新 發佈閱讀 4 分鐘

你是本質迷嗎?還是認同棒球隊本來就是附屬的?

在前兩篇的文章中,我們透過簡單的 Swift 語法特性,來實作了一些基本規則。

接下來,我們將目光移回到球場上的主角(?),進一步探討球員在場上的動作,以及如何設計球員的多重狀態。

如果你還沒看過前兩篇,可以先看看:

上週文章發佈後,還是遭受了一點點爬蟲機器人的留言洗版,希望這週不會再遇到,也期待方格子官方能快點處理好。


本篇文章著重於規則及邏輯的部分,若想要做棒球遊戲的設計,需要再考慮更多因素,不適合直接套用。

狀態拆分

我們都知道,同一個球員在場上會有不同的身份,像是投手、打者、跑者、守備球員等,可以執行不同的動作。

如果我們簡單的把球員的行為動作定義如下:

這樣看似沒問題,但是當程式在執行的時候,我們會發現球員在場上可以執行任何動作,這樣的設計會讓球員的行為變得非常混亂。

像是投手可以打擊、捕手可以跑壘,這樣的設計明顯違反了棒球規則。因此,我們需要將球員的行為動作拆分成不同的狀態,並且讓球員在場上只能執行符合其狀態的動作。為了讓球員能在場上切換不同身份,我們預先為每種狀態建立獨立結構,避免角色混淆,也能確保只有符合條件的球員能執行該狀態的動作。


投手:投球動作

首先我們先來設計投手狀態的行為,先不談球投出去之後的結果(打擊、捕逸、暴投、投手犯規),只談投手出手的動作就好:

我們先用 PitchType 來表示投手的球種,再用 StrikeZonePosition 來表示投手投球的目標位置。

接著把球種跟位置放到 pitch function 中,然後簡單把投球結果 print 出來,大概會是像


打者/跑者:擊球與跑壘

接下來輪到擊球和跑壘,打者可以擊出不同的球種,並且朝向不同的方向,我們可以先這樣定義:

打者的部分,我們先定義了擊球的形態和方向,並放入 hit function 中,再把結果 print 出來;而跑者的部分,我們透過 Base 定義了各個壘包,並實作了各種進/退壘的動作,再把結果 print 出來。

這樣子使用方式就會像:


守備:接球與傳球

守備的部分,我們在第一篇已經先用 FieldPosition 定義了守備位置,就不再重複定義。

我們簡單實作一個 DefenderState 來表示守備球員的狀態,並放入 catchBall 和 throwTo 兩個簡單的 function ,再把結果 print 出來。


多重狀態的切換

在實際比賽中,球員可能同時具備多重狀態:

  • 擔任打者準備打擊
  • 上壘後變成跑者
  • 防守時成為野手或捕手等角色

我們將這些狀態獨立成四種 State,並在 Player 中透過 PlayerState 來表示球員的當前狀態,利用 enum 的特性,讓球員在場上可以自由切換不同的狀態。

透過這樣的設計,在實際使用的時候,我們可以這樣:


本篇文章我們透過不同的狀態,設計了球員在場上的不同動作行為,並且透過不同狀態間的切換,來避免程式在執行時呼叫錯誤的狀態。

因此便不會出現像是,在投手丘上做出打擊動作,或是捕手蹲著在跑壘的狀況。

還有哪些球場上的狀態或動作你想要了解嗎?留言告訴我!

如果覺得這篇文章對你有幫助,也歡迎分享給更多人知道,或者還有想了解的 Swift 技巧,也歡迎留言告訴我!我們下次再見囉!!!

本篇文章程式碼部分由 AI 輔助產生。

留言
avatar-img
Rice把拔的生活與開發筆記
0會員
26內容數
這裡是我的開發與生活筆記。 分享iOS開發經驗、教學技巧,也記錄生活中的點滴與觀察。 偶爾來點評論,輕鬆聊聊技術與日常。
2025/05/13
本文介紹了 Swift 中的 OptionSet,以棒球佔壘狀況為例,說明如何優雅地表示多個選項的組合。透過簡單實際的案例,幫助讀者深入淺出的了解優雅的 OptionSet。
Thumbnail
2025/05/13
本文介紹了 Swift 中的 OptionSet,以棒球佔壘狀況為例,說明如何優雅地表示多個選項的組合。透過簡單實際的案例,幫助讀者深入淺出的了解優雅的 OptionSet。
Thumbnail
2025/05/06
以淺顯易懂的棒球規則,深入淺出地介紹 Swift 中 Enum 的特性,以及透過實例解說,讀者能學習如何用 Enum 來表示資料,並提升程式碼結構和可讀性。
Thumbnail
2025/05/06
以淺顯易懂的棒球規則,深入淺出地介紹 Swift 中 Enum 的特性,以及透過實例解說,讀者能學習如何用 Enum 來表示資料,並提升程式碼結構和可讀性。
Thumbnail
2025/05/02
學習Swift,並從生活中的小角落開始探索蘋果的創新與靈感。本系列文章提供豐富的案例,幫助開發者輕鬆理解Swift特性與語法,並提升團隊溝通效率。
Thumbnail
2025/05/02
學習Swift,並從生活中的小角落開始探索蘋果的創新與靈感。本系列文章提供豐富的案例,幫助開發者輕鬆理解Swift特性與語法,並提升團隊溝通效率。
Thumbnail
看更多
你可能也想看
Thumbnail
vocus 慶祝推出 App,舉辦 2026 全站慶。推出精選內容與數位商品折扣,訂單免費與紅包抽獎、新註冊會員專屬活動、Boba Boost 贊助抽紅包,以及全站徵文,並邀請你一起來回顧過去的一年, vocus 與創作者共同留下了哪些精彩創作。
Thumbnail
vocus 慶祝推出 App,舉辦 2026 全站慶。推出精選內容與數位商品折扣,訂單免費與紅包抽獎、新註冊會員專屬活動、Boba Boost 贊助抽紅包,以及全站徵文,並邀請你一起來回顧過去的一年, vocus 與創作者共同留下了哪些精彩創作。
Thumbnail
創業者常因資金困境而無法抓住機會,利用房產活化讓二胎房貸成為財務策略的有力夥伴。 諮詢國峯厝好貸的二胎房貸服務,讓你的房子成為你最強力的天使投資人,推動事業成長。
Thumbnail
創業者常因資金困境而無法抓住機會,利用房產活化讓二胎房貸成為財務策略的有力夥伴。 諮詢國峯厝好貸的二胎房貸服務,讓你的房子成為你最強力的天使投資人,推動事業成長。
Thumbnail
  接續上一篇文章,或許有人會問說:這樣不是很奇怪嗎?明明是有支持的隊伍,為何要連自己不喜歡的隊伍也一起加油?而月光的回答是,那是因為把眼光放遠來看,如果兩隊的比賽十分精彩,是那是不是對整個球隊的聯盟有益?可以之後辦更好的球賽呈現給球迷。更甚者,推廣這一種球類,無論是棒球或籃球還是排球等
Thumbnail
  接續上一篇文章,或許有人會問說:這樣不是很奇怪嗎?明明是有支持的隊伍,為何要連自己不喜歡的隊伍也一起加油?而月光的回答是,那是因為把眼光放遠來看,如果兩隊的比賽十分精彩,是那是不是對整個球隊的聯盟有益?可以之後辦更好的球賽呈現給球迷。更甚者,推廣這一種球類,無論是棒球或籃球還是排球等
Thumbnail
2019年末追星,最後的Lamigo...,一日店長活動與Lamigo桃猿道別...重新整理這些關於棒球的珍貴與美好的故事,讓更多人看見。
Thumbnail
2019年末追星,最後的Lamigo...,一日店長活動與Lamigo桃猿道別...重新整理這些關於棒球的珍貴與美好的故事,讓更多人看見。
Thumbnail
一直想要跟大家分享一個很棒的Facebook粉絲專頁【棒球狂之詩】,忘了從什麼時候,開始可能因為大數據推播開始看到【棒球狂之詩】的分享,版主分享了許多球迷和棒球的動人故事,歡迎大家追蹤分享! 粉專簡介「分享棒球的收藏品 棒球的記憶 及最新的棒球消息」
Thumbnail
一直想要跟大家分享一個很棒的Facebook粉絲專頁【棒球狂之詩】,忘了從什麼時候,開始可能因為大數據推播開始看到【棒球狂之詩】的分享,版主分享了許多球迷和棒球的動人故事,歡迎大家追蹤分享! 粉專簡介「分享棒球的收藏品 棒球的記憶 及最新的棒球消息」
Thumbnail
大家好!我們是丹尼爾室內棒球訓練場 將推出一個全新的活動
Thumbnail
大家好!我們是丹尼爾室內棒球訓練場 將推出一個全新的活動
Thumbnail
「這些人不一定是球員,但他們的人生已經與棒球分不開了......」每個愛棒球的人,都有著動人的堅持!一直覺得,「棒球」是最貼近人生的運動!從這些故事裡,找到面對人生挑戰的勇敢和希望!
Thumbnail
「這些人不一定是球員,但他們的人生已經與棒球分不開了......」每個愛棒球的人,都有著動人的堅持!一直覺得,「棒球」是最貼近人生的運動!從這些故事裡,找到面對人生挑戰的勇敢和希望!
Thumbnail
這篇文章描述了通過參與足球活動,對自己的身心健康以及生活的展望。作者分享了高中時期運動的快樂時光和對運動的回憶,這不僅是一篇對運動和健康的一個讚歎,也是對運動激發正能量和正向生活態度的倡導。
Thumbnail
這篇文章描述了通過參與足球活動,對自己的身心健康以及生活的展望。作者分享了高中時期運動的快樂時光和對運動的回憶,這不僅是一篇對運動和健康的一個讚歎,也是對運動激發正能量和正向生活態度的倡導。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News