關(guān)于老爹漢堡店的自動化流程分析與總結(jié)
SorrowEngine
老爹漢堡店是一個較為簡單的益智模擬經(jīng)營游戲,主要內(nèi)容是為顧客制作漢堡。其中主要分為三個界面:點餐,烤肉和搭建界面。每個顧客會根據(jù)這三項內(nèi)容進(jìn)行評分,并且根據(jù)分?jǐn)?shù)和顧客等級給予小費。
雖然該游戲的過程較為簡單,但想要完整的規(guī)劃游戲的自動化流程,是有一定難度的。因此該文章主要寫了對于該游戲的分析過程和對于Python進(jìn)行自動化控制的部分原理分析。
1 研究的工具及游戲介紹
該程序運行環(huán)境為Windows11+Adobe?Flash?Player34+1920*1080分辨率屏幕放大+papasburgeria2.0原始版本+Windows導(dǎo)航欄在下方。
1.1?鼠標(biāo)的自動控制
該程序使用的是pyautogui庫,該庫可以通過調(diào)用函數(shù)達(dá)到鼠標(biāo)移動,點擊,拖動等多個功能。同時,該python庫也支持對于特定圖片進(jìn)行判斷。如果通過引入opencv庫,還可以設(shè)置一定的識別容錯率,從而消解因為截圖和圖像裁剪處理而造成的圖像變化和游戲放大后所造成的圖像不一致問題。
需要注意pyautogui在識別時會耗費大量的時間,有幾種方案可供緩解:
①設(shè)置為灰度圖識別模式,但是在識別花紋不明顯的物體(比如芝士片)和形狀相同但顏色不同的物體(比如四種醬料)時判斷效果很差,因此不采用。
②使用準(zhǔn)確的圖片進(jìn)行查找,不使用opencv進(jìn)行相似查找。問題在于在圖像放大時本身可能會變形,并且在截圖時的顏色變化難以避免,因此難以獲取準(zhǔn)確圖片,可能造成漏判,因此不采用。
③通過限定判斷區(qū)域的方式進(jìn)行判斷。可以加快判斷速度,但是需要確定合適的判斷范圍,以免造成漏判。
綜合考慮下,目前主要通過限定判斷區(qū)域的方式進(jìn)行判斷。
1.2 數(shù)據(jù)儲存
在數(shù)據(jù)儲存中,選用了較為簡單的CSV文件,對每一個顧客的正確點單進(jìn)行儲存,方便管理。
1.3 游戲介紹
在點餐過程中,點餐等待時間過程和出餐等待時間過長都會造成扣分。其中點餐等待時間的扣分相對出餐等待時間的扣分相對要更嚴(yán)苛一些。在出餐等待時,可以通過顧客掙來的錢進(jìn)行海報張貼和物品購買(如報紙,電視,咖啡機,游戲機等),可以適當(dāng)延長出餐時的等待時間扣分時長。
在烤肉界面,主要影響因素有三個:烤肉的程度(即三分熟,五分熟,七分熟,在游戲中標(biāo)注為藍(lán)色,黃色和紅色,后文用“藍(lán)色烤肉”“黃色烤肉”“紅色烤肉”替代。在烤肉過程中,還需要注意烤肉的均勻程度??救獾木鶆虺逃擅恳幻娴目局茣r長決定,兩面均為50%烤制時間分?jǐn)?shù)最高??救獾臏囟纫矔斐奢^大的影響??救鉁囟仍礁?,分?jǐn)?shù)越高??梢酝ㄟ^道具購買保溫?zé)粢詼p緩烤肉的冷卻速度。
在出餐界面,主要影響因素為出餐內(nèi)容是否符合點餐順序和漢堡搭建是否偏離中心。只有在三個方面均得到100分,最終結(jié)果才能為100分,可以說要求很嚴(yán)格,人的手工操作也很難做到這一點。這次我希望通過電腦達(dá)到控制游戲自主游玩,并且達(dá)到全100分的效果。

2 各方法過程分析
為了直觀地了解和分析每種方法的流程和效率,采用了流程圖+甘特圖的方法對每種方法進(jìn)行分析。
在分析之前我們假設(shè):
每個顧客點餐和出餐的時間均為15秒;每20秒進(jìn)店一位顧客;界面切換/烤肉翻面等微小時間忽略不計;每一小格為5秒;烤肉行為烤肉的時間統(tǒng)計,藍(lán)色,黃色,紅色分別代表三種烤肉的時間;顧客行,紫色為等待點餐時間,綠色行為等待出餐時間。
2.1 第一版方案
在第一次實驗中,本人采用了“先烤肉,后出單”的方案,優(yōu)點是功能簡單,編寫方便,并且能夠比較正常的使用。
?


2.2 第二版方案
第一種方法存在比較大的缺陷:
每次烤肉的量是固定的,因此當(dāng)某一種肉的需求過大時,可能會導(dǎo)致烤肉數(shù)量不足而出現(xiàn)問題。對于該問題,通過在出餐時,若發(fā)現(xiàn)某種烤肉不夠,則重新喚起對應(yīng)的烤肉界面得以解決。
但是,既然可以做到在烤肉時重新調(diào)用烤肉界面,那么為什么不放棄一開始的烤肉內(nèi)容,而是直接通過出餐界面的調(diào)用解決問題呢?于是在刪除了起始烤肉的設(shè)置后,從理論和實踐的角度,都可以發(fā)現(xiàn)效率有了微弱的提高。



2.3 第三版方案
但這種情況顯然不是設(shè)計的最優(yōu)解。通過個人實踐我們可以發(fā)現(xiàn),三種烤肉的翻面/出餐間隔時間約為15/30/45秒,在原來的程序中,我們沒有合理利用這一部分時間,從而導(dǎo)致了效率的降低。因此我們自然想到了在等待烤肉的時間內(nèi)接收顧客的點餐。但是隨之而來的也幾個問題:
烤肉的等待時間是否能夠支持一個顧客的點餐?是否會因為顧客的點餐而導(dǎo)致烤肉的時間超時?
對此我的方案是,為了提高效率,先暫時犧牲一部分烤肉的時間,同時將點餐時間設(shè)置計時,如果沒有超出15秒的時間,則可以等待剩下的時間后正常翻面/移出。若超出了正常的間隔時間,則將錯就錯,按照原先的預(yù)想翻面/移出。經(jīng)過實驗發(fā)現(xiàn),顧客點餐的時間約為12-15秒之間,如果點餐長度較短則可以比較準(zhǔn)確的的占有預(yù)定時間,但是若點餐長度較長則沒有辦法繼續(xù)承擔(dān)。
可以看到,在采取該種方法后,烤肉的效率得到了進(jìn)一步提高,在整體的時間上得到了大幅的縮短,但是由于只點餐不出單,導(dǎo)致顧客在點餐后等待和排隊時間增長,從而在等待時間也會降低分?jǐn)?shù)。
同時我們也意識到,如果烤肉之間的時間可以被合理利用,那么通過出單回調(diào)點單的方法會對點單顧客的等待時間變長,從而不利于分?jǐn)?shù)。因此,我們又改回了原先先烤肉+回調(diào)烤肉的流程,使得點餐人員的等待時間進(jìn)一步縮小。這也是一個比較完整的解決方案。


圖七 第三版甘特圖-1

2.4 第四版方案
但是顯然顧客的等待時間過長,這會對等待時間的分?jǐn)?shù)造成極大的影響。為了改善點餐時間等待過長的狀況,我們打算利用烤肉的時間進(jìn)行點餐的同時,也合理的進(jìn)行出餐。
但是有一個問題需要解決:點餐隨時可以,但是出餐則需要對應(yīng)的肉已經(jīng)燒制完成,如果沒有燒制完成的就出單的話,會觸發(fā)回調(diào)烤肉的情況,從而出現(xiàn)程序錯誤。因此如果需要烤肉的話需要先判斷該種肉是否燒制完成,之后再選擇出單。由于每次烤肉的量較多,該方法暫時不用考慮烤肉之后的數(shù)量是否充足。由于點餐等待的扣分相對較嚴(yán)苛,因此我選擇了先點餐,后出餐的形式,如果沒有點餐的人員,再判斷是否有合適的出餐人員,之后按照“先來后到”的判斷方法出餐。這種方法對于不同的顧客要求組合也會有不同的效率形式。對于正常的藍(lán)-黃-紅模式,效率會相對較高,但是對于紅-黃-藍(lán)模式,由于之前堆積大量訂單,會導(dǎo)致效率有所降低。
?



2.5 第五版方案
從圖中我們可以看到還有一個小問題需要解決:即在由于之前的順序模式,導(dǎo)致在烤肉時為先點單,而在烤肉結(jié)束后,會變成先出餐,這會導(dǎo)致之前積壓的點單會集體出餐,會給后面的顧客極長的等待時間。
同時也有一個問題:烤肉是受溫度影響的??救饨Y(jié)束后,后面的顧客如使用了放置較長時間的藍(lán)色烤肉,則會因為溫度降低而導(dǎo)致扣分增加。
我們對于這兩種問題的解決方案是,讓烤肉在整個事件內(nèi)開啟循環(huán),在烤肉過程中本身已經(jīng)具有了完整的判斷出餐/點餐的系統(tǒng),可以完整的滿足顧客的需求。若開啟循環(huán),則可以讓烤肉溫度更高的同時,解決點餐和出餐的順序問題。這種方案對于后幾名顧客來說是一種較大的提升。



2.6 第六版方案
但是在這種模式成功以后,分?jǐn)?shù)卻還是不理想。于是我們還需要采取其他方案來解決問題。
一開始,我想到了烤肉爐的利用效率問題。由于藍(lán)色烤肉和紅色烤肉的需求量不大,因此這兩種烤肉只占了半個烤肉爐,同時也是為了烤肉的堆積數(shù)量考慮,若烤肉過多則會出現(xiàn)展開欄,導(dǎo)致烤肉不好定位,從而造成編程上的復(fù)雜。
但是我們可以考慮在烤制紅色烤肉的同時烤制藍(lán)色烤肉,每個爐子各占一半,這樣就可以使烤肉爐利用率提高,同時可以縮短等待紅色烤肉的人的等待時間。
在后來,我想到了更為提升效率的解決方法,將三種烤肉放置在同一個爐子里進(jìn)行燒烤。由于藍(lán)色烤肉的翻轉(zhuǎn)時間間隔為15秒,黃色為30秒,紅色為45秒,而最終時間則為30,60,90秒,想要對這三種烤肉進(jìn)行不間斷的統(tǒng)一燒烤,就必須想好每一次循環(huán)需要的時間。經(jīng)過推算后,我發(fā)現(xiàn)這本身是一個尋找最小公倍數(shù)的問題。30/60和90的最小公倍數(shù)是180,也就是說可以通過180秒的時間對烤肉進(jìn)行一次循環(huán)控制,其中藍(lán)色烤肉燒制6次,黃色燒制3次,紅色燒制兩次。這樣可以在最大程度上保證烤肉的溫度,提升顧客的分?jǐn)?shù)。這種方法已經(jīng)基本上達(dá)到了該游戲的理論效率最高值,但是在實際中還有一些小問題需要解決。
?



2.7 總計圖

由此我們可以看出,在逐漸優(yōu)化的過程中,在整體時間逐漸減少的同時,顧客的等待時間也在逐漸減少,可見優(yōu)化方案是有效的。

3 實踐問題
3.1 點餐問題
點單偶爾會出現(xiàn)99分的情況,通過判斷是由于點餐人數(shù)數(shù)量過多,從而導(dǎo)致沒有機會出餐,導(dǎo)致等候出餐人數(shù)積壓。因此之后會改為單數(shù)大于等于4張時優(yōu)先先部分出餐。
3.2 漢堡搭建問題
漢堡搭建的分?jǐn)?shù)有所降低。漢堡為了在漢堡搭建的準(zhǔn)確度上提高,我統(tǒng)計了該游戲所有44位顧客的點餐需求,并根據(jù)識別結(jié)果在點餐人群中找到最匹配的進(jìn)行使用。這修補了由于識別不準(zhǔn)而帶來的用料不正確的問題。
44位顧客在經(jīng)過匹配修正之后,正確率是否能夠比之前更高呢?通過長期觀察發(fā)現(xiàn),漢堡識別的錯誤一般為1個,因此,只要每個顧客之間的識別差異大于等于三,那么基本可以保證識別的正確率。因此在統(tǒng)計之后,漢堡差異小于3的顧客只有2對,這說明匹配錯誤的幾率是很小的。


最終統(tǒng)計結(jié)果:

關(guān)于搭放漢堡偏離中心扣分的問題,我假設(shè)每個人對于漢堡的搭放沒有所謂“寬容度”的區(qū)分,而是通過物品偏移程度及便宜量進(jìn)行綜合計算。通過統(tǒng)計我發(fā)現(xiàn),只要是?含有芝士或醬料(不包含黃醬)的內(nèi)容,在我的電腦上都會扣分,而所有這些內(nèi)容都不包含的點單要求,基本都可以獲得滿分。于是我嘗試對于這些特殊的內(nèi)容進(jìn)行像素級調(diào)整和修改。

3.3 烤肉問題
由于追求15秒的翻面時間,點餐和出餐的時間需要有一定的提速。對于整個流程我進(jìn)行的全方位的分析,并作出了如下修改:
3.3.1 點餐識別時間優(yōu)化
對于點餐,由于需要判斷該點餐包含哪種肉類以便于分析,我設(shè)置了在點餐結(jié)束回到大廳時對點單內(nèi)容進(jìn)行判斷。但由于判斷需要一定時間,因此會停頓1-2秒。我通過判斷點餐顧客是否說到“漢堡頂”作為判斷開始的標(biāo)志,利用顧客點餐的時間中進(jìn)行物品的識別,從而最大程度降低識別對于點餐時間的影響。
3.3.2 點餐人員時間優(yōu)化
在點餐過程中,需要對是否有點餐人員進(jìn)行識別,原先的方法是通過對點餐氣泡的識別進(jìn)行判斷,同樣對氣泡的識別也需要消耗一定的時間。我的優(yōu)化方法是先點擊氣泡所對應(yīng)的位置,如果點餐有人就會開始點餐,在之后判斷時候在點餐頁面中,從而達(dá)到判斷效果。如果沒有人點餐,那么在點擊對應(yīng)位置后沒有點單內(nèi)容生成。此時再判斷是否出餐,可以減輕點餐識別所用的0.5-1秒時間,從而部分提升效率。
3.3.3 出餐識別時間優(yōu)化
在出餐時,由于識別的影響同樣需要卡頓1-2秒的時間。由于之間已經(jīng)有了一部分的識別內(nèi)容,再識別內(nèi)容就有些多余,因此設(shè)計了一個二維數(shù)組,將之前識別出的內(nèi)容進(jìn)行保存,待出餐時再進(jìn)行調(diào)用,可以節(jié)省1-2,秒時間,從而使出餐速度更快。
3.3.4 改進(jìn)方案
對于改進(jìn)方案,接下來有以下幾種想法:
①嘗試單獨烤肉查看效果
②進(jìn)行梳理
③去B站搜索正確漢堡的樣子并進(jìn)行對照(沒找到,沒有一個100分的)
④經(jīng)過實驗,和窗口大小無關(guān)

4 解決方案
4.1 游戲分?jǐn)?shù)判斷規(guī)則
一開始我們試圖通過數(shù)據(jù)分析的方式來進(jìn)行偏移的判斷。在排查過程中,發(fā)現(xiàn)只要有芝士或醬料的漢堡基本都為100分,而都沒有的漢堡則大多都為99分。這使我對于芝士和醬料的位置產(chǎn)生了懷疑。于是我將每一種醬料的坐標(biāo)分開判斷,從而部分修復(fù)了問題。但是后來隨著統(tǒng)計越來越多,我們逐漸發(fā)現(xiàn)了一些不符合該規(guī)律的問題。例如一位名為Sue的顧客,她只有西紅柿,肉餅和漢堡頂三種食材,但卻為分。而在之前的判斷種西紅柿和肉餅的位置都是正確的。于是我懷疑可能是出現(xiàn)了累加問題,可能每一個物體都有一定的偏移,累加起來導(dǎo)致偏移量過大從而導(dǎo)致扣分。
由于這種實驗方法過于枯燥且無效,我打算通過另一種方法測確定猜想,即通過一些特殊手段深入了解該游戲的打分機制。
通過判斷與梳理,我發(fā)現(xiàn)該游戲的評分機制如下(所有單位均換算成秒):
等待分?jǐn)?shù) = ?四舍五入(100-點餐等待時間扣分-出餐等待時間扣分)(公式4-1)
點餐等待時間扣分=[點餐等待時間-(點餐理想等待時間+獎勵等待時間)]* (3/10) 或 0
出餐等待時間扣分=[出餐等待時間-(出餐理想等待時間+獎勵等待時間+烤肉時間)]* (3/10) 或 0
點餐理想等待時間 = 25秒
出餐理想等待時間 = 60秒
烤肉時間為17.5 * 2或4或6 秒,取決于所需時間最長的烤肉時間
獎勵等待時間 =?
羅馬諾海報? ? ?2秒
醬汁海報? ? ? ??2秒
素食海報? ? ? ??2秒
披薩海報? ? ? ??2秒
莫奇海報? ? ? ? 2秒
奶酪海報? ? ? ??3秒
漢堡海報? ? ? ??3秒
SnJ海報? ? ? ???3秒
Patty海報? ? ???3秒
Kingsley海報? 2秒
電視? ? ? ? ? ? ? ?4秒
報攤? ? ? ? ? ? ? ? 6秒
Arcade櫥柜? ? 8秒
口香糖機? ? ? ? 3秒
自動點唱機? ? 8秒
咖啡攤? ? ? ? ? ?3秒
?
烤肉分?jǐn)?shù) = 四舍五入(原烤肉分?jǐn)?shù)總和 / 烤肉總數(shù))(公式4-2)
原烤肉分?jǐn)?shù) = 100-(超時/不足時時間)-四舍五入溫度扣分-偏離50%百分比
超時/不足時時間 = 超過/不足預(yù)定時間17.5秒時,每超過1秒扣1分
四舍五入溫度扣分 = [(195-出烤肉爐時間) / 180 或 1] ?* 100
偏離50%百分比 = 例如51%/49%為1,52%/48%為2
?
搭建分?jǐn)?shù) = 四舍五入(100-0.5*錯位比率-0.5*錯位扣分比率-0.1*總偏移量)(公式4-3)
錯位比率 = 點單錯誤數(shù)/顧客總單數(shù)
錯位扣分比率 = 點單錯位數(shù)*75/顧客總單數(shù)
總偏移量 = 與判斷中心偏移超過1像素的偏移量總和
4.2 評分機制分析
根據(jù)該規(guī)則我得知了一些內(nèi)容:
①烤肉最重要的是均勻程度,程序會扣除偏離50的分?jǐn)?shù),如果想要達(dá)到一百分,那么烤肉的兩邊必須為50%才可以。
②烤肉的溫度下降很快,在15秒內(nèi)溫度才不會被扣分,一旦超過十五秒分?jǐn)?shù)就會下降。加熱燈只能緩解溫度下降速度,而并不能增加溫度等待程度。
③烤肉對于時間的要求較為寬裕,紅/黃/藍(lán)烤肉均允許偏離烤肉時間1/8而不扣分,而偏離更多時則會被扣分。點餐等待時間很長短,而出餐等待時間很長,因此盡量先點餐。
4.3 搭建漢堡優(yōu)化
經(jīng)過調(diào)整,我發(fā)現(xiàn)了以下搭建漢堡的問題:
漢堡的得分最高位置不是正中心。這是因為在判斷分?jǐn)?shù)時,程序調(diào)用的是出餐界面的縮略漢堡圖片,而不是搭建界面的大漢堡可能是由于程序設(shè)計失誤,導(dǎo)致判定點的正中心并沒有和確定的漢堡底的正中心對齊,而縮略的漢堡圖片又是由搭建的漢堡圖片得來的,因此相當(dāng)于搭建時的漢堡中心點也不在漢堡的正中心。有趣的是,程序?qū)τ谄x中心點的扣分相當(dāng)嚴(yán)苛,在四舍五入的情況下,如果偏離超過1像素點就會被記錄求和,最終按每偏離一個像素點扣分的標(biāo)準(zhǔn)計算。但是由于設(shè)計問題,不能自由移動的漢堡底本身偏移了個像素點,這導(dǎo)致人的操作只能夠多偏移個像素點,才能夠保證滿分。

該圖為測試時出現(xiàn)的一個例子。從肉眼已經(jīng)可以看出,整個漢堡除下方的漢堡底以外,其他物體的中心都已經(jīng)向左偏移。
在調(diào)試過程中,我發(fā)現(xiàn)芝士是一個特殊的存在:由于我的程序設(shè)計是將鼠標(biāo)移動至物體上,然后拖動至指定位置,但是在改變移動到芝士上的坐標(biāo)時,芝士卻完全沒有移動。后來我意識到由于芝士的形狀和拖出來的形狀不同,這說明了兩者拖出來的不是一種物體。而拖出來的芝士會自動移動到中心位置,所以只有改變芝士拖動到的位置,才能夠改變芝士的最終位置。最終通過調(diào)試和修改,可以保證在搭建環(huán)節(jié)顧客的評分一定為100分。
4.4 烤肉環(huán)節(jié)優(yōu)化理論
在烤肉環(huán)節(jié),如何平衡烤肉溫度,烤肉均勻度,顧客等待時間三者之間的關(guān)系成為了重要的問題。由上述分析我們知道,烤肉對于時間有較強的寬容度,因此我們可以通過延長時間來改善烤肉的均勻度。但是由于烤肉的溫度改變較快,烤肉時間變長會導(dǎo)致烤肉變涼,從而影響分?jǐn)?shù)和顧客等待時間分?jǐn)?shù)。
而縮短烤肉時間,又可能會使得烤肉兩邊時間不均,從而導(dǎo)致烤肉不均,進(jìn)而導(dǎo)致扣分。我們需要找到一個較為合適的中間時間,并且需要進(jìn)行權(quán)衡。
由于游戲的限制和pyautogui的運行速度限制,我們無法做到精確控制時間,從而只能通過統(tǒng)計大致時間的方法進(jìn)行烤肉時間的判斷和改進(jìn)。
通過分析可以知道,在烤肉過程中拖動肉餅所需要的時間較長,如果所拖動的肉餅過多需要花費3-4秒的時間,而給所有肉餅翻面僅需要1-2秒的時間。同時還需要考慮到在翻面過程中烤肉不會進(jìn)行,約有秒的時間差,并且也需要考慮點擊烤肉界面,點擊按鈕等方面的微小時間差距等等。最終我們沒能做出一個完美的烤肉優(yōu)化方案,但是理論上來說全100分是可行的。
5 圖鑒









































