[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
留言分享你的想法!
avatar-img
Rice把拔的生活與開發筆記
0會員
19內容數
這裡是我的開發與生活筆記。 分享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
創作者營運專員/經理(Operations Specialist/Manager)將負責對平台成長及收入至關重要的 Partnership 夥伴創作者開發及營運。你將發揮對知識與內容變現、影響力變現的精準判斷力,找到你心中的潛力新星或有聲量的中大型創作者加入 vocus。
Thumbnail
創作者營運專員/經理(Operations Specialist/Manager)將負責對平台成長及收入至關重要的 Partnership 夥伴創作者開發及營運。你將發揮對知識與內容變現、影響力變現的精準判斷力,找到你心中的潛力新星或有聲量的中大型創作者加入 vocus。
Thumbnail
  接續上一篇文章,或許有人會問說:這樣不是很奇怪嗎?明明是有支持的隊伍,為何要連自己不喜歡的隊伍也一起加油?而月光的回答是,那是因為把眼光放遠來看,如果兩隊的比賽十分精彩,是那是不是對整個球隊的聯盟有益?可以之後辦更好的球賽呈現給球迷。更甚者,推廣這一種球類,無論是棒球或籃球還是排球等
Thumbnail
  接續上一篇文章,或許有人會問說:這樣不是很奇怪嗎?明明是有支持的隊伍,為何要連自己不喜歡的隊伍也一起加油?而月光的回答是,那是因為把眼光放遠來看,如果兩隊的比賽十分精彩,是那是不是對整個球隊的聯盟有益?可以之後辦更好的球賽呈現給球迷。更甚者,推廣這一種球類,無論是棒球或籃球還是排球等
Thumbnail
2019年末追星,最後的Lamigo...,一日店長活動與Lamigo桃猿道別...重新整理這些關於棒球的珍貴與美好的故事,讓更多人看見。
Thumbnail
2019年末追星,最後的Lamigo...,一日店長活動與Lamigo桃猿道別...重新整理這些關於棒球的珍貴與美好的故事,讓更多人看見。
Thumbnail
一直想要跟大家分享一個很棒的Facebook粉絲專頁【棒球狂之詩】,忘了從什麼時候,開始可能因為大數據推播開始看到【棒球狂之詩】的分享,版主分享了許多球迷和棒球的動人故事,歡迎大家追蹤分享! 粉專簡介「分享棒球的收藏品 棒球的記憶 及最新的棒球消息」
Thumbnail
一直想要跟大家分享一個很棒的Facebook粉絲專頁【棒球狂之詩】,忘了從什麼時候,開始可能因為大數據推播開始看到【棒球狂之詩】的分享,版主分享了許多球迷和棒球的動人故事,歡迎大家追蹤分享! 粉專簡介「分享棒球的收藏品 棒球的記憶 及最新的棒球消息」
Thumbnail
大家好!我們是丹尼爾室內棒球訓練場 將推出一個全新的活動
Thumbnail
大家好!我們是丹尼爾室內棒球訓練場 將推出一個全新的活動
Thumbnail
「這些人不一定是球員,但他們的人生已經與棒球分不開了......」每個愛棒球的人,都有著動人的堅持!一直覺得,「棒球」是最貼近人生的運動!從這些故事裡,找到面對人生挑戰的勇敢和希望!
Thumbnail
「這些人不一定是球員,但他們的人生已經與棒球分不開了......」每個愛棒球的人,都有著動人的堅持!一直覺得,「棒球」是最貼近人生的運動!從這些故事裡,找到面對人生挑戰的勇敢和希望!
Thumbnail
這篇文章描述了通過參與足球活動,對自己的身心健康以及生活的展望。作者分享了高中時期運動的快樂時光和對運動的回憶,這不僅是一篇對運動和健康的一個讚歎,也是對運動激發正能量和正向生活態度的倡導。
Thumbnail
這篇文章描述了通過參與足球活動,對自己的身心健康以及生活的展望。作者分享了高中時期運動的快樂時光和對運動的回憶,這不僅是一篇對運動和健康的一個讚歎,也是對運動激發正能量和正向生活態度的倡導。
Thumbnail
包括職業棒球隊、社會棒球隊,再到高中黑豹旗棒球比賽,我們知道一年會有超過200支球隊參與棒球比賽爭取最高榮譽。然而身為棒球迷,我們經常會看到球員在訓練與比賽時將球棒打斷,而這些斷棒都被丟棄了嗎?還是有重新再獲得利用的機會呢?於是,我開啟了一連串的研究與實驗...
Thumbnail
包括職業棒球隊、社會棒球隊,再到高中黑豹旗棒球比賽,我們知道一年會有超過200支球隊參與棒球比賽爭取最高榮譽。然而身為棒球迷,我們經常會看到球員在訓練與比賽時將球棒打斷,而這些斷棒都被丟棄了嗎?還是有重新再獲得利用的機會呢?於是,我開啟了一連串的研究與實驗...
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News